Azon autopilóták összehasonlításán dolgozom, mint Ardupilot , CC3D , KK2.1.5 . Az összehasonlítás azokról a rendszerreakciókról / viselkedésekről szól, amelyeket repülés közben ad. Ebből a célból el kell olvasnom a PWM munkaciklusát (mint az osilaszkópok – a PWM frekvenciája 50 és 430 Hz között változhat) az autopilóta kártyáról. Egy tipikus kvadrotorhoz 4 parancs bemeneti PWM és 4 esc vezérlő PWM tartozik. 8 munkaciklus-értéket kell elolvasnom digitális / analóg bemeneti tüskékkel. Hogyan mérjem meg a 8 PWM jel munkaciklusát? A digitális vagy analóg mérés pontos és gyorsabb?
Megjegyzés a attachInterrupt paranccsal kapcsolatban: A arduino.cc szerint az AtMega328 sorozat 2 megszakítással rendelkezik , Az Arduino ATmega 2560 sorozat 7 megszakítással rendelkezik.
Válasz
Az válaszomban az 18183. kérdésre adott válaszomban látható kód: „Olvassa el az RC vevőcsatornákat a PulseIn helyett megszakítással. ”. Ennek a válasznak van kódja az RC PWM négy csatornájának leolvasására. Könnyen alkalmazható nyolc csatornával való munkához. Van egy ISR-je, amely akkor fut, amikor a kiválasztott csapok megváltoznak. Rendezi, hogy mely csatorna (k) váltottak, és minden változásnál tárolja a (z) micros()
értéket.
Lásd még: válaszom az 19106-os kérdésre : “Lehetnek-e külső megszakítások VAGY” d együtt a “328 (Uno)?” Ez a válasz tartalmaz egy vázlatot a megfelelő ISR kód előállításához. A 32572-es kérdésre adott válaszom: „Hogyan lehet érzékelni a forgó kódoló irányát?” egy másik példányt mutat.
Digitális bemenet, mint a fent említett kódban használva, az ISR-ben egy mikroszekundum alatt tíz mikroszekundumot vesz igénybe. Amint azt dannyf kommentárjában megjegyeztük, a for
ciklus kitekerése és (ahol lehetséges) változók helyett konstansok használata az ISR-n belüli időt 3,4 μs-ra csökkentheti. Megjegyzés: Az ISR belépés és kilépés még mindig adjon hozzá több mikroszekundumot.
A 10 bites analóg bemenet viszont olvasásonként körülbelül 104 mikroszekundumot vesz igénybe, ez az idő összehasonlítható az Ön által mért impulzusszélességek némelyikével. Tehát ez nem “elég gyors. Ha az ADC pontosságának romlása elfogadható, akkor az részben ismertetett ADC-óra skála tényező csökkentésével a microsmart.co.za weboldal kapja meg az AD konverziós idejét 20 μs-ig. Ez körülbelül háromszor annyi ideig tart, mint a digitális bemenet, ezért meglehetősen lassú.
Megjegyzések
- > mikroszekundum alatt áll az ISR-ben, ezt valószínűtlennek tartom. Nyilvánvaló, hogy nem vagyok biztos abban, hogy ' melyik kódrészletről beszélt – mint ők hárman vannak. de egy ok-okozati tekintet arra enged következtetni, hogy több mint 16 kullancsra lesz szükség az ISR testének kivégzéséhez – a rezsit nem számítva. Ami azt illeti, egy kis madaram azt mondta, hogy vegyen közel 8 us-t, hogy Uno-n futtassa őket: 🙂
- @dannyf, néztem az egyik egyszerűbb ISR-t (single encoder counting), amikor ezt írtam, ezért a választ helyesen kell szerkesztenem idő. Sajnálom!
- nem probléma. két javaslat: 1) tekerje ki a while ciklust; 2) változók helyett állandókat használjon. és az rcOld-et is statikussá tenném az ISR-en belül, így a kód modulárisabb. ezzel a végrehajtási időt 3.4usra csökkentem.
- Megoszthatja-e a kódját linkek helyett. Emellett az AtMega328 sorozat 2 megszakítással, az Arduino ATmega 2560 sorozat 7 megszakítással rendelkezik. Tehát hogyan tudom megmérni 8 egyidejű PWM jelet? arduino.cc/en/Reference/attachInterrupt
- @acs, ATmega328 ' 26 különböző megszakítási vektor. A hivatkozott kódban használt vektorok pin-váltás megszakításokra vagy PCINT-ekre vonatkoznak, amelyek ebből a vektorból 3-at használnak. A PCINT-ek az ATmega328 alapú Nano csapok közül 22-n érhetők el, és hasonló szám az Uno ' s. Kérjük, olvassa el az előző kérdésekben feltüntetett kódot – jelenleg munkára vonatkozó határidőket kell betartanom.
Válasz
ha analóg módon történik, futtassa a pwm-et egy lpf-n keresztül, és végezzen egy adc-t a kimeneten;
ha digitálisan végezzük, akkor használjunk egy időzítő rögzítési funkcióját, vagy használjunk külső megszakítást / csapváltás megszakítást hogy rögzítse az időzítést egy időalapról.