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
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/