PWM (RC távirányító) mérése
PWM (RC távirányító) mérése
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.
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.
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.
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.
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
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
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
Én is most fejlesztek egyet, az általam programozott már valamicskét repült is
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
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
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
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:
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.
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
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.
Nem, Te értesz félre.sytex írta:Félreértesz!
Nem, nem arra jósytex írta: Amit fent írtál kódrészlet az arra a szervó rángató kapcsolás lemérésére jó.![]()
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: 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.
De szerintem így megysytex í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.
http://www.pabr.org/pxarc/1.1/doc/pxarc.en.html
Igen, ezt írtam, de én egy PPM vevő kimenetét mérem így!sytex írta: Átfogalmazom, egy egymástól független 4 csatornás RC távirányító tesztert szeretnék csinálni.
Én nem ezt írtam!!!!!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:
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!
Szerintem így kellene, hogy működjön, de ha nem így van akkor a kollégák biztos mondanak jó megoldást.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![]()
Bocs, hogy belevau
ÜDv Roland