Fórum témák
» Több friss téma |
Cikkek » RC autó távirányítása Androidos telefonnal RC autó távirányítása Androidos telefonnal
Szerző: Istvanpisti, idő: Feb 1, 2014, Olvasva: 20728, Oldal olvasási idő: kb. 3 perc
A program célja, hogy a BT-n érkező karaktersorozatokat eltárolja és megkeresse bennük az előre definiált parancsokat, majd ezekre reagáljon, beavatkozzon, válaszoljon. A uC és az Andoid operációs rendszerű telefon programja számára parancsokat definiáltam, melyek közös jellemzője, hogy a '#' karakterrel kezdődnek, és ',' karakterrel végződnek. A parancsok a következők : Telefontól az autó irányába:
Autótól a telefon felé :
A szervómotor számára kb. 50 Hz-cel ismétlődő impulzust kell előállítani, mely impulzus hossza határozza meg a szervo elfordulását. A kormány szervó vezérlését a Timer1-gyel Fast PWM mód használatával oldottam meg. (Mode=14) Ebben az üzemmódban az ICP1 regiszter határozza meg meddig számol a Timer1 (periódus idő), és az OCR1A, vagy OCR1B regiszter tartalma adja meg az impulzus hosszát. A felbontás 1 us (ICP1=19999, osztás 8), amivel elméletben 0,18o felbontás lenne elérhető, de csak kb. 1o felbontást használtam ki, mivel a telefon programja ±90o tartományban küldi az adatot. A meghajtó motor PWM vezérlését a Timer2 látja el fázishelyes fast PWM üzemmódban (Mode=1), ekkor az OCR2A értéke (0..255), határozza meg az impulzus kitöltési tényezőjét. Nem mellékes a PWM frekvencia, melyet az előosztással lehet befolyásolni (CS22, CS21, CS20). Ebben az üzemmódban a frekvenciát a az alábbi összefüggéssel lehet kiszámítani : Ahol az N értékét az alábbi táblázat szerint kell értelmezni
A frekvenciát 15.686 Hz és 15 Hz között lehet beállítani. Több próba után az N=256 mellett döntöttem, amivel 61 Hz PWM frekvencia adódik. A magasabb frekvenciákon zavaró sípoló hangot ad a motor és erőtlenebbnek is érződik. A telefon programja 0..100 (%) közötti értéket küld az autónak, ahol előremenet esetén 0..220, hátramenet esetén 0..150 értékek közé konvertálok. (OCR2A) Ebből látszik, hogy hátramenet esetén kisebb sebesség érhető el a jobb kezelhetőség miatt. Ha ennek módosítására lenne szükség, akkor elég az ATMEGA88 programján módosítani. A harmadik timert, a Timer0-t CTC módban használom (mode=2) osztás 1024, OCR0A=77, amivel kb. 10 ms-onként végrehajtódik a TIMER0_COMPA interrupt, amiben többféle időzített feladat indítására leállítására is lehetőség nyílik. Itt oldom meg pl. a ADC interrupt engedélyezését 100 ms-onként, áll helyzetben a reflektorok felváltva villogtatását, stb. Az ADC-t 1,1 V-os referencia feszültségről üzemeltetem 8 bites felbontással balra igazított módon. Négy bemenet jelét mintavételezi. Ha engedélyezve van az ADC interrupt, akkor először az motor akkumlátor, utána a BT kapcsolat jelét, majd a motor áramát, és végül a uC az akku feszültségét méri meg, majd letiltja az ADC interruptut, amit majd 100 ms múlva a Timer0 interruptja fog engedélyezni. Az akkumulátorok feszültségét le kell osztani annyira, hogy a maximális feszültség (4,2 V) esetén se lépje túl a feszültség a leosztás után az 1,1 V-ot. A BT Tx adatait a USART RX interruptja "kapja" el és helyezi el egy átmeneti tárolóban (fifo), ahonnan a parancsokat a főprogramban keressük meg, amiket majd egy switch case szerkezetben külön-külön lehet kezelni. A telefonról meghatározott időnként mérésre utasító parancsok érkeznek. A motor áram mérésére vonatkozó parancsok kb. 1,2-1,3 másodpercenként érkeznek, ha 1,5 másodpercig nem érkezik ilyen parancs, akkor az autó megáll. Ugyanígy megáll, ha a BT kapcsolata megszűnt. Ezekkel a védelmi mechanizmusokkal próbáltam elejét venni annak, hogy az autó elszabaduljon. Nagy vonalakban ennyi a program működése, részletek a mellékelt kódban. Van még egy félkész funkció, ez pedig az áramkorlát beállítási lehetőség. A cél az lenne, hogy ha egy beállított értéket meghalad a motor áramának értéke, akkor az analog komparátor segítségével (interrupt) beavatkozva, csökkentve az áram kitöltési tényezőjét, lecsökkenjen az áram. A nyomtatott áramkörre felkerült egy 4 bit felbontású R-2R DAC, mely bitjeiből a 3 alsót szintén a telefonról lehet beállítani. A DAC-ról az analóg komparátor negatív bemenetére jut a jel, a pozitív bemenetre pedig a motorral sorbakötött söntről, egy műveleti erősítő közbeiktatásával. Abban az esetben ha a + bemeneten magasabb a feszültség, akkor megtörténik az intterupt hívás és csökkenteni lehet az OCR2A értékét, letiltani az analog komparátor interruptját, majd egy idő után újra engedélyezni, és a folyamat indul elölről, közben a Timer0 interruptban pedig lassan növelni lehet az OCR2A értékét, hogy az eredetileg kívánt kitöltést elérjük (csak késlelteve).
A cikk még nem ért véget, lapozz! Értékeléshez bejelentkezés szükséges! |
Bejelentkezés
Hirdetés |