Otázka:
Vyrušený digitální výstup na 4 MHz na Arduino NANO
Maciej Miklas
2015-05-14 13:04:03 UTC
view on stackexchange narkive permalink

Napsal jsem jednoduchý program - generuje signály přes port D při 4 MHz:

  #include <Arduino.h>int main (void) {DDRD = B11111111; PORTD = B00000000; while (true) {PORTD = 0; PORTD = 5; PORTD = 10; PORTD = 15; PORTD = 20; PORTD = 25; PORTD = 30; PORTD = 35; PORTD = 40; } návrat 0;}  

a toto je signál vycházející z D4: Max Frequency

Upravil jsem program vložením NOP po každém přiřazení k POTRD :

  #define NOP __asm__ __volatile__ ("nop \ n \ t") int main (void) {DDRD = B11111111; PORTD = B00000000; while (true) {PORTD = 0; NOP; PORTD = 5; NOP; PORTD = 10; NOP; PORTD = 15; NOP; PORTD = 20; NOP; PORTD = 25; NOP; PORTD = 30; NOP; PORTD = 35; NOP; PORTD = 40; NOP; } návrat 0;}  

a nyní signál vypadá dobře, ale frekvence je omezena na 800 KHz: enter image description here

Jaký je důvod rušení při 4 MHz? Existuje omezení maximální frekvence na digitálním výstupu? Opravdu to nepotřebuji pro nějaký konkrétní projekt, jen jsem to chtěl vědět.

Tuto otázku jsem položil na stackoverflow, ale pak jsem objevil toto vyhrazené fórum, takže ... rozhodl jsem se to vyzkoušet;)

Nastavte svůj režim rozsahu na _Single_ namísto _Normal_ a „interference“ magicky zmizí.
To je pravda ... mohl byste vysvětlit důvod?
Váš obor se synchronizuje na vzestupných hranách, ale protože jsou nerovnoměrně rozmístěny, synchronizace se s celou periodou signálu nevytvoří. Přidáním několika uzlů jste dosáhli šťastné synchronizace ve své druhé verzi kódu. V režimu _Single_ zobrazuje pouze jednu stopu, takže synchronizace není problém.
Můžete vložit svůj komentář jako odpověď? - Děkuju !
Zkuste spustit program `avr-objdump -S / tmp / sketchname.elf` a podívejte se na vygenerovaný kód assembleru. Uvidíte, kolik operací určitý kód vyžaduje.
I když to není příčinou toho, co vidíte, měli byste také vědět, že pokud to nezakážete, má Arduino na pozadí spuštěné přerušení časovače, které mírně naruší takové operace.
Dva odpovědi:
Edgar Bonet
2015-05-14 16:23:10 UTC
view on stackexchange narkive permalink

Nejde o omezení Arduina: pin můžete přepnout na každém hodinovém cyklu. Je to problém synchronizace mezi generovaným signálem a spuštěním rozsahu. Váš obor zobrazuje několik tras překrývajících se a synchronizuje je na vzestupných hranách, ale protože jsou nerovnoměrně rozmístěny, vymaže se synchronizace s celou periodou signálu. Přidáním několika uzlů jste dosáhli šťastné synchronizace ve své druhé verzi kódu.

Nejjednodušším řešením je nastavit režim oboru na Single namísto Normal . Pak zobrazí pouze jednu stopu a synchronizace už není problém.

Další možností by bylo použít jednu z bitů PORTD jako spouštěcí signál. Tento bit by se měl ve smyčce cyklovat pouze jednou. PD5 by měl fungovat v aktuální verzi vašeho kódu. Nakonfigurujte rozsah externího spouštěče a přivádějte tento signál do jeho vstupu TRIG.

Maciej Miklas
2015-05-14 17:54:13 UTC
view on stackexchange narkive permalink

Děkuji - správný spouštěč řeší můj problém: enter image description here



Tyto otázky a odpovědi byly automaticky přeloženy z anglického jazyka.Původní obsah je k dispozici na webu stackexchange, za který děkujeme za licenci cc by-sa 3.0, pod kterou je distribuován.
Loading...