Szervó motor léptetése
Szervó motor léptetése
Üdv!
A következő problémát szeretném megoldani, és mivel kezdő vagyok csak külső segítségre számíthatok:
Adott egy ATtiny45-ös AVR és egy RC szervó motor amit n számú fix állás között szeretnék léptetni, úgy, hogy két nyomógombot használok, az egyik felfelé a másik lefelé léptetné... Ha megnyomom a felfelé gombot, akkor a szervó a következő állásba ugrik, ha a másik gombot akkor az előzőbe. Továbbá azt is szeretném megoldani, hogy egy adott állás tovább "finomítható" lenne további két nyomógombbal.
Valahogy úgy képzeltem el, hogy a program elején definiálnék n számú, adott időtartamú impulzus (ha jól tudom szervóknál ez 1-2 ms) és amikor megnyomom a "felfelé" gombot akkor a következő előre definiált impulzusértéket adja ki a vezérlő. a finombeállítást pedig úgy gondoltam, hogy az előre definiált impulzusértéket állítgatom egészen kicsi lépésközökkel, egy le-fel gombbal.
Na ezt szeretném valahogy használható programba foglalni csak az a kérdésem, hogy hogyan? Hogyan induljak el? Teljesen kezdő vagyok..:S
A következő problémát szeretném megoldani, és mivel kezdő vagyok csak külső segítségre számíthatok:
Adott egy ATtiny45-ös AVR és egy RC szervó motor amit n számú fix állás között szeretnék léptetni, úgy, hogy két nyomógombot használok, az egyik felfelé a másik lefelé léptetné... Ha megnyomom a felfelé gombot, akkor a szervó a következő állásba ugrik, ha a másik gombot akkor az előzőbe. Továbbá azt is szeretném megoldani, hogy egy adott állás tovább "finomítható" lenne további két nyomógombbal.
Valahogy úgy képzeltem el, hogy a program elején definiálnék n számú, adott időtartamú impulzus (ha jól tudom szervóknál ez 1-2 ms) és amikor megnyomom a "felfelé" gombot akkor a következő előre definiált impulzusértéket adja ki a vezérlő. a finombeállítást pedig úgy gondoltam, hogy az előre definiált impulzusértéket állítgatom egészen kicsi lépésközökkel, egy le-fel gombbal.
Na ezt szeretném valahogy használható programba foglalni csak az a kérdésem, hogy hogyan? Hogyan induljak el? Teljesen kezdő vagyok..:S
Először döntsd el, hogy milyen frekvencián megy az ATiny45-ös! Mert ez fontos az időzítéseknél! Aztán old meg, hogy a gombok ne ismétlődjenek és ne prellezenek!
Utána jöhet az időzítés megoldása, Timer és INT használatával!
Ha még kezdő vagy fontos valami kijelző is a hibakereséshez! (Soros Terminál vagy LCD, de legalább 2-3 LED)

Kezd a LED villogtató programnál!
http://avr.tavir.hu/modules.php?name=Co ... page&pid=7

Utána jöhet az időzítés megoldása, Timer és INT használatával!
Ha még kezdő vagy fontos valami kijelző is a hibakereséshez! (Soros Terminál vagy LCD, de legalább 2-3 LED)
Kezd a LED villogtató programnál!
http://avr.tavir.hu/modules.php?name=Co ... page&pid=7
Bascom alatt a Config Servo= pont erre van kitalálva:)
Itt a lépést is tudod állítani....
Ugye a szervi az 0.5...1,5 ms kitöltéssel dolgozik, és 2 msec a teljes periódus?
Egyszerű így a megoldás.
Van egy számlálód, ami 0...200 közt számol.
Mindezt 2msec alatt.
Így egy számolás ideje: 2msec/200=10usec
Ez eddig vázlatként:
Ha ugye nyomogombod van, akkor azt bekotod, es nezed hogy a lab allapota 1 vagy 0.
A masodik esetben azert 255 az also ertek, mert 0-1=255 (alulcsordul a byte valtozo!
Itt a lépést is tudod állítani....
Ugye a szervi az 0.5...1,5 ms kitöltéssel dolgozik, és 2 msec a teljes periódus?
Egyszerű így a megoldás.
Van egy számlálód, ami 0...200 közt számol.
Mindezt 2msec alatt.
Így egy számolás ideje: 2msec/200=10usec
Ez eddig vázlatként:
Kód: Egész kijelölése
a=0
:foprg
a=a+1
if a>ertek then lab=1 else lab=0'itt lesz a kimeneted
waitus 5'mert a tobbire is kell ido
if a=200 then a= 0 'letelt a 2 ms
goto foprg
Kód: Egész kijelölése
if piny.x = 1 then
ertek=ertek+1
if ertek=201 then ertek=200'nem lehet nagyobb mint a felso hatar!
endif
if piny.z = 1 then
ertek=ertek-1
if ertek=255 then ertek=0'nem lehet kisebb mint a felso hatar!
endif
Sziasztok!
Nem 2msec a periódusidő!
1-2msec a jel, de ezek 60-100Hz-el mennek, tehát nem klasszikus
0-100% PWM. Ezzel szívtam én is. Vagy túl gyors volt a freki, vagy vacak volt a felbontásom. T45-ben megcsináltam, ez volt az az ominózus WDT időzítőnek használva témakör. Vagy küldjem be a versenyre a projectet?
JAni
Nem 2msec a periódusidő!
1-2msec a jel, de ezek 60-100Hz-el mennek, tehát nem klasszikus
0-100% PWM. Ezzel szívtam én is. Vagy túl gyors volt a freki, vagy vacak volt a felbontásom. T45-ben megcsináltam, ez volt az az ominózus WDT időzítőnek használva témakör. Vagy küldjem be a versenyre a projectet?
JAni
Bogarászható kódrészlet:
Kód: Egész kijelölése
'Felbontás : 128
'Watchdog=32msec, dupla, 58Hz-el is megy (WDTCR.0=0=58Hz, 1=32Hz
$regfile = "atTiny45.dat"
$crystal = 8000000
Const Imp_offset = 129 'A leghosszabb impulzus, SERVO=max
Config Timer0 = Timer , Prescale = 64 '125kHz, max 2.048msec
Stop Timer0
Ocr1c = 255 'MAX
Dim Imphossz As Byte 'Timerbe meno impulzushossz (0-125)
Config Portb = &B00000001 'OC0A kimenet
Config Watchdog = 2048
On Watchdog Wd_int
Wdtcr = &B01001000
Enable Ovf0 'Csak 1 impulzus legyen a PWM kimeneten
On Ovf0 Tim0
Enable Interrupts
Start Watchdog
'Itt valami program van...
Do
Imphossz = Imphossz + 20
Imphossz = Imphossz And &B01111111 '0-127
Wait 1
Loop
Wd_int:
Set Wdtcr.6 'WDIE=ENABLE, mindig INT legyen WD lejártakor
Timer0 = Imp_offset - Imphossz
Set Portb.0 'Vezérlőimpulzus bekapcs
Start Timer0
Return
Tim0: 'Timer0 PWM OverFlow
Stop Timer0
Reset Portb.0 'Vezérlőimpulzus kikapcs
Return
End