Arduino luki PWM-työjakson arvon tulolla (analoginen / digitaalinen)

Pyrin vertailemaan autopilotteja, kuten Ardupilot , CC3D , KK2.1.5 . Vertailu koskee järjestelmän reaktioita / käyttäytymistä, jotka se antaa lennon aikana. Tätä tarkoitusta varten minun on luettava PWM-käyttöjakson (kuten osilaskoopit – PWM-taajuus voi vaihdella 50: stä 430 Hz: iin) arvot autopilotti-kortilta. Tyypilliselle kvadrotorille on 4 komentotulon PWM: ää ja 4 esc-ohjauksen PWM: ää. Minun täytyy lukea 8 käyttöjakson arvoa digitaalisilla / analogisilla tulonastoilla. Kuinka mitataan 8 PWM-signaalin käyttöjakso? Onko digitaalinen tai analoginen mittaus tarkka ja nopea?

Huomautus attachInterrupt -komennosta: arduino.cc mukaan AtMega328-sarjassa on 2 keskeytys , Arduino ATmega 2560 -sarjassa 7 keskeytyy.

Vastaa

Koodi, joka näkyy vastauksessani kysymykseen 18183 , ”Lue RC-vastaanotinkanavat käyttämällä keskeytystä PulseInin sijaan ”. Tässä vastauksessa on koodi lukea neljä RC PWM -kanavaa. Se voidaan helposti mukauttaa toimimaan kahdeksan kanavan kanssa. Sillä on ISR, joka toimii, kun valitut nastat muuttuvat. Se selvittää muutetut kanavat ja tallentaa micros() -arvon kullekin muutokselle.

Katso myös vastaukseni kysymykseen 19106 , ”Voivatko ulkoiset keskeytykset olla TAI” d yhdessä ”328 (Uno)?” Tämä vastaus sisältää luonnoksen sopivan ISR-koodin luomiseksi. Vastaukseni kysymykseen 32572 , ”Kuinka tunnistaa pyörivän kooderin suunta?”, näyttää toisen esiintymän.

Digitaalinen tulo, kuten käytetty yllä mainitussa koodissa, vie mikrosekunnin kymmenen mikrosekuntia ISR: ssä. Kuten dannyfin kommentissa todettiin, for -silmukan avaaminen ja (jos mahdollista) vakioiden käyttäminen muuttujien sijaan voi lyhentää ISR-aikaa 3,4 μs: ksi. lisää silti useita mikrosekunteja.

Toisaalta 10-bittinen analoginen tulo vie noin 104 mikrosekuntia lukua kohti, aika, joka on verrattavissa joihinkin pulssinleveyksiin, joita mittaat. Joten se ei ole ”tarpeeksi nopea. Jos heikentynyt ADC-tarkkuus on hyväksyttävä, ADC-kellokertoimen pienentäminen -sivulla osoitteessa microsmart.co.za voi saada AD-muunnosaika 20 μs: iin. Tämä on noin kolme kertaa niin kauan kuin digitaalinen tulo kestää, joten melko hidas.

Kommentit

  • > vie mikrosekunnin alle ISR: ssä, mielestäni se on epätodennäköistä. Ilmeisesti en ole varma ' en ole varma mistä koodikappaleista puhuit – kuten he ovat kolme heistä. mutta syy-syy tarkastella heitä viittaisi siihen, että ISR: n ruumiin teloittaminen vie yli 16 punkkia – lukuun ottamatta yleiskustannuksia. Itse asiassa pieni lintumieheni sanoi, että se kestää lähes 8 us suorittaa ne Unolla 🙂 🙂
  • @dannyf, katselin yhtä yksinkertaisemmasta ISR: stä (yhden kooderin laskenta) kirjoittaessani sitä, joten minun on muokattava vastausta oikein aika. Anteeksi!
  • ei ongelma. kaksi ehdotusta: 1) avaa while-silmukka; 2) käytä vakioita muuttujien sijasta. ja tekisin myös rcOldista staattisen ISR: n sisällä, joten koodi on modulaarisempi. sen avulla sain suoritusajan alas 3,4us.
  • Voitko jakaa koodisi linkkien sijaan. Lisäksi AtMega328-sarjassa on 2 keskeytystä, Arduino ATmega 2560 -sarjassa on 7 keskeytystä. Joten miten voin mitata 8 samanaikaista PWM-signaalia? arduino.cc/en/Reference/attachInterrupt
  • @acs, ATmega328 ' 26 erilaista keskeytysvektoria. Viitatussa koodissa käytetyt vektorit ovat tapinvaihdon keskeytyksiä tai PCINT: iä varten, jotka käyttävät 3 näistä vektoreista. PCINT-tiedostoja on saatavana 22: sta ATmega328-pohjaisesta Nano-nastasta ja vastaava määrä Uno ' s. Katso edellisissä kysymyksissä esitetty koodi – tällä hetkellä minulla on työaikoja.

Vastaa

jos se tehdään analogisesti, suorita pwm lpf: n läpi ja suorita adc lähdössä;

jos se tehdään digitaalisessa muodossa, käytä ajastimen sieppaustoimintoa tai käytä ulkoista keskeytystä / nastanvaihtoa kaapata ajoitus pois aikaperusteesta.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *