Milyen frekvenciát használnak az Arduinos a normál PWM-hez, ha analógWrite () -t használ?
És különbözik a különböző Arduino modelleknél? Kifejezetten a Mega 2560 érdekel, de azt is szeretném tudni, hogy ez konzisztens-e a modellek között.
Láttam elhaladó utalásokat az Arduino-ra 500 Hz-en, ami nagyon lassúnak tűnik.
Megjegyzések
- Ez a használt PIN-kódtól is függ.
Válasz
A PWM jelet az AVR chipeken lévő időzítők generálják. Minden időzítő PWM jelet generál két vagy három különböző érintkezőn. Mindegyik tüskének meg lehet a saját működési ciklusa, de megosztják a PWM gyakoriságát. A PWM frekvenciáját úgy módosíthatja, hogy megváltoztatja az időzítők óraforrását. Alapértelmezés szerint a CPU óráját osztják 64-gyel, azaz. az előmérőjük 64-re van állítva Arduino inicializáló kóddal. A dolgok összetévesztésére két különböző PWM mód létezik: gyors PWM és fáziskorrekt PWM. Gyors PWM esetén az időzítő 255-re számít, majd túlcsordul és 0-ról indul (256 különböző állapot). A fázis helyes PWM-ben az időzítő 255-re számít, majd megváltoztatja az irányt és lefelé nullára számít, irányt változtat stb. (510 különböző állapot).
Az Arduino Mega 5 időzítővel rendelkezik, timer0 – timer4. Mivel a timer0 a millis és a micros funkciókhoz is használható, ezért gyors PWM-et használ, míg a többi időzítő a fázis helyes PWM-hez van konfigurálva. Ez különböző frekvenciákat eredményez a különböző csapokon:
-
4. és 13. érintkező, 0 időzítő vezérlésével:
16 Mhz / 64/256 = 976,56 Hz -
Egyéb PWM csapok, amelyeket az időzítő1-4 vezérel:
16 Mhz / 64/510 = 490,20 Hz
A számítás: Óra / Prescaler / PWM mód állapotok száma
A helyzet ugyanaz, mint az összes többi Arduino táblámról, amiről ismerek, csak kevesebb időzítővel rendelkeznek, amelyek különböző csapokhoz csatlakoznak.
Megváltoztathatja a PWM frekvencia az időmérő előmérőjének cseréjével. Lásd ezt az oldalt: http://playground.arduino.cc/Main/TimerPWMCheatsheet
Az időzítők egy a 255-től eltérő érték. A 8 bites időzítőkön elveszít egy kimeneti tűt, de a 16 bites időzítőkön az Input Capture Register segítségével meghatározhatja a TOP értéket. A bemeneti rögzítési funkció az Arduino közösségben ritkán használt szolgáltatás, így valószínűleg nem fog hiányozni.
Az Arduino könyvtárak csak 8 bites felbontást használnak, még a 16 bites időzítőkön is. Ha nagyobb felbontást szeretne, akkor meg kell írnia a saját analogWrite-jét, vagy egy erre a célra létrehozott könyvtárat kell használnia. Az Arduino Mega timer0 és timer2 8 bites, míg a többi 16 bites.
Módosítva A 16 bites időzítők módja a teljes felbontás kihasználása érdekében, az előmérő és a TOP érték megváltoztatásával kombinálva a PWM frekvenciák nagyon széles tartományát érheti el.
A maximális elérhető frekvencia óra / 4, az előskála 1-re és a TOP 3-ra állításával gyors PWM módban – alacsonyabb érték nem megengedett. Ezzel 4 MHz-es PWM-et kap 2 bites felbontással. Ez lehet az idő 0% -án, 25% -án, 50% -án vagy 75% -án. A magasabb TOP érték magasabb felbontást eredményez alacsonyabb frekvencián.
Hosszabb magyarázatért olvassa el ezt a cikket , vagy olvassa el a adatlap .
Az időmérő0 előmérő, PWM mód vagy TOP érték megváltoztatásával a millis()
és micros()
.
Megjegyzések
- Összegyűjtem tehát, hogy a lehető leggyorsabb frekvencia mert a PWM értéke 16Mhz / 256 (prescaler = 1), vagy 62,5Khz?
- És hogy a PWM frekvenciának 62,5KHz egyenletes tényezőnek kell lennie? Valaki egy másik szálon akarta szabályozni a 4 tűs PC ventilátor ventilátor sebességét. Nyilvánvalóan 25KHz-es PWM vezérlőjelet akar. A 62,5 / 25 értéke 2,5, ami nem egész érték.
- Frissítettem a választ, hogy bővebben kitérjek az adott frekvenciák elérésének lehetőségeire.
- Az alacsony frekvenciájú végén egy 16 bites időzítő fázis-korrekciós üzemmódban történő előméretezése egy 1024-es előmérővel, hogy 16e6 / 1024/2 ^ 16/2 = 0,119Hz vagy 7,1 ciklus / perc legyen. Ennél alacsonyabb értéknél a biteket valami milliszerű () alapján kell váltani. Vagy esetleg kiváltja a számlálót a T külső bemeneti tűn ?.