PWM (RC távirányító) mérése

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
sytex
DrótVégénSzéndarab
Hozzászólások: 36
Csatlakozott: 2010. június 10. csütörtök, 6:00

PWM (RC távirányító) mérése

Hozzászólás Szerző: sytex »

Sziasztok!

Foglalkozott már valaki PWM mérésével? Különösképp RC szabvány PWM-re gondolok. 4 csatornát kéne mérni és mSec-ben vagy %-ban kiíratni.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Szabványról mit tudni?
Frekvencia?
Milyen pontosan kell mérni?
Avatar
sytex
DrótVégénSzéndarab
Hozzászólások: 36
Csatlakozott: 2010. június 10. csütörtök, 6:00

Hozzászólás Szerző: sytex »

http://pcbheaven.com/wikipages/How_RC_Servos_Works/

Frekvencia 30-50 Hz (távirányító függő, de azt hiszem az 50 az elterjedtebb)
Bal kitérés: 1mSec kitöltés
Jobb kitérés: 2 mSec kitöltés
Középállás: 1,5 vagy 1,52 mSec (távirányító függő)

Kijelzést első körben soros konzolra gondoltam.
Milyen pontosan? Amennyire csak lehet! :-)

Viszont egyszerre 4 csatornát kéne... :(

Sajnos még mindig nem barátkoztam meg ezzel a Timer alapú méréssel, nem látom át (amig nem látok egy programot hogy hogyan működik)

G.
Avatar
broland
Tranzisztorgyógyász
Hozzászólások: 152
Csatlakozott: 2009. április 20. hétfő, 6:00

Hozzászólás Szerző: broland »

Szia sytex

Nem értem a kérdésedet :oops: , Te nem a vevő adott csatornáinak jelidejét szeretnéd mérni? Tehát a szabvány 1-2ms magas jel, 20ms periódus idővel?

Üdv ROland
Avatar
sytex
DrótVégénSzéndarab
Hozzászólások: 36
Csatlakozott: 2010. június 10. csütörtök, 6:00

Hozzászólás Szerző: sytex »

Lehet, hogy én agyam zsibbadt le túlságosan már mára, de szerintem ezt írtam le fent. :oops: Ha nem akkor sorry.

Kicsit összetettebb a feladat, de a lényeg ugyanez. Összefoglalva: egy quadcopter vezérlő lapjával szenvedek.

Szerk: És kellene egy debug eszközt gyártanom ahol le tudom mérni mennyi az annyi.
Avatar
broland
Tranzisztorgyógyász
Hozzászólások: 152
Csatlakozott: 2009. április 20. hétfő, 6:00

Hozzászólás Szerző: broland »

Na én lemaradtam.

Itt van a ppm vevő kimenete, http://diydrones.com/profiles/blogs/dri ... ing-only-2
Én úgy állnék neki, hogy a TIMER1-et beállítanám rövid idejü 10ms túlcsordulásra, mert a 4 csatorna kimenete egymást követi, tehát ha mindegyik max értéken van akkor a 4 csati össz ideje 8 ms lehetne csak.
Ha az órajeled 16MHz, az előosztó 8-as, akkor egy tick ideje 0,0005 ms.
Ez elég pontos.
CH1 => INT0
CH2 => INT1
CH3 => INT2
CH4 => INT3

INT0 felfutó, timer1 start 0-ról.
INT1 felfutó, timer1 értéke kiolvas, bele ch1_tmr változóba CH1 idő=ch1_tmr*0.0005
INT2 felfutó, timer1 értéke kiolvas, bele ch2_tmr változóba CH2 idő=ch2_tmr-ch1_tmr*0.0005
INT3 felfutó, timer1 értéke kiolvas, bele ch3_tmr változóba CH3 idő=ch3_tmr-ch2_tmr*0.0005
de az INT3-at, ha csak 4 csatis a vevőd, a megszakítás beesésekor át kell állítani lefutóra, és a lefutónál is ki kell olvasni a timert, mert ez adja meg a CH4 idejét.
Aztán megint jön az INT0, timer1=0, timer1 start.

Kollégák jól gondolkodtam?

Üdv ROland
Avatar
broland
Tranzisztorgyógyász
Hozzászólások: 152
Csatlakozott: 2009. április 20. hétfő, 6:00

Hozzászólás Szerző: broland »

Quadrocopter jó dolog.

Én is most fejlesztek egyet, az általam programozott már valamicskét repült is :):):):) Elsőre nagy falat lesz teljesen magadtól megírni, keress egy opensource lehetőséget, nézd meg, hogy milyen alapokon működik, hogy is van leprogramozva, és azt bővíteni!
Nem egyszerű egy jól működő Kalman filtert megirni, a gyro, gyorsulásmérő, mágneses szenzor adatokat kiértékelni, figyelni a user adta parancsokat, ezeket summázni, és küldeni a ESC-hez.

Ha kell segítség, ebben könnyebben tudok :)
Avatar
sytex
DrótVégénSzéndarab
Hozzászólások: 36
Csatlakozott: 2010. június 10. csütörtök, 6:00

Hozzászólás Szerző: sytex »

Félreértesz!

Amit fent írtál kódrészlet az arra a szervó rángató kapcsolás lemérésére jó. :)

Egy OpenSource lappal és FW-vel szívok, fórumokon a felhasználók 90% a szenved vele, 10%-a azt mondja jó... aztán ki tudja kinek lehet hinni, nekem mindenesetre nem jó,

Én csak arra vagyok kíváncsi hogy a 4 motor kimeneten mi jön ki a lapból.

Ha a te programrészletedet vesszük akkor azt feltételezzük hogy ha felfut a ch2 akkor a ch1 abban a pillanatban le is fut. De valós esetben ez nem így megy.

Átfogalmazom, egy egymástól független 4 csatornás RC távirányító tesztert szeretnék csinálni.

Közben a te példádból merítve:

Timer indít (valahonnan) túlcsordulásra interrupt
Interruptban:
Ha CH1input up akkor incr ch1counter és ch1last_state legyen 1
Ha CH2input up akkor incr ch1counter és ch2last_state legyen 1
Ha CH3input up akkor incr ch1counter és ch3last_state legyen 1
Ha CH4input up akkor incr ch1counter és ch4last_state legyen 1
Ha CH1input down és ch1last_state=1 akkor (CH1ertek=ch1counter; ch1last_state legyen 0; ch1counter legyen 0)
Ha CH2input down és ch1last_state=1 akkor (CH2ertek=ch2counter; ch1last_state legyen 0; ch2counter legyen 0)
Ha CH3input down és ch1last_state=1 akkor (CH3ertek=ch3counter; ch1last_state legyen 0; ch3counter legyen 0)
Ha CH4input down és ch1last_state=1 akkor (CH4ertek=ch4counter; ch1last_state legyen 0; ch4counter legyen 0)
Interrupt vége:

A főprogram pedig csak egy do-loopban okádná soroson kifelé a ch1-4 értékeket.

Már csak az a kérdés hogy maga az interrupt lefut-e olyan gyorsan mint hogy jönne egy újabb interrupt. És hogy a soros porti adatáramot mennyire zavarja ha agyonszaggatom interruptal a főprogram futását.

Na ezt most vissza se merem olvasni, ha nagy hülyeség lőjetek le :)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Hát, méréshez kell min 4 INT láb. Ideálisan pinchange INT-et tudó.
Ideálisan ATMega168/328/48/88 vagy hasonló, 2. generációs. Ebben minden láb PinChange-t tud.
Kell 20 MHz órajel a Timer miatt (minél magasabb sebesség, annál jobb:) és pontopsabb a mérés)

Program csontváz:

Kód: Egész kijelölése

Timer1 - prescale=1, timer módban '16bites igy 1 Clk: 20 MHz esetén: x usec max érték 65536
dim Nagyszam as long
dim pwmertek1H as long'amikor Hba megy
dim pwmertek1L as long'amikor Lba megy
dim timeroverflow as word 'timer tulcsordulasokat is szamoljuk
on timer1 overflowtimer
enable interrupts
enable timer1
start timer1
on pcint1 goto pwmszamol
config pcint1lab = input
dim adatjott as byte'jelzobit, hogy mertem valamit


do
kiertekeles
if adatjott=1 then'
   ido=pwmertek1L-pwmertel1H
   print "1.PWM L:";ido
endif
if adatjott=2
   ido=pwmertek1H-pwmertel1L
   print "1.PWM H:";ido
endif
loop

overflowtimer:
timeroverflow=timeroverflow+1
return


pcint1:
'timer azalatt is ketyeg, hogy itt az INTben vagy. ezert elore lementjuk
timermert=timer1
timer1ovf=timer1overflow 'persze itt nem fut ra a timer overflow-ra igy ha pont itt foirdul, akkor 65536-l kisebb erteket kapsz. Vizsgald le, hogy a timerovf jelzőbit=1 -> akkor hozzaadod a hianyzo overflow-t 
if pcint1lab=1 then 'L->H
  pwmertek1l=timermert+timerovf*65536
  adatjott=1
else
  pwmertek1h=timerment+timerovf*65536
  adatjott=2
endif
return
Gyakorlatilag 2 impulzus közti idot mered....

Most 1-2-3-4 pwre simán kibővítheted, 1 timer eleg...
Igy szerintem usec pontosan mersz vele...
If helyett case - rovidebb INT ido
illetve optimalizalgatni lehet.
Ezzel 1% pontossag siman megvan.
Fontos!
Soros kiiras bufferelt legyen (INT alapu, ne kelljen megvarni a teljes lefutast. Az is ido) Valaymint 115200 bps sebessegu! (lehet igy nem a 20MHz quartz kell, hanem a 18,xxx a pontos soros sebesseghez.
Avatar
broland
Tranzisztorgyógyász
Hozzászólások: 152
Csatlakozott: 2009. április 20. hétfő, 6:00

Hozzászólás Szerző: broland »

sytex írta:Félreértesz!
Nem, Te értesz félre.
sytex írta: Amit fent írtál kódrészlet az arra a szervó rángató kapcsolás lemérésére jó. :)
Nem, nem arra jó :)
sytex írta: Egy OpenSource lappal és FW-vel szívok, fórumokon a felhasználók 90% a szenved vele, 10%-a azt mondja jó... aztán ki tudja kinek lehet hinni, nekem mindenesetre nem jó,

Én csak arra vagyok kíváncsi hogy a 4 motor kimeneten mi jön ki a lapból.
Ennek a felépítése már nem kell, hogy a bemenettel összefüggjön, mert azt már az mcu rakja össze!!!!
sytex írta: Ha a te programrészletedet vesszük akkor azt feltételezzük hogy ha felfut a ch2 akkor a ch1 abban a pillanatban le is fut. De valós esetben ez nem így megy.
De szerintem így megy :)
http://www.pabr.org/pxarc/1.1/doc/pxarc.en.html
sytex írta: Átfogalmazom, egy egymástól független 4 csatornás RC távirányító tesztert szeretnék csinálni.
Igen, ezt írtam, de én egy PPM vevő kimenetét mérem így!
sytex írta: Közben a te példádból merítve:

Timer indít (valahonnan) túlcsordulásra interrupt
Interruptban:
Ha CH1input up akkor incr ch1counter és ch1last_state legyen 1
Ha CH2input up akkor incr ch1counter és ch2last_state legyen 1
Ha CH3input up akkor incr ch1counter és ch3last_state legyen 1
Ha CH4input up akkor incr ch1counter és ch4last_state legyen 1
Ha CH1input down és ch1last_state=1 akkor (CH1ertek=ch1counter; ch1last_state legyen 0; ch1counter legyen 0)
Ha CH2input down és ch1last_state=1 akkor (CH2ertek=ch2counter; ch1last_state legyen 0; ch2counter legyen 0)
Ha CH3input down és ch1last_state=1 akkor (CH3ertek=ch3counter; ch1last_state legyen 0; ch3counter legyen 0)
Ha CH4input down és ch1last_state=1 akkor (CH4ertek=ch4counter; ch1last_state legyen 0; ch4counter legyen 0)
Interrupt vége:
Én nem ezt írtam!!!!!

Nem érdekel minket az, hogy a TIMER1 mikor csordul túl, a lényeg, hogy később legyen mint az összes csatorna max értékének összege => 4*2ms= 8ms, timer1 túlcsordulás legyen legalább 10ms, de nem kell hogy bármit is csináljon a megszakításban!

Az INT0 felfutó éle elindítja a timer1-et 0 értékről, ami a háttérben csak fut, és számol felfele.
Az INT1 felfutó éle generál olyan megszakítást, amikor ki kell olvasnom a timer1 értékét, és azt egy változóba beírom. De a timer1 futását nem bántom!!!!!
A többi csatornánál ugyan ezt teszem, kivétel az utolsó, amikor annak a felfutó élekor átállítom a megszakítást lefutó élre, hogy ki tudjam számolni a magas szint idejét.

Aztán itt a megszakításokat letiltom, a főciklusban pedig kiküldöm az adatokat a soros portra. Ha ez megtörtént ismét timer1=0, INT0 timer1 start!
sytex írta: A főprogram pedig csak egy do-loopban okádná soroson kifelé a ch1-4 értékeket.

Már csak az a kérdés hogy maga az interrupt lefut-e olyan gyorsan mint hogy jönne egy újabb interrupt. És hogy a soros porti adatáramot mennyire zavarja ha agyonszaggatom interruptal a főprogram futását.

Na ezt most vissza se merem olvasni, ha nagy hülyeség lőjetek le :)
Szerintem így kellene, hogy működjön, de ha nem így van akkor a kollégák biztos mondanak jó megoldást.
Bocs, hogy belevau :)

ÜDv Roland
Avatar
sytex
DrótVégénSzéndarab
Hozzászólások: 36
Csatlakozott: 2010. június 10. csütörtök, 6:00

Hozzászólás Szerző: sytex »

Köszi Robi!

Nem kis küzködés árán sikerült megcsinálnom a mintád alapján 1 csatornára, erre dobott egy hátast a 4 napos SSD a notebookomban. Garcsere után nulláról foly.köv. :)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Így legalább optimalizált kódod lesz - van idő a kódnak és az ötleteknek letisztulni :) .
Válasz küldése