Girino - snabb Arduino oscilloskop (14 / 26 steg)
Steg 14: Hur fungerar Pulse bredd Modulation
Elektroniskt "ta medelvärdet av en signal" kan översättas till "går det att ett low-pass filter", som sett på föregående steg.
Hur genererar Arduino en PWM-signal? Det är en riktigt bra handledning om PWM här:
http://Arduino.cc/en/tutorial/SecretsOfArduinoPWM
Vi kommer att se bara de poäng som behövs för detta projekt.
Det finns tre timers som kan användas för att generera PWM signaler i ATMega328P, var och en av dem har olika egenskaper som du kan använda. För varje timer motsvarar två register kallas utgång jämföra registrerar A / B (OCRnx) som används till att ställa intermittensen signal.
Som för att ADC finns en prescaler (se bilden), som saktar ner den största klockan att ha en exakt kontroll av PWM frekvensen. Långsammare ner klockan matas en räknare som ökar en Timer/Counter Register (TCNTn). Detta register jämförs kontinuerligt till OCRnx, när de är lika är en signal till en vågform Generator som genererar en puls på produktionen stift. Så är tricket att registret över OCRnx till något värde att ändra medelvärdet av signalen.
Om vi vill en 5 V signal (maximalt) vi måste ställa in en 100% arbetscykel eller en 255 i OCRnx (maximum för en 8-bitars nummer), medan om vi vill ha en 0.5 V signal vi måste ställa in en 10% intermittens eller en 25 i OCRnx.
Eftersom klockan har att fylla TCNTn registret innan du startar från början för en ny puls PWM utdata frekvens är:
f = (Main klocka) / prescaler / (TCNTn högst)
exempli gratia för timern 0 och 2 (8-bitars) med inga prescaler man: 16 MHz / 256 = 62,5 KHz medan för Timer 1 (16-bitars) blir det 16 MHz / 65536 = 244 Hz.
Jag beslutade att använda Timer nummer 2 eftersom
- Timer 0 används internt av Arduino IDE för funktioner såsom millis();
- Timer 1 har en utgång frekvens för långsam eftersom det är en 16-bitars timer.
I ATMega328P det finns olika typer av driftläge av timers, men vad jag ville ha var Snabbt PWM med ingen prescaling att få högsta möjliga utgång frekvensen.