Kérdés:
Zavaros digitális kimenet 4Mhz-en az Arduino NANO-n
Maciej Miklas
2015-05-14 13:04:03 UTC
view on stackexchange narkive permalink

Egyszerű programot írtam - jeleket generál a D porton keresztül 4 MHz-en:

  #include <Arduino.h>int main (void) {DDRD = B11111111; PORTD = B00000000; míg (igaz) {PORTD = 0; PORTD = 5; PORTD = 10; PORTD = 15; PORTD = 20; PORTD = 25; PORTD = 30; PORTD = 35; PORTD = 40; } return 0;}  

és ez a jel jön ki a D4-en: Max Frequency

Módosítottam a programot úgy, hogy minden hozzárendelés után beillesztettem a NOP-ot a POTRD :

  #define NOP __asm__ __volatile__ ("nop \ n \ t") int main (void) {DDRD = B11111111; PORTD = B00000000; míg (igaz) {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; } return 0;}  

és most a jel rendben van, de a frekvencia 800 KHz-re korlátozódik: enter image description here

Mi az oka a 4 MHz-es interferenciának? Van-e korlátozás a digitális kimenet maximális frekvenciájára? Valójában nincs szükségem egy adott projektre, csak meg akartam ismerni.

Tettem fel ezt a kérdést a stackoverflow oldalon, de aztán felfedeztem ezt a dedikált fórumot, így ... úgy döntöttem, hogy kipróbálom;)

Állítsa a hatókör módját _Single_ értékre _Normal_ helyett, és az „interferencia” varázsütésre eltűnik.
Ez helyes ... meg tudnád magyarázni ennek okát?
A hatókör szinkronizálja az emelkedő széleket, de mivel ezek egyenlőtlenül vannak elosztva, a szinkronból kikerül a jel teljes időtartamával. Néhány nopp hozzáadásával szerencsés szinkronizációt ért el a kód második verziójában. _Egyetlen_ módban csak egyetlen nyomot jelenít meg, így a szinkronizálás nem kérdés.
Beillesztheti a megjegyzését válaszként? - köszönöm !
Futtassa az `avr-objdump -S / tmp / sketchname.elf` fájlt, és nézze meg a létrehozott összeállító kódot. Meglátja, hogy egy adott kód hány műveletet igényel.
Bár nem ez az oka annak, amit látsz, azt is tudnod kell, hogy hacsak nem tiltod le, az Arduino időzítő megszakítással fut a háttérben, ami kissé zavarja az ilyen műveleteket.
Kettő válaszokat:
Edgar Bonet
2015-05-14 16:23:10 UTC
view on stackexchange narkive permalink

Ez nem korlátozza az Arduino alkalmazását: minden órajelnél kapcsolhat egy csapot. Szinkronizálási probléma a létrehozott jel és a hatókör kiváltása között. Az Ön hatóköre több nyomot mutat egymásra helyezve, és szinkronizálja őket az emelkedő éleken, de mivel ezek egyenlőtlenül vannak elosztva, a szinkronból kikerül a jel teljes periódusával. Néhány nopp hozzáadásával szerencsés szinkronizálást ért el a kód második verziójában.

A legegyszerűbb megoldás az, ha a hatókör módját Egyetlen értékre állítja a Normál . Ezután csak egyetlen nyomot jelenít meg, és a szinkronizálás már nem kérdés.

Egy másik lehetőség a PORTD egyik bitjének használata triggerként. Ennek a bitnek csak egyszer kell ciklusoznia a hurokban. A PD5 kódnak a kód jelenlegi verziójában kell működnie. Konfigurálja a forexternal trigger hatókörét, és táplálja ezt a jelet a TRIG bemenetébe.

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

Köszönöm - a helyes ravasz megoldja a problémámat: enter image description here



Ezt a kérdést és választ automatikusan lefordították angol nyelvről.Az eredeti tartalom elérhető a stackexchange oldalon, amelyet köszönünk az cc by-sa 3.0 licencért, amely alatt terjesztik.
Loading...