Emlékeztető a pwm és ppm jelek dekódolására, a programozó megjegyzi
A tipikus rádióberendezések így működnek. Van egy adó (valójában maga az APA) és egy vevő. A vevőegység az adóval valamilyen protokollal kommunikál, gyakran zárt. A vevő dekódolja ezt a protokollt, és továbbítja a tollak helyzetét a berendezésen, például a quadrocopter repülésvezérlőjéhez (PC). A PC és a vevő kommunikálnak protokolluk szerint, mindkettőnek meg kell értenie. Ezen a helyen a PWM és a PPM nagyon népszerűek. Vannak más lehetőségek is, különösen az SBUS, a DSM2 és a DSX, de ebben a cikkben csak a PWM és a PPM-t vesszük figyelembe.
PPM (Pulse Position Modulation) - ez a kísérlet belegyömöszölni egy csomó PWM jeleket egyetlen kábelen, jól, vagy legalábbis én személy szerint szívesen gondol óta. A PPM mindig rövid impulzusokat továbbít. Az impulzusfrontok közötti szünetek egy PWM jel időtartamának felelnek meg. A jeleket egymás után továbbítják, először az első csatornán, majd a második csatornán, és így tovább. A PPM és a PWM jelek közötti megfelelést jól tükrözi a Rigol DS1054Z következő oszcillogramja:

Oszcillogram eltávolítjuk a vevő rádiókapcsolati R8EF, amelynek üzemmód, amelyben a két csap szolgál jeleket PPM és SBUS, és a fennmaradó csapok - PWM-jel a csatorna 3 és 8. Ezért, a PWM jelek csatornák 1. és a 2. ábrán nem látható. Itt számos érdekes funkció látható. Először is, ez különösen-vevő a logikai egység 3.3, bár motoros 5 V. Másodszor, PPM jel invertált képest, ahogyan ez általában rajzolt a képeket (például ebben az menet). Furcsa, amilyennek tűnhet, minden, amit az impulzusfrontokról írt fel, továbbra is igaz. Különösen a képen a PWM jel 3-as csatornájának megfelelő frontokat kurzorokkal jelöltük. Ebben az esetben a PPM jel eltolódik a PWM jelekhez képest, de általában a vevőkészüléknek valahogy nem kell szinkronizálnia őket.
A PPM jól működik mindaddig, amíg nem próbál több 8 csatornát beilleszteni. Ha több csatornát, vagy frissített jeleket kezd a késedelem több mint 20 ms (például abban az esetben, PWM), illetve, hogy „squeeze” a jelek elveszítik a pontosság, illetve a használata további vezetékek. Személy szerint nem láttam, hogy több mint 8 csatornát továbbítottak PPM-en keresztül.
Oké, most mondjuk, hogy a robotomat rádióberendezéssel akarom irányítani. Itt van a PWM megfelelő kódja:
#include
#include
#define NCHANNELS 8
#define CH1_PIN 5 // CH2_PIN = CH1PIN + 1, stb
illékony int pwm_value # 91; NCHANNELS # 93; = # 123; 0 # 125; ;
illékony int prev_time # 91; NCHANNELS # 93; = # 123; 0 # 125; ;
üres emelkedő # 40; # 41; ;
érvénytelen # 40; # 41; # 123;
uint8_t pin = PCintPort. arduinoPin;
PCintPort. attachInterrupt # 40; pin, emelkedő, felszaporodás # 41; ;
pwm_value # 91; pin - CH1_PIN # 93; = micros # 40; # 41; - prev_time # 91; pin - CH1_PIN # 93; ;
# 125;
üres emelkedő # 40; # 41;
# 123;
uint8_t pin = PCintPort. arduinoPin;
PCintPort. attachInterrupt # 40; pin, leesés, hiba # 41; ;
prev_time # 91; pin - CH1_PIN # 93; = micros # 40; # 41; ;
# 125;
érvénytelen beállítás # 40; # 41; # 123;
mert # 40; uint8_t i = 0; én
PCintPort. attachInterrupt # 40; CH1_PIN + i, emelkedő, felszaporodás # 41; ;
# 125;
Soros. kezdődik # 40; 9600 # 41; ;
# 125;
érvénytelen hurok # 40; # 41; # 123;
mert # 40; uint8_t i = 0; én
Soros. println # 40; "----------------" # 41; ;
késés # 40; 1000 # 41; ;
# 125;
És ez a PPM kódja:
#include
#include
#define PPM_PIN 6
#define MAX_CHANNELS 12
illékony int pwm_value # 91; MAX_CHANNELS # 93; = # 123; 0 # 125; ;
illékony int prev_time = 0;
illékony int curr_channel = 0;
illékony bool túlcsordulás = hamis;
üres emelkedő # 40; # 41;
# 123;
int tstamp = micros # 40; # 41; ;
/ * a túlcsordulásnak soha nem szabad történnie, de ki tudja. * /
ha # 40; curr_channel
ha # 40; pwm_value # 91; curr_channel # 93;> 2100 # 41; # 123; / * valójában szinkronizálás * /
pwm_value # 91; curr_channel # 93; = 0;
curr_channel = 0;
# 125; más
curr_channel ++;
# 125; más
túlfolyó = igaz;
prev_time = tstamp;
# 125;
érvénytelen beállítás # 40; # 41; # 123;
pinMode # 40; PPM_PIN, INPUT_PULLUP # 41; ;
PCintPort. attachInterrupt # 40; PPM_PIN, emelkedő, felszaporodás # 41; ;
Soros. kezdődik # 40; 9600 # 41; ;
# 125;
érvénytelen hurok # 40; # 41; # 123;
mert # 40; uint8_t i = 0; én
ha # 40; túlcsordulás # 41;
Soros. println # 40; "OVERFLOW!" # 41; ;
Soros. println # 40; "----------------" # 41; ;
késés # 40; 1000 # 41; ;
# 125;
A kódot a RadioLink T8FB rádióberendezéseken és a vevőkészüléken R8EF tesztelték. A következő fotón a PPM módba kapcsolt vevõ az Arduino Nano-hoz csatlakozik a beépített PPM firmware-rel:

Példa az UART hibakereső kimenetére:
A fentiekben használt PinChangeInt könyvtár célja a kód egyértelművé tétele. Lehetővé teszi a megszakítások lefagyását a vezető és a hátsó széleknél (felemelkedés és bukás) a meghatározott tűknél. A könyvtárról itt és itt olvashat bővebben. A PWM és PPM jelek dekódolásához szükséges firmware teljes verziója elérhető a GitHub-on.
Felfegyverkezve a megszerzett tudás itt, nem tudjuk csak ellenőrzik az Arduino segítségével a rádiót, hanem például forrasztani dekóderek PWM / PPM-(ha nem akar fizetni a kész AliExpress), vagy akár, hogy készítsen saját rádióberendezések alapján a NRF24L01 vagy egy másik rádiómodul. Ez csak az első dolog, ami személyesen jött hozzám.
És milyen őrült ötletei vannak a kreativitásnak?
Tetszik a post? Ossza meg másokkal:
(A JS-nek engedélyezve kell lennie)