Stap 14: Hoe de Pulse Width Modulation werkt
Elektronisch "het nemen van het gemiddelde van een signaal" kan vertaald worden naar "doorgegeven aan een low-pass filter", zoals gezien op de voorafgaande stap.
Hoe genereert de Arduino een PWM-signaal? Er is een echt een goede tutorial over PWM hier:
http://Arduino.CC/en/tutorial/SecretsOfArduinoPWM
We zullen zien slechts de punten die nodig zijn voor dit project.
In de ATMega328P zijn er drie timers die kunnen worden gebruikt voor het genereren van de PWM-signalen, ieder van hen heeft verschillende kenmerken die u kunt gebruiken. Voor elke timer overeenkomen met twee registers genoemd Output vergelijken registreert A / B (OCRnx) die worden gebruikt om het signaal pulserend sproeien.
Wat betreft de ADC is er een prescaler (zie afbeelding), die de belangrijkste klok te hebben een nauwkeurige controle van de PWM-frequentie vertraagt. De klok vertraagd naar beneden wordt gevoed aan een teller die een Timer/teller registreren (TCNTn verhoogt). Dit register wordt voortdurend vergeleken met de OCRnx, wanneer ze gelijk zijn een signaal wordt verzonden naar een golfvorm Generator die het genereren van een puls op de uitgang-Pins. Zo is de truc het OCRnx-register instelt op een waarde om te wijzigen de gemiddelde waarde van het signaal.
Als we een 5 V-signaal (maximale willen) Wij moeten stellen een taakcyclus van 100% of een 255 in de OCRnx (maximaal voor een 8-bits getal), terwijl als we een 0,5 V-signaal willen we een 10% duty cycle of een 25 in de OCRnx instellen moet.
Aangezien de klok invullen van het TCNTn-register moet voordat u vanaf het begin voor een nieuwe puls de uitgangsfrequentie van de PWM is:
f = (Main klok) / prescaler / (TCNTn maximaal)
exempli gratia voor de Timer 0 en 2 (8-bits) met geen prescaler zal: 16 MHz / 256 = 62, 5 KHz terwijl voor Timer 1 (16-bits), zal zij 16 MHz / 65536 = 244 Hz.
Ik besloot om de Timer nummer 2 gebruiken omdat
- Timer 0 wordt intern gebruikt door de Arduino IDE voor functies zoals millis();
- Timer 1 heeft een te traag uitvoerfrequentie omdat er een 16-bits timer.
In de ATMega328P er zijn verschillende soorten Werkingsmodus van de timers, maar wat ik wilde was het Snel PWM met geen prescaling om de maximale mogelijke uitvoerfrequentie.