Pracuji na porovnání autopilotů jako Ardupilot , CC3D , KK2.1.5 . Srovnání se týká reakcí / chování systému, které poskytuje během letu. Za tímto účelem musím přečíst hodnoty pracovního cyklu PWM (jako osilaskopy – frekvence PWM se může pohybovat od 50 do 430 Hz) z karty autopilota. K dispozici jsou 4 příkazové vstupní PWM a 4 esc řídící PWM pro typický kvadrotor. Musím načíst 8 hodnot pracovního cyklu pomocí digitálních / analogových vstupních kolíků. Jak změřím pracovní cyklus 8 signálů PWM? Je také digitální nebo analogové měření přesné a rychlejší?
Poznámka k příkazu attachInterrupt : Podle arduino.cc řady AtMega328 mají 2 přerušení , Řady Arduino ATmega 2560 mají 7 přerušení.
odpověď
Kód zobrazený v mé odpovědi na otázku 18183 , „Čtení kanálů RC přijímače pomocí Interrupt místo PulseIn “. Tato odpověď má kód pro čtení čtyř kanálů RC PWM. Lze jej snadno přizpůsobit pro práci s osmi kanály. Má ISR, které se spustí, když se změní vybrané piny. Třídí, které kanály se změnily, a ukládá hodnotu micros()
při každé změně.
Viz také moje odpověď na otázku 19106 , „Mohou být externí přerušení NEBO„ d “na„ 328 (Uno)? “ Tato odpověď obsahuje náčrt pro generování příslušného kódu ISR. Moje odpověď na otázku 32572 , „Jak zjistit směr rotačního kodéru?“, ukazuje další příklad.
Digitální vstup, jako použitý v kódu zmíněném výše, trvá mikrosekundu deset mikrosekund v ISR. Jak je uvedeno v komentáři dannyfa, odvíjení smyčky for
a (pokud je to možné) použití konstant namísto proměnných může snížit čas v ISR na 3,4 μs. Poznámka, vstup a výstup ISR stále přidávejte několik mikrosekund.
Na druhou stranu 10bitový analogový vstup bude trvat přibližně 104 mikrosekund na čtení, což je čas srovnatelný s některými šířkami pulzů, které budete měřit. Není to tedy dost rychlé. Pokud je přijatelná snížená přesnost ADC, lze snížit faktor měřítka hodin ADC, jak je vysvětleno na webové stránce na microsmart.co.za získejte čas převodu AD na 20 μs. To je přibližně třikrát déle, než trvá digitální vstup, takže je to poměrně pomalé.
Komentáře
- > trvá v ISR mikrosekundu, shledávám to nepravděpodobným. Je zřejmé, že si ' nejsem jistý, o kterých částech kódu jste mluvili – jako jsou tři z nich. ale kauzální pohled na ně by naznačoval, že poprava těla ISR bude trvat více než 16 klíšťat – nepočítáme-li režii. Ve skutečnosti můj malý ptáček řekl, že by vezměte téměř 8us, abyste je mohli spustit na Uno, 🙂
- @dannyf, když jsem to napsal, díval jsem se na jeden z jednodušších ISR (počítání jediného kodéru), takže bude třeba upravit odpověď správným čas. Je nám líto!
- není problém. dva návrhy: 1) rozbalte smyčku while; 2) používejte konstanty spíše než proměnné. a také bych udělal rcOld statickou uvnitř ISR, takže kód je více modulární. díky tomu jsem čas spuštění snížil na 3,4us.
- Můžete místo odkazů sdílet svůj kód. Řada AtMega328 má také 2 přerušení, řada Arduino ATmega 2560 má 7 přerušení. Jak tedy mohu měřit 8 simultánních signálů PWM? arduino.cc/en/Reference/attachInterrupt
- @acs, ATmega328 ' s 26 různých vektorů přerušení. Vektory použité v odkazovaném kódu jsou pro přerušení pinů nebo PCINT, které používají 3 z těchto vektorů. PCINT jsou k dispozici na 22 pinech Nano založených na ATmega328 a podobné číslo na Uno ' s. Přečtěte si prosím kód uvedený v předchozích otázkách – v tuto chvíli mám pracovní termíny, které musím splnit.
Odpovědět
pokud je provedeno analogově, spusťte pwm přes lpf a proveďte adc na výstupu;
pokud je provedeno digitálně, použijte funkci snímání časovače nebo použijte externí přerušení / změnu přerušení zachytit načasování mimo časovou základnu.