RCmania.cz - web pro modeláře a modely http://rcmania.cz/ |
|
Dekódování PPM obecně http://rcmania.cz/viewtopic.php?f=41&t=59575 |
Stránka 1 z 1 |
Autor: | jyrry [ sob 13.07.2013 16:56 ] |
Předmět příspěvku: | Dekódování PPM obecně |
Mohl by mi někdo znalý naznačit slovně, jak se dekóduje PPM signál? Chtěl bych si ulepit vlastní dekodér; sice něco mám, ale dost kostrbatě. Budu to dělat v PICBasicu, tak prosím slovně, v bodech, jak to probíhá v procesoru (jakémkoli). Zatím jsem vypotil jen toto: detekovat synchronizační mezeru (přerušení, časovač, ...) příchodem prvního impulzu po mezeře nahodit 1 na prvním výstupu příchodem dalšího impulzu první výstup shodit na 0 a nahodit 1 na druhém .... detekováním synchronizační mezery vynulovat čítač pořadí impulzů a po mezeře to samé dokola... než to začnu datlovat, mohlo by to tak fungovat? Ono je to vlastně obdoba klasického dekodéru s posuvným registrem, resetovaného mezerou (RC článek...) ... Příloha: 4017_decoder_harry1.gif [ 2.02 KiB | Zobrazeno 10473 krát ] Vím že to tu už bylo, dá se najít plno věcí i jinde, ale to bych musel nejdřív nastudovat příkazy těch jazyků ve kterých to lidi psali, abych pochopil funkci... |
Autor: | Drondys [ sob 13.07.2013 17:10 ] |
Předmět příspěvku: | Re: Dekódování PPM obecně |
Inspiruj se z jednoduchého příkladu zdrojáku pro Arduino demonstrujícího obecné čtení PPM signálu viz tento odkaz. |
Autor: | jyrry [ sob 13.07.2013 17:36 ] |
Předmět příspěvku: | Re: Dekódování PPM obecně |
jestli jsem dobre pochopil syntaxi, tak pri kazdem impulzu prectu (a vynuluji) timer a pokud je cas do pristiho impulzu v relaci 510us-1910us, tak ten cas zapisu do pole a navysim index prvku pole; kdyz je ten cas delsi, vynuluji index a jedu znova... ju? Pak muzu pracovat s hodnotami jednotlivych kanalu, mne zatim staci je rovnou posilat na vystupy... Ono mi totiz i u 6k prijimace leze ven uplne PPM 12k a tak muzu hlavni fce ridit primo z prijimace a blbinky si expandovat az do 12k... :-) |
Autor: | Drondys [ sob 13.07.2013 18:26 ] |
Předmět příspěvku: | Re: Dekódování PPM obecně |
jyrry píše: jestli jsem dobre pochopil syntaxi, tak pri kazdem impulzu prectu (a vynuluji) timer a pokud je cas do pristiho impulzu v relaci 510us-1910us, tak ten cas zapisu do pole a navysim index prvku pole; kdyz je ten cas delsi, vynuluji index a jedu znova... ju? V podstatě ano. Pro jistotu uvedu svůj popis. V každém přerušení k němuž dochází při změně na příslušném PPM pinu tj. ať už dojde ke změně stavu z 0 na 1 nebo z 1 na 0 tak je vyvolána funkce napojená na příslušné přerušení v daném případě je to funkce read_ppm(). Ve funkci read_ppm() vždy nejprve uložíš hodnotu čítače TCNT1 do proměnné counter. Pak TCNT1 vynuluješ. TCNT1 automaticky čítá s periodou 0,5 mikrosekundy. Je-li hodnota counter < 1020 (tj. 510 us) uložíš ji do proměnné pulse a nic víc. Je-li hodnota counter > 3820 vynuluješ proměnnou channel, která je index do pole dá se říct kanálů. Je-li hodnota counter v rozmezí 1020 až 3820 (tj. 510us až 1910us) tak se na index pole channel zapíše hodnota odpovídající polovině ze sumy aktuální hodnoty counter a dříve uložené hodnoty v proměnné pulse přičemž proměnná pulse se po nastavení na nějakou nenulovou hodnotu nevynuluje dokud nenastane situace kdy bude hodnota counter nulová a tak se při každém dalším průchodu kdy je counter v rozmezí 1020 až 3820 hodnota pulse přičítá k hodnotě counter. Všechny proměnné deklarované uvnitř funkce read_ppm() (tj. pulse, counter a channel) jsou static což znamená, že před prvním voláním kódu jsou automaticky vynulovány, ale i když jsou napsány uvnitř funkce tak z hlediska udržení naposledy nastavené hodnoty se chovají jako by byly globální tj. jako by byly napsané mimo funkci podobně jako pole ppm akorát s tím rozdílem, že nejsou přímo přístupné mimo funkci read_ppm(). Jakmile se tedy některá z těchto static proměnných nastaví na nějakou hodnotu tak ta hodnota v ní zůstává v platnosti i při následném volání funkce read_ppm() do té doby dokud uvnitř této funkce není změněna. Kód: int ppm[16];
... // Funkce přerušení void read_ppm() { static unsigned int pulse; static unsigned long counter; static byte channel; counter = TCNT1; TCNT1 = 0; if (counter < 1020) { pulse = counter; } else if (counter > 3820) { channel = 0; } else { ppm[channel] = (counter + pulse) / 2; channel++; } } |
Autor: | jyrry [ sob 13.07.2013 23:47 ] |
Předmět příspěvku: | Re: Dekódování PPM obecně |
diky moc ta hodnota pulse eliminuje sirku impulzu v PPM, predpokladam. To nahradim reakci jen na nabeznou hranu signalu (budu predpokladat jen kladne impulzy). Jinak to asi pobiram, jen nevim proc je hranice zrovna 1910us kdyz to muze jit jeste dal; ale to uz je jen cisilko... |
Autor: | ivanb [ pon 20.08.2018 17:56 ] |
Předmět příspěvku: | Re: Dekódování PPM obecně |
Jedna hotová možnost s PIC16F630 je na http://www.ivanb.wz.cz/PPM-dekoderPIC630.htm |
Stránka 1 z 1 | Všechny časy jsou v UTC + 1 hodina |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |