Lettura segnale PWM instabile

Ciao a tutti.

Ho un ricevitore RC FrSKY X8R collegato ai PIN 5V GND e 3 del mio MEGA2560 R3.

Sto cercando di capire come gestire il segnale PWM in uscita dal CH1 del ricevitore e in ingresso nel pin 3 della board. Come base ho seguito questa guida: Three Ways To Read A PWM Signal With Arduino | BenRipley.com

Stampando a video i valori in ingresso noto che essi non sono sempre stabili ma oscillano di circa 4μs "verso l'alto" rispetto al valore che dovrebbero avere. P.e. il valore minimo che il radio comando invia al X8R è 988μs il valore letto assume i valori di 988μs o 992μs.

Quando provo a collegare gli ESC ed i motori ad Arduino inviandogli il segnale letto dal pin 3, le oscillazioni dei valori si traducono in piccole oscillazioni di velocità.
Esiste un modo efficace per "limare" i valori PWM?

P.S. Ho utilizzato il metodo degli Interrupts

4µS sono i step del micros()

https://www.arduino.cc/reference/en/language/functions/time/micros/:
On 16 MHz Arduino boards (e.g. Duemilanove and Nano), this function has a resolution of four microseconds (i.e. the value returned is always a multiple of four).

Percui un incertezza di 1 unitá di tempo corrisponde a 4µS.
Ciao Uwe

>bomba697: essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

>uwefed: Ti prego, prima di rispondere, di verificare sempre se l'utente abbia effettuato la presentazione, cosa che, ovviamente, NON può essere possibile se il suo numero di post è 1. Grazie anticipatamente per la collaborazione. :slight_smile:

ops

>gpb01: scusami, ho rimediato subito.

>uwefed: grazie, avevo già letto sull'argomento micros() e incertezza nel forum principale di Arduino.cc.
Più che altro volevo sapere se c'era un metodo efficace ed efficiente per "mediare" i dati in modo da non perdere la reattività di Arduino e, soprattutto, dei motori che poi andranno montati su un drone.

La soluzione è "semplice", non devi usare micros() e/o la input capture, devi usare un timer dedicato in modo da ottenere una risoluzione reale al singolo us.
Più in generale, visto che il tuo scopo è realizzare un drone lascia perdere versioni di Arduino basate sul Atmega328P e usa versioni basate sul Atmega2560, oltre ai limiti di flash e ram risolvi anche il limite dei ridotto numero di timer a 16 bit presenti sul 328P.
Tieni presente che con un processore 8 bit hai molti limiti, ormai tutti i software open source per droni sono basati su hardware a 32 bit proprio per le limitazioni imposte dal hardware a 8 bit.

@Astrobeed Ok grazie per l'input. Attualmente sto usando una Mega 2560 REV3 e vorrei provare a vedere fino dove riesco a spingermi. Sto già valutando di prendere Arduino DUE

Lascia perdere Arduino 2, è una scheda nata obsoleta, piuttosto prendi una Teensy 3.6.