Fórum témák
- • Kondenzátor
- • Hangszórójavítás (otthon)
- • Elfogadnám, ha ingyen elvihető
- • Pneumatika végállások reed kapcsolóval
- • Általános antennás kérdések, válaszok
- • Klíma szervizelés, javítás
- • Internetes rádióvevő
- • Nagyfeszültségű tápegység
- • Alternativ HE találkozó(k)
- • 3D nyomtatás
- • Felajánlás, azaz ingyen elvihető
- • Akkumulátor töltő
- • Elektronikai témájú könyvek újságok
- • Rádióamatőrök topikja
- • LED szalag
- • TDA7294 végerősítő
- • Háromfázisú aggregátor
- • Szintetizátor javítás
- • Dobozolási technikák, műszerdobozok
- • Boombox javítás
- • Sütő javítás
- • Erősítő mindig és mindig
- • Arduino
- • Mosógép vezérlők és általános problémáik
- • Számítógép hiba, de mi a probléma?
- • Laptop javítás, tuning
- • Elektromos távirányítós kapunyitó
- • Autós erősítős kérdések, problémák
- • Mikrohullámú sütő javítás, magnetron csere, stb.
- • Villanymotor
- • Vegyes barkácsfogások
- • Digitális óra
- • Hűtőgép probléma
- • TV hiba, mi a megoldás?
- • Szünetmentes táp javítása, élesztése
- • Erősítő építése elejétől a végéig
- • Műhelyünk felszerelése, szerszámai
- • Kombikazán működési hiba
- • Függvénygenerátor építése
- • SMD, mi a típusa?
- • Hibrid erősítő
- • Suzuki Swift elektronika
- • Videomagnó problémák
- • Érdekességek
- • STK erősítők javítások
- • DC-DC konverter max. kapacitív terhelése
- • Audiofil, High End Audio
- • Központi fűtés (vezérlés)
- • IMI villanymotor
- • Borhűtő vezérlő panel
- • Androidos okos telefonok
- • Klíma beszerelése, fűtés-hűtés házilag
- • Súlymérés
- • Varrógép elektronika
- • Analóg oszcilloszkóp javítása
» Több friss téma
|
Fórum » MSP430 mikrovezérlők
Nem néztem bele ezekbe a programokba.
A Timer beállításoknak van valami speckó egyszerűsített megoldása az energiában? Vagy ez az "F_TIMER" valami definiált változó?
A hangkeltéshez használt időzítő a CPU frekvenciáját 1:8-as előosztással kapja. Így F_CPU = 1 MHZ esetén 1 Hz - 65 kHz a beállítható tartomány (a felső határ szúnyogriasztóhoz is jó), F_CPU = 16 MHz esetén pedig 16 Hz - 1 MHz).
Fentiekhez illeszkedően F_TIMER így van definiálva:
#define F_TIMER (F_CPU/8L)
Köszönöm.
Más!
Adott egy XY változó. Ezt a változót, hogy tudom bit szinten variálni IAR-ban, tehát pl. csak egy adott bitet megváltoztatni, vagy ami most fontos lenne nekem, csak a változó valamelyik bitjét vizsgálni?
Esetleg el lehet valahogy nevezni a változó bitjeit? A hozzászólás módosítva: Dec 4, 2013
Szia,
A logikai műveletekkel megtudod oldani.
- Vagy kapcsolattal bit 1-be állítása. Pl: X |= 0x01 //Első bit egy-be
- És kapcsolattal tudsz törölni bitet. Pl.: Y &= 0x7f // 7.bit törlése
- És művelettel tudsz tesztelni is. Pl.: X &= 0x40 // ha a 6.bit "1-es" akkor az eredmény is "0x40" egyébként '0".
Csak egy ötlet........
Üdv. A hozzászólás módosítva: Dec 4, 2013
Idézet: „Esetleg el lehet valahogy nevezni a változó bitjeit?”
Ebben a hozzászólásban van bitenként matatható típus definiálására példa.
Köszi, menet közben megtaláltam, és átnéztem a io430xy.h fájlt.
Azt viszont nem értem, hogy ha a hozzászólásban lévő definíciót használom, miért nem tudok a változónak értéket adni. Illetve tudok, de csak bitenként. Az viszont nem jó.
Kösz.
Szerintem ennél a megoldásnál maradok. Definiálok 8 bitet, akkor a biteknek is lesz neve, és azt úgy változtatom, vizsgálom ahogy akarom. Legalábbis remélem...
Idézet: „Azt viszont nem értem, hogy ha a hozzászólásban lévő definíciót használom, miért nem tudok a változónak értéket adni.”
Nem tudom, hogy hogyan próbáltad. Így lehet:
#include "io430.h"
typedef unsigned char byte;
typedef union _BYTE
{
byte bajt;
struct
{
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
} bits;
} BYTE;
BYTE blabla;
void main() {
blabla.bajt = 35;
blabla.bits.b2 = 1;
blabla.bits.b5 = 0;
}
Megjegyzés: A nem túl szimpatikus _byte név helyett bajt nevet írtam. De írhatsz bármilyen nevet...
Köszönöm.
Egy kicsit túlbonyolítottam a definíciót, ezért nem működött.
Sziasztok!
Android- MSP430 kommunikációs kísérletnek szánva terveztem egy nagyon egyszerű, PI rendszerű fémkereső kapcsolást. Mostanra elkészült mindkét oldali program is, bár erősen alfa állapotúak még. (Mindazon által működnek.) Kérdésem az lenne, hogy meg tudom e oldani és miképpen, hogy ne kelljen minden méréssorozat után újrainicializálni az ADC-t megszakításban? Eddig nekem nem sikerült, de lehet, hogy csak elnéztem valamit. Itt van lentebb a mikrovezérlő oldali teljes kód. Elnézést a külleme miatt, de még nem végleges, plusz most álltam át teljesen linuxra és geany-ben nem tudok rendesen formáztatni sem. - Meg amúgy is csak egy buta asztalos vagyok.
#include "intrinsics.h"
//sending time-> 48 int -> compressed to 60 byte +start+stop =600bit (0,00000217s/bit)-> 0,001302s
//period>firstDelay+ADC+sending time
//max 600Hz
#define ADCSOROZAT (40) //néggyel osztható legyen
#define PERIOD (20000) //0,0000005S*20000 =10mS min 35Hz~>57143 ;max 600Hz ~> min 3333clk
#define IMPWIDTH (200) //0,0000005S*200=100uS
#define FIRSTDELAY (50) //
#define GETADC (1)
#define GETTEMPERATURE (2)
#define GETSETTINGS (3)
#define SETFREQUENCY (4)
#define SETPULSEWIDTH (5)
#define SETDELAYBEFOREADC (6)
#define SETSAMPLEANDHOLD (7)
#define SETADCDIVIDER (8)
#define SETTEST (11)
#define REDLEDON (9)
#define REDLEDOFF (10)
volatile unsigned int test=0,period=PERIOD,firstDelay=FIRSTDELAY,adcSht=ADC10SHT_0,adcDiv=ADC10DIV_2, impwidth=IMPWIDTH, adcsorozat=ADCSOROZAT, mer[ADCSOROZAT],serialParam=0,serialTemp=0;
volatile char serialCommand=0;
void pakolKuld(){
unsigned char upbits=0;
int i;
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF=68; // Send "D"
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF=(unsigned char)(ADCSOROZAT+(ADCSOROZAT>>2)); // Send data lenght
for (i=0;i<(ADCSOROZAT);i++){
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF=(unsigned char) (mer[i]&0xFF);
upbits|=(unsigned char)(mer[i]>>8);
if ((i+1)%4){
upbits=(upbits<<2); //a felső két bit 2-esével fordított sorrendben mint az alsó 8
}else{
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF =(unsigned char) upbits;
upbits=0;
}
}
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
}
void hom(){
unsigned char upbits=0;
int i,temp,IntDegC;
ADC10CTL0 &=~ENC;
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF='T'; //
ADC10DTC1=0;
ADC10CTL0 = SREF_1+REFON+ADC10ON+ADC10SHT_3;
ADC10CTL1 = INCH_10+ CONSEQ_0+ADC10SSEL_3+ADC10DIV_7;
ADC10CTL0 |= ENC +ADC10SC;
while (ADC10CTL1 & BUSY);
temp = ADC10MEM;
IntDegC = ((temp - 673) * 423) / 1024;
UCA0TXBUF=(char)IntDegC&0x00FF;
while (ADC10CTL1 & BUSY);
ADC10CTL0 &=~ENC;
ADC10DTC1=adcsorozat;
ADC10SA = (int)mer;
ADC10CTL0 = SREF_1+ADC10ON+ADC10SHT_0+ADC10IE;
ADC10CTL1 = INCH_7+ CONSEQ_2+ADC10SSEL_0+ADC10DIV_0+SHS_1+ISSH;
ADC10CTL0 |= ENC +MSC;
}
void main(void){
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= (BIT0); // Set the LEDs on P1.0 as outputs
P1OUT = 0x01;
//init basic clock
BCSCTL1 = CALBC1_16MHZ; // Set DCO
DCOCTL = CALDCO_16MHZ;
BCSCTL3 |= LFXT1S1;
//init UART
P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
P1SEL2 = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
UCA0CTL1 |= UCSSEL_3; // SMCLK
UCA0BR0 =2; // 16MHz 460800
UCA0BR1 = 0; // 16MHz 460800
UCA0MCTL = UCBRS_3+UCBRF_2+UCOS16;
// 1 bit 0,00000217s
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
//init PWM
P1DIR |=BIT6; // Fet, ki,
P1SEL |= BIT6; //TA0 out
P1SEL2&=~(BIT6);
TA0CCR0=period-1;
TA0CCR2=firstDelay; //25uS a mérés előtt
TA0CCR1=TA0CCR0-impwidth;
//TA0CCTL0 = CCIE; //up
TA0CCTL0 =CCIE; //up
TA0CCTL1 = OUTMOD_3; //up
TA0CCTL2= OUTMOD_3; //up
TA0CTL=TASSEL_2|MC_1|TACLR|ID_3|TAIE; //SMCLK->16MHz/8=2Mhz
//init adc
P1DIR&=~BIT7;
//init end
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, interrupts enabled
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void){
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
serialCommand=UCA0RXBUF;
serialParam=0;
while (!(IFG2&UCA0RXIFG));
serialParam|=UCA0RXBUF;
while (!(IFG2&UCA0RXIFG));
serialTemp=UCA0RXBUF;
serialParam|=(serialTemp<<8);
switch (serialCommand) {
case GETADC:
pakolKuld();
break;
case GETTEMPERATURE:
hom();
break;
case GETSETTINGS:
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF='B';
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=(unsigned char)(period&0xFF); // frequency
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=(unsigned char)((period>>8)&0xFF); // frequency
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=(unsigned char)(impwidth&0xFF); // pulse
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=(unsigned char)((impwidth>>8)&0xFF); //
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=(unsigned char)(firstDelay&0xFF); // delay adc
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=(unsigned char)((firstDelay>>8)&0xFF); //
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=(unsigned char)(adcSht&0xFF); // ADC sample and hold time
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=(unsigned char)((adcSht>>8)&0xFF); //
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=(unsigned char)(adcDiv&0xFF); // ADC timer divider
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=(unsigned char)((adcDiv>>8)&0xFF); //
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=(unsigned char)((P1OUT&BIT0)&0xFF); // RedLed
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=(unsigned char)(test&0xFF); // test
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=(unsigned char)((test>>8)&0xFF); //
while (!(IFG2&UCA0TXIFG));
break;
case SETFREQUENCY:
period=serialParam; // frequency
TA0CCR0=period-1;
TA0CCR2=firstDelay; //25uS a mérés előtt
TA0CCR1=TA0CCR0-impwidth;
TA0CCTL0 =CCIE; //up
TA0CCTL1 = OUTMOD_3; //up
TA0CCTL2= OUTMOD_3; //up
TA0CTL=TASSEL_2|MC_1|TACLR|ID_3|TAIE; //SMCLK->16MHz/8=2Mhz
break;
case SETPULSEWIDTH:
impwidth=serialParam; // frequency
TA0CCR1=TA0CCR0-impwidth;
TA0CTL=TASSEL_2|MC_1|TACLR|ID_3|TAIE; //SMCLK->16MHz/8=2Mhz
break;
case SETDELAYBEFOREADC:
firstDelay=serialParam;
TA0CCR2=firstDelay; //kezdeti késleltetés
TA0CTL=TASSEL_2|MC_1|TACLR|ID_3|TAIE; //SMCLK->16MHz/8=2Mhz
break;
case SETSAMPLEANDHOLD:
adcSht=serialParam;
break;
case SETADCDIVIDER:
adcDiv=serialParam;
break;
case REDLEDON:
P1OUT |= BIT0;
break;
case REDLEDOFF:
P1OUT &= ~BIT0;
break;
case SETTEST:
test=serialParam;
break;
}
}
#pragma vector=ADC10_VECTOR
__interrupt void adc_vector(void) {
volatile unsigned char k,i;
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0(void){
ADC10CTL0 &=~ENC;
while (ADC10CTL1 & BUSY); // Wait if ADC10 core is active
ADC10CTL0 &=~ENC;
while (ADC10CTL1 & BUSY);
ADC10AE0 |=INCH_7;
ADC10SA = (int)mer;
ADC10DTC1=adcsorozat;
ADC10CTL0 = SREF_1+ADC10ON+adcSht+REFON+MSC;
ADC10CTL1 = INCH_7+ CONSEQ_2+ADC10SSEL_3+SHS_3+adcDiv;
ADC10CTL0 |= ENC;
}
// Timer A1 interrupt service routine
#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A1(void){
switch (TAIV){
case 2:
break;
case 4:
break;
}
}
Sziasztok!
Adott a következő programrészlet:
while(!(P1IN & BIT3)){
P1OUT = BIT6;
a=a+1;
}
Azt szeretném megtudni, hogy hány órajelciklus alatt hajtódik végre egyszer e fenti programrészlet.
Szeretném kiszámolni hány másodpercig tart amíg "a" értéke mondjuk 50000-ig emelkedik.
Ebben és az előtte levő hozzászólásokból kiderül, hogy az IAR szimulátorban a CPU registers ablakban a CYCLECOUNTER kijelzi a végrehajtott ciklusok számát. A while cikklusba lépésed előtt jegyezd fel az értéket, majd egy ciklus végrehajtása után ismét, s a kettő különbsége a keresett szám.
Szép napot Mindenkinek!
Adott ez a program:
#include <Wire.h>
#define address 0x1E //0011110b, I2C 7bit address of HMC5883
void setup()
{
Serial.begin(9600); // start serial for output
Wire.begin(); // join i2c bus (address optional for master)
//Put the HMC5883 IC into the correct operating mode
Wire.beginTransmission(address); //open communication with HMC5883
//Write CRA (00) – send 0x3C 0x00 0x70 (8-average, 15 Hz default, normal measurement)
Wire.write(0x3c);
Wire.write(0x00);
Wire.write(0x70);
//Write CRB (01) – send 0x3C 0x01 0xA0 (Gain=5, or any other desired gain)
Wire.write(0x3c);
Wire.write(0x00);
Wire.write(0x70);
//Write Mode (02) – send 0x3C 0x02 0x00 (Continuous-measurement mode)
Wire.write(0x3c);
Wire.write(0x02);
Wire.write(0x00);
delay(60);
Wire.endTransmission();
}
void loop()
{
int x,y,z; //triple axis data
//Tell the HMC5883 where to begin reading data
Wire.beginTransmission(address);
Wire.write(0x03); // register 3, X MSB register
Wire.endTransmission();
//Read data each axis, 2 registers per axis
Wire.requestFrom(address, 6);
if(6<=Wire.available()){
x = Wire.read()<<8; //X msb
x |= Wire.read(); //X lsb
z = Wire.read()<<8; //Z msb
z |= Wire.read(); //Z lsb
y = Wire.read()<<8; //Y msb
y |= Wire.read(); //Y lsb
}
//Print out values of each axis
Serial.print("x: ");
Serial.print(x);
Serial.print(" y: ");
Serial.print(y);
Serial.print(" z: ");
Serial.println(z);
delay(100);
}
HMC5883-as 3 tengelyes magnetométer értékeit olvassa ki, és küldi tovább soros porton. A probléma hogy egyszer kiolvas, és utána folyamatosan azokat az értékeket küldi. Tehát ha mondjuk ez jön ki x: 255 y: 156 z: -35, akkor ezt küldi folyamatosan hiába mozgatom a modult. Ha lehúzom az i2c kábelét és visszadugom akkor megint kiolvassa az aktuális értéket, de szintén nem változik utána. Mi lehet a gond?
Nekem ez működött, ha jól látom a különbség az, hogy a printelés is benne van a hurokban.
Nem vagyok még spéci ebben a programozásban, de próbáld ki, hátha jó
void main(void)
{ while(1){
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
RBC = 0;
_EINT();
while ( TI_USCI_I2C_notready() ); // wait for bus to be free
TI_USCI_I2C_transmitinit(0x1E,0x3F); // init transmitting with
while ( TI_USCI_I2C_notready() ); // wait for bus to be free
TI_USCI_I2C_transmit(2,array1); // start transmitting
__delay_cycles(100000);
while ( TI_USCI_I2C_notready() ); // wait for bus to be free
TI_USCI_I2C_transmitinit(0x1E,0x3F); // init transmitting with
while ( TI_USCI_I2C_notready() ); // wait for bus to be free
TI_USCI_I2C_transmit(1,array2); // start transmitting
__delay_cycles(100000);
while ( TI_USCI_I2C_notready() ); // wait for bus to be free
TI_USCI_I2C_receiveinit(0x1E,0x3F); // init receiving with USCI
while ( TI_USCI_I2C_notready() ); // wait for bus to be free
TI_USCI_I2C_receive(6); //store
__delay_cycles(100000);
H = angle * 10;
// P1OUT = 0xC1;
// P1REN |= 0xC1;
// P1DIR = 0xFF;
sw_uart_putc(' ');
sw_uart_putc('0'+(H/1000) % 10); // Ezresek ertekenek kiirasa
sw_uart_putc('0'+(H/100) % 10); // Szazasok ertekenek kiirasa
sw_uart_putc('0'+(H/10) % 10); // Tizesek ertekenek kiirasa
sw_uart_putc(','); // Tizedes vessző
sw_uart_putc('0'+H % 10); // Egyesek ertekenek kiirasa
// sw_uart_putc('\n'); // Kovetkezo sor
// sw_uart_putc('\r'); // Ugras a sor elejere
sw_uart_puts(" Fok\r\n");
__delay_cycles(1000000); // várakozás 0.1 másodpercig
}
}
Köszönöm a választ. Próbálok alkotni valamit. Sajnos azóta se sikerült összehozni.
Üdv!
MSP430G2-vel össze lehet kötni egy ilyet?Ha igen hogy,illetve a program is érdekelne, ehhez a vezérlőhöz hogyan lehet tápot csatlakoztatni?.
Még annyit hogy a H-brigde az ilyen vezérlők esetében csak annyit jelent hogy képes áram irányt váltani?
Esetleg más megoldás van servo vezérlésre? A hozzászólás módosítva: Dec 9, 2013
Idézet: „össze lehet kötni egy ilyet”
Igen, össze. Itt találod a kapcsolási rajzát. Ez alapján, ha a motor nagyobb feszt igényel mint 3.3V, akkor szét kell választani a vezérlő feszültségtől.
Két PWM jellel szépen lehet két kis DC motort vezérelni oda-vissza.
Milyen szervó motort szeretnél vezérelni? GK szervót, vagy RC szervót, vagy CNC szervó motort, vagy....?
Ha RC analóg szervót, akkor nem kell ilyen vezérlő. Oda csak egy "PWM" jel kell meg ~5V. Nézd meg az Energia könyvtárat, abban van szervóvezérlés...
Először is köszönöm a választ.
Másodszor pedig, RC autóból lettek kiszedve a szervók, és azt hogyan lehet megoldani hogy 5V-ot PWM el vezéreljek?Addig eljutottam hogy MSP430G2 ben megirom a programot mikor, meddig, mennyit mozduljon a szervó de hogy az 5V-ot hogyan kapcsolom hozzá?Bocsánat ha nagyon amatőr kérdés,még kezdő vagyok.
Ha sikerült vezérelni a szervót akkor nem kell mást csinálni. Ha teszi a dolgát akkor rendben van.
Én még mindig ott tartok hogy van a vezérlő ,a szervó, és a táp.Hogy kötöm össze úgy hogy a vezérlő adja a jelet és 5V-ot kap a szervó?
Ezt tanulmányozd!
A cikkben is le van írva, de röviden:
RC szervó vezérlés: 1 vezérlőjel kell (általában sárga vezeték),
+5V (piros | fehér vezeték) (ha szerencséd van akkor elmegy 3,3V-ról is),
GND (fekete vezeték).
A LaunchPad TP1-es csatlakozásánál van +5V (USB, max. 500mA!). Be kell forrasztani egy "tüskét" a csatlakozáshoz.
(Használd a "Válasz" gombot!)
Helló!
Átírtam ezt a programot, hogy jó legyen g2553-ra, megy is, csak egy kicsit felémér. Ha a bemenő frekvencia 11Hz, akkor 13-at ír, ha 37Hz, akkor 44-et ír, ha pedig 710Hz, akkor 870 körüli értéket ír. Ez a belső órajel hibája miatt van, vagy kalibrálni kellene?
Itt egy rajz hogy hogyan kell összekötni. Bocsi a paintes szintért.
Elvileg a szervó elmegy 3,3V-ról is, csak kisebb nyomatékkal és sebességgel. Micro és Standard HobbyKing szervók nekem mennek róla. A hozzászólás módosítva: Dec 10, 2013
Ez csak egy egyszerű kis programocska, "gyorsan összedobva". Tapasztalataim, méréseim szerint a g2553-as belső frekije nagyon rossz, kivéve a QFN tokozásúé, az pontos.
Próbálj rakni rá egy 32,768kHz-es kvarcot, vagy a Timer-nek külső frekit (TACTL TASSELx TACLK regiszter), amihez tudsz viszonyítani, és pontosítani.
Hétvégén beforrasztom a Launchpadhoz kapott kvarcot, remélem azzal pontosabb lesz.
Üdv mindenkinek!
A múlt héten megérkezett az MSP430 Launchpad-em. Ki is próbáltam a demo programokat és elhatároztam, hogy egy futófényt csinálok ezzel a kis eszközzel. A gond csak az, hogy a PIN-ek nem bírják meghajtani a LED-soromat. 6 db fehér LED-et kötöttem úgy, hogy 3-at-3-at sorba és a kettőt párhuzamosan.
Kérdés: hogyan tudnék LED sort meghajtani egyetlen ilyen PIN-en keresztül? Esetleg áramgenerátor kell vagy ilyesmi?
Az egyik lehetőség kapcsolótranzisztor, FET vagy tranzisztormező a LED katód lehúzására és soros ellenállás a LED(ek) áramának korlátozására.
A másik lehetőség speciális LED vezérlő IC-k meghajtása (pl. TLC5940, LT3599, MAX16809 stb). Ezek általában "áramgenerátoros" kimenetűek, ezekhez nem kell soros ellenállás.
Értem. Néztem ezt a TLC5940-est, de kicsit drágának tartom. A FET-es megoldás talán jobb lenne, de ahhoz nem értek. Melyik a legegyszerűbb megoldás a problémámra? Mellékelem a rajzot, hogy hogy is képzeltem el. Ez ugye így a rajzon azért nem működik, mert a PIN-eken csak kis áram és kis feszültség jön le. Szóval a egy LED sor és a hozzá tartozó pin közé kéne nekem valami egyszerű dolog, ami meghajtja a led sort.
Köszönöm az eddigi segitséget, és az nagy baj ha a szervónak csak 2 vezetéke van?
Nem baj, csak azt nem szervónak hívják. Amit beraktál képet, azon egy sima DC motort látunk.
|
|