Étape 14 : Comment fonctionne la Modulation de largeur d’impulsion
Par voie électronique « prenant la moyenne d’un signal » peut être traduit à « passer à un filtre passe-bas », comme vu le précédent l’étape.
Comment l’Arduino génère un signal PWM ? Il y a un très bon tutoriel sur PWM ici :
http://Arduino.cc/en/Tutorial/SecretsOfArduinoPWM
Nous allons voir que les points qui sont nécessaires pour ce projet.
Dans le ATMega328P, il y a trois minuteries qui peuvent être utilisés pour générer des signaux PWM, chacun de ceux qui a des caractéristiques différentes que vous pouvez utiliser. Pour chaque minuterie correspondent deux registres appelés comparer enregistre la sortie A / B (OCRnx) qui sont utilisées pour définir le rapport cyclique de signal.
Quant à l’ADC, il y a un Prédiviseur (voir image), qui ralentit l’horloge principale d’avoir un contrôle précis de la fréquence PWM. L’horloge ralenti est alimenté à un compteur qui s’incrémente un Timer/compteur s’inscrire (TCNTn). Ce registre est constamment comparé à la OCRnx, lorsqu’elles sont égales, un signal est envoyé à un générateur de signaux qui génèrent une impulsion sur la broche de sortie. L’astuce est affectant ainsi le registre OCRnx à une valeur pour modifier la valeur moyenne du signal.
Si nous voulons un signal V 5 (maximum), que nous devons fixer un cycle de 100 % ou un 255 dans le OCRnx (maximum pour un nombre 8 bits), alors que si nous voulons un signal V 0,5 nous devons fixer un cycle de 10 % ou 25 dans le OCRnx.
Puisque l’horloge doit remplir le registre TCNTn avant de commencer dès le début d’une nouvelle impulsion de la fréquence de la PWM est :
f = (horloge principale) / diviseur / (TCNTn maximum)
exempli gratia pour la minuterie 0 à 2 (8-bit) avec aucun prescaler il sera : 16 MHz / 256 = 62,5 KHz tandis que pour la minuterie 1 (16 bits), ce sera 16 MHz / 65536 = 244 Hz.
J’ai décidé d’utiliser ce numéro de Timer 2 car
- Minuterie 0 est utilisée en interne par l’IDE Arduino pour des fonctions telles que millis() ;
- Minuterie 1 a une fréquence de sortie trop lente parce que c’est un temporisateur de 16 bits.
Dans le ATMega328P il existe différents types de mode de fonctionnement des temporisateurs, mais ce que je voulais était le Fast PWM avec aucun prescaling pour obtenir la fréquence maximale de sortie possible.