Arduino a citit valoarea ciclului de funcționare PWM cu intrare (analogică / digitală)

Lucrez la compararea pilotilor automați precum Ardupilot , CC3D , KK2.1.5 . Comparația se referă la reacțiile / comportamentele sistemului pe care le dă în timpul zborului. În acest scop, trebuie să citesc valorile ciclului de funcționare PWM (cum ar fi osilascopii – frecvența PWM poate varia de la 50 la 430 Hz) de pe cardul pilot automat. Există 4 PWM-uri de intrare de comandă și 4 PWM-uri de control esc pentru un quadrotor tipic. Trebuie să citesc 8 valori ale ciclului de funcționare cu pini de intrare digitale / analogice. Cum măsoară ciclul de funcționare a 8 semnale PWM? De asemenea, măsurarea digitală sau analogică este precisă și mai rapidă?

Notă despre comanda attachInterrupt : Conform arduino.cc seria AtMega328 are 2 , Seria Arduino ATmega 2560 are 7 întreruperi.

Răspuns

Codul afișat în răspunsul meu la întrebarea 18183 , „Citiți canalele receptorului RC folosind întreruperea în loc de PulseIn ”. Acest răspuns are cod pentru a citi patru canale de RC PWM. Poate fi ușor adaptat pentru a funcționa cu opt canale. Are un ISR care rulează atunci când pinii selectați se schimbă. Se sortează canalele care s-au schimbat și stochează valoarea micros() la fiecare modificare.

Consultați și răspunsul meu la întrebarea 19106 , „Întreruperile externe pot fi SAU„ d împreună pe „328 (Uno)?” Acest răspuns include o schiță pentru generarea codului ISR adecvat. Răspunsul meu la întrebarea 32572 , „Cum se detectează direcția unui codificator rotativ?”, arată o altă instanță.

Intrare digitală, ca folosit în codul menționat mai sus, ia sub o microsecundă zece microsecunde în ISR. După cum sa menționat în comentariul lui dannyf, derularea buclei for și (acolo unde este posibil) utilizarea constantelor în loc de variabile poate reduce timpul în-ISR la 3,4 μs. Notă, intrarea și ieșirea ISR adăugați încă câteva microsecunde.

Intrarea analogică de 10 biți, pe de altă parte, va dura aproximativ 104 microsecunde pe citire, un timp comparabil cu unele dintre lățimile impulsurilor pe care le veți măsura. Deci, nu este suficient de rapid. Dacă precizia ADC degradată este acceptabilă, scăderea factorului de scară al ceasului ADC, așa cum se explică în o pagină web la microsmart.co.za poate reduceți timpul de conversie AD până la 20 μs. Aceasta este de aproximativ trei ori mai mare decât durează intrarea digitală, deci destul de lent.

Comentarii

  • > durează sub o microsecundă în ISR, mi se pare puțin probabil. Evident, nu ' nu știu despre ce piese de cod vorbeați – ca sunt trei dintre ei, dar o privire cauzală asupra lor ar sugera că vor fi necesare mai mult de 16 căpușe pentru a executa corpul ISR – fără a lua în considerare cheltuielile generale. De fapt, un mic păsăruș al meu a spus că ar fi ia aproape 8us pentru a le executa pe un Uno, 🙂
  • @dannyf, m-am uitat la unul dintre ISR-urile mai simple (numărarea codificatorului unic) când am scris asta, așa că va trebui să editez răspunsul corect timp. Ne pare rău!
  • nu este o problemă. două sugestii: 1) derulați bucla while; 2) folosiți mai degrabă constante decât variabile. și aș face, de asemenea, rcOld o statică în interiorul ISR, astfel încât codul să fie mai modular. cu aceasta, am redus timpul de execuție până la 3.4us.
  • Puteți partaja codul dvs. în loc de link-uri. De asemenea, seria AtMega328 are 2 întreruperi, seria Arduino ATmega 2560 are 7 întreruperi. Deci, cum pot măsura 8 semnale PWM simultane? arduino.cc/en/Reference/attachInterrupt
  • @acs, ATmega328 ' au 26 de vectori de întrerupere diferiți. Vectorii utilizați în codul de referință sunt pentru întreruperi de modificare a pinilor sau PCINT-uri, care utilizează 3 dintre acești vectori. PCINT-urile sunt disponibile pe 22 de pini Nano bazate pe ATmega328 și un număr similar pe Uno '. Vă rugăm să consultați codul afișat în întrebările anterioare – în acest moment am termenele de lucru pe care trebuie să le respect.

Răspuns

dacă se face în analog, rulați pwm printr-un lpf și efectuați un adc la ieșire;

dacă se face în digital, utilizați funcția de captare a unui temporizator sau utilizați întreruperea externă / întreruperea schimbării pin pentru a surprinde sincronizarea unei baze de timp.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *