- Broches PWM dans le microcontrôleur AVR Atmega16
- Qu'est-ce qu'un signal PWM?
- Composants requis
- Schéma
- Programmation Atmega16 pour PWM
La modulation de largeur d'impulsion (PWM) est une technique puissante où la largeur de l'impulsion est modifiée en maintenant la fréquence constante. Cette technique est aujourd'hui utilisée dans de nombreux systèmes de contrôle. L'application de PWM n'est pas limitée et il est utilisé dans une large gamme d'applications telles que le contrôle de la vitesse du moteur, la mesure, le contrôle de puissance et la communication, etc. Dans la technique PWM, on peut facilement générer un signal de sortie analogique à l'aide de signaux numériques. Ce tutoriel vous aidera à comprendre PWM, ses terminologies et comment nous pouvons l'implémenter à l'aide d'un microcontrôleur. Dans ce didacticiel, nous allons démontrer PWM avec le microcontrôleur AVR Atmega16 en faisant varier l'intensité d'une LED.
Pour comprendre les bases de PWM en détail, veuillez consulter nos précédents tutoriels sur PWM avec différents microcontrôleurs:
- Tutoriel PWM ARM7-LPC2148: Contrôle de la luminosité de la LED
- Modulation de largeur d'impulsion (PWM) avec MSP430G2: contrôle de la luminosité de la LED
- Génération de PWM à l'aide du microcontrôleur PIC avec MPLAB et XC8
- Modulation de largeur d'impulsion (PWM) dans STM32F103C8: Contrôle de la vitesse du ventilateur CC
- Génération de signaux PWM sur les broches GPIO du microcontrôleur PIC
- Tutoriel PWM Raspberry Pi
Broches PWM dans le microcontrôleur AVR Atmega16
Atmega16 dispose de quatre broches PWM dédiées. Ces broches sont PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Aussi ATmega16 a deux minuteries 8 bits et une minuterie de 16 bits. Timer0 et Timer2 sont des minuteries 8 bits tandis que Timer1 est une minuterie 16 bits. Pour générer PWM, nous devons avoir une vue d'ensemble des minuteries car les minuteries sont utilisées pour générer PWM. Comme nous savons que la fréquence est le nombre de cycles par seconde sur lesquels la minuterie fonctionne. Ainsi, la fréquence plus élevée nous donnera une minuterie plus rapide. Lors de la génération de PWM, une fréquence PWM plus rapide donnera un contrôle plus fin sur la sortie car elle peut répondre plus rapidement aux nouveaux cycles de service PWM.
Dans ce didacticiel Atmega16 PWM, nous utiliserons Timer2. Vous pouvez choisir n'importe quel cycle de service. Si vous ne savez pas quel est le cycle de service dans PWM, discutons-en brièvement.
Qu'est-ce qu'un signal PWM?
La modulation de largeur d'impulsion (PWM) est un signal numérique le plus couramment utilisé dans les circuits de commande. Le temps pendant lequel le signal reste haut est appelé «temps de marche» et le temps pendant lequel le signal reste bas est appelé «temps d'arrêt». Il existe deux paramètres importants pour un PWM, comme indiqué ci-dessous:
Cycle de service du PWM
Le pourcentage de temps pendant lequel le signal PWM reste HAUT (temps d'activation) est appelé comme facteur de marche.
Comme dans un signal d'impulsion de 100 ms, si le signal est HAUT pendant 50 ms et BAS pendant 50 ms, cela signifie que l'impulsion était à mi-temps HAUT et à mi-temps BAS. On peut donc dire que le cycle de service est de 50%. De même, si l'impulsion est à l'état HAUT de 25 ms et 75 ms à l'état BAS sur 100 ms, le cycle de service serait de 25%. Notez que nous ne calculons que la durée de l'état HIGH. Vous pouvez prendre référence à l'image ci-dessous pour une compréhension visuelle. La formule du cycle de service est alors,
Cycle de service (%) = temps de marche / (temps de marche + temps d'arrêt)
Ainsi, en modifiant le cycle de service, nous pouvons modifier la largeur de PWM, entraînant ainsi un changement de luminosité de la LED. Nous aurons une démonstration de l'utilisation de différents cycles de service pour contrôler la luminosité de la LED. Consultez la vidéo de démonstration à la fin de ce didacticiel.
Après avoir sélectionné le cycle de service, l'étape suivante consiste à sélectionner le mode PWM. Le mode PWM spécifie comment voulez-vous que PWM fonctionne. Il existe principalement 3 types de modes PWM. Ce sont les suivants:
- PWM rapide
- Corriger la phase PWM
- Corriger la phase et la fréquence PWM
Le PWM rapide est utilisé là où le changement de phase n'a pas d'importance. En utilisant Fast PWM, nous pouvons produire les valeurs PWM rapidement. Le PWM rapide ne peut pas être utilisé lorsque le changement de phase affecte le fonctionnement tel que le contrôle du moteur, donc dans une telle application, d'autres modes de PWM sont utilisés. Puisque nous contrôlerons la luminosité de la LED où le changement de phase n'affectera pas beaucoup, nous utiliserons le mode Fast PWM.
Maintenant, pour générer PWM, nous allons contrôler la minuterie interne pour compter, puis remettre à zéro à un compte particulier, de sorte que la minuterie comptera puis se remettra à zéro encore et encore. Cela définit la période. Nous avons maintenant la possibilité de contrôler une impulsion, en activant une impulsion à un compte spécifique dans la minuterie pendant qu'elle monte. Lorsque le compteur revient à 0, désactivez le pouls. Il y a beaucoup de flexibilité avec cela parce que vous pouvez toujours accéder au compte de la minuterie et fournir différentes impulsions avec une seule minuterie. C'est génial lorsque vous souhaitez contrôler plusieurs LED à la fois. Commençons maintenant à interfacer une LED avec Atmega16 pour PWM.
Vérifiez tous les projets liés au PWM ici.
Composants requis
- Circuit intégré de microcontrôleur Atmega16 AVR
- Oscillateur à cristal 16Mhz
- Deux condensateurs 100nF
- Deux condensateurs 22pF
- Bouton poussoir
- Fils de cavalier
- Planche à pain
- USBASP v2.0
- 2 LED (n'importe quelle couleur)
Schéma
Nous utilisons OC2 pour PWM, c'est-à-dire Pin21 (PD7). Alors connectez une LED à la broche PD7 d'Atmega16.
Programmation Atmega16 pour PWM
Le programme complet est donné ci-dessous. Gravez le programme dans Atmega16 en utilisant JTAG et Atmel studio et voyez l'effet PWM sur LED. Sa luminosité augmentera et diminuera lentement en raison de la variation du cycle de service du PWM. Vérifiez la vidéo donnée à la fin.
Commencez à programmer Atmega16 avec la configuration du registre Timer2. Les bits du registre Timer2 sont les suivants et nous pouvons définir ou réinitialiser les bits en conséquence.
Nous allons maintenant discuter de tous les bits de Timer2 afin que nous puissions obtenir le PWM souhaité en utilisant un programme écrit.
Il y a principalement quatre parties dans le registre Timer2:
FOC2 (Force Output Compare for Timer2): Le bit FOC2 est défini lorsque les bits WGM spécifient un mode non PWM.
WGM2 (Wave Generation Mode for Timer2): Ces bits contrôlent la séquence de comptage du compteur, la source de la valeur maximale du compteur (TOP) et le type de génération de forme d'onde à utiliser.
COM2 (Compare Output Mode for Timer2): Ces bits contrôlent le comportement de sortie. La description complète des bits est expliquée ci-dessous.
TCCR2 - = (1 <
Réglez les bits WGM20 et WGM21 sur HIGH pour activer le mode rapide PWM. Le WGM signifie le mode de génération de forme d'onde. Les bits de sélection sont comme ci-dessous.
WGM00 |
WGM01 |
Fonctionnement du mode Timer2 |
0 |
0 |
Mode normal |
0 |
1 |
CTC (Clear Timer On Compare Match) |
1 |
0 |
PWM, phase correcte |
1 |
1 |
Mode PWM rapide |
Pour plus de détails sur le mode de génération de forme d'onde, vous pouvez consulter la fiche technique officielle d'Atmega16.
TCCR2 - = (1 <
De plus, nous n'avons utilisé aucune pré-mise à l'échelle, nous avons donc défini le registre de source d'horloge sur '001'.
Les bits de sélection d'horloge sont les suivants:
CS22 |
CS21 |
CS20 |
La description |
0 |
0 |
0 |
Aucune source d'horloge (minuterie / compteur arrêté) |
0 |
0 |
1 |
clk T2S / (pas de pré-mise à l'échelle) |
0 |
1 |
0 |
Clk T2S / 8 (de Prescaler) |
0 |
1 |
1 |
Clk T2S / 32 (de Prescaler) |
1 |
0 |
0 |
Clk T2S / 64 (de Prescaler) |
1 |
0 |
1 |
Clk T2S / 128 (de Prescaler) |
1 |
1 |
0 |
Clk T2S / 256 (du Prescaler) |
1 |
1 |
1 |
Clk T2S / 1024 (de Prescaler) |
OC2 est également effacé lors de la comparaison de correspondance en définissant le bit COM21 sur «1» et COM20 sur «0».
Les options de sélection du mode de sortie de comparaison (COM) pour le mode PWM rapide sont données ci-dessous:
COM21 |
COM21 |
La description |
0 |
0 |
Fonctionnement normal du port, OC2 déconnecté. |
0 |
1 |
Réservé |
1 |
0 |
Effacer OC2 lors de la comparaison, définir OC2 en haut |
1 |
1 |
Réglez OC2 sur le match de comparaison, effacez OC2 en haut |
Augmentez le cycle de service de 0% à 100% afin que la luminosité augmente avec le temps. Prenez la valeur de 0 à 255 et envoyez-la à la broche OCR2.
pour (duty = 0; duty <255; duty ++) // 0 au rapport cyclique maximum { OCR2 = duty; // augmente lentement la luminosité de la LED _delay_ms (10); }
De même, diminuez le cycle de service de 100% à 0% pour diminuer progressivement la luminosité de la LED.
pour (duty = 0; duty> 255; duty--) // max à 0 rapport cyclique { OCR2 = duty; // diminue lentement la luminosité de la LED _delay_ms (10); }
Ceci termine notre tutoriel sur l'utilisation de PWM dans Atmega16 / 32.