TP 3 : PWM & ADC
Chapitres utiles du datasheet ATmega324P
-
- Configuration des broches - section 1.1, page 15
-
- Timer/Compteur0 8 bits avec PWM - section 16.9, page 140
-
- Timer/Compteur1 16 bits avec PWM - section 17.14, page 173
-
- Timer/Compteur2 8 bits avec PWM et fonctionnement asynchrone - section 19.11, page 202
1. Modulation de largeur d’impulsion (PWM)
La PWM (Pulse Width Modulation) est une technique utilisée pour contrôler la tension appliquée à un dispositif électronique en le commutant rapidement entre les états ON et OFF.
Cette commutation rapide produit une tension moyenne déterminée par le temps pendant lequel le signal reste ON par rapport à la durée totale du cycle — ce rapport est appelé le rapport cyclique (duty cycle).
PWM permet un contrôle numérique de signaux analogiques, par exemple :
- Diminuer la luminosité d’une LED
- Modifier la couleur des LED RGB
- Ajuster la fréquence d’un buzzer
- Régler la vitesse d’un moteur
1.1. Principe de fonctionnement
Le rapport cyclique est exprimé en pourcentage du temps ON par rapport à la durée totale du cycle :
La tension moyenne reçue par un dispositif est :
Les signaux PWM sont généralement générés par des circuits numériques et des microcontrôleurs. L’ATmega324 utilise un compteur qui se réinitialise périodiquement et compare sa valeur à une référence (OCRn). Lorsque le compteur dépasse cette valeur, la sortie PWM change d’état.
🛠️ PWM via logiciel ?
La PWM peut aussi être implémentée en logiciel via :
- Bit-banging
- Timers avec ISR
Mais pour des PWM haute fréquence (par exemple en kHz pour les moteurs), la PWM matérielle est bien plus efficace car elle évite une surcharge CPU due aux interruptions fréquentes.
2. PWM sur les microcontrôleurs AVR
Dans le TP précédent, nous avons vu que l’ATmega324 possède trois timers :
Timer0(8 bits)Timer1(16 bits)Timer2(8 bits)
Chaque timer peut être configuré via les registres TCCRnA et TCCRnB, en utilisant les bits WGMnx pour choisir le mode :
- Normal
- CTC (Clear Timer on Compare Match)
- Fast PWM (utilisé aujourd’hui !)
- Phase Correct PWM, etc.
Chaque timer possède deux canaux de comparaison : OCnA et OCnB, reliés à des broches physiques spécifiques.
Aujourd’hui, nous allons nous concentrer sur le mode Fast PWM, adapté à des applications courantes comme le contrôle de luminosité ou la vitesse d’un moteur.
Fast PWM
En mode Fast PWM, le timer compte uniquement sur le front montant de l’horloge. Les modifications du rapport cyclique sont immédiates, mais le signal n’est pas centré — des décalages peuvent apparaître.
Modes disponibles pour Timer1 :
- Fast PWM 8 bits : TOP = 0x00FF
- Fast PWM 9 bits : TOP = 0x01FF
- Fast PWM 10 bits : TOP = 0x03FF
- Fast PWM avec TOP dans
ICR - Fast PWM avec TOP dans
OCRnA
Dans ce TP, nous utiliserons uniquement le mode Fast PWM 8 bits.
Supposons que Timer1 soit configuré en Fast PWM :
- Avec le mode
10pourCOM1A1:COM1A0, la sortieOC1Areste HIGH jusqu’au seuil, puis LOW. - Pour un rapport cyclique de
x%:OCR1A = x * TOP / 100
Exemple : Timer1 en Fast PWM 8 bits
/* OC1A est PD5, doit être configuré en sortie */
DDRB |= (1 << PD5);
/* Mode Fast PWM 8 bits */
TCCR1A = (1 << WGM10);
TCCR1B = (1 << WGM12);
/* Mode non-inversé */
TCCR1A |= (1 << COM1A1);
/* Prescaler 1024 */
TCCR1B |= (1 << CS12) | (1 << CS10);
/* Rapport cyclique 50% */
OCR1A = 127;
Convertisseur Analogique-Numérique (ADC)
Ce TP vise à vous familiariser avec le convertisseur ADC intégré dans l’ATmega324P.
1. Mesure de signaux analogiques
Pour mesurer des signaux analogiques dans un système numérique, il faut les convertir en valeurs numériques discrètes.
Un ADC est un circuit qui convertit une tension analogique en valeur numérique.
Une caractéristique clé est la résolution, exprimée en bits, qui indique le nombre de valeurs possibles (2^N).
Exemple :
- ADC 10 bits → 1024 valeurs
- Plage 0–5V → résolution ≈ 4.8 mV
Théorème de Nyquist
Pour reproduire un signal sans perte : ➡️ fréquence d’échantillonnage ≥ 2 × fréquence maximale
Exemples :
- Voix : 20–4000 Hz
- Téléphone : 8000 Hz
- CD audio : 44100 Hz
Résolution
- 8 bits → 256 niveaux
- 0–5V → ≈ 0.0195 V par niveau
Fréquence d’échantillonnage
- Doit respecter Nyquist
- Sinon → aliasing
2. ADC du ATmega324P
- ADC à approximation successive
- Résolution jusqu’à 10 bits
- 8 entrées analogiques (port A)
- Gain configurable : 1x, 10x, 200x
Registres :
ADCSRA,ADCSRB(contrôle)ADMUX(sélection entrée + référence)
Résultat sur 10 bits → stocké en 2 registres (low + high)
Formules :
ADC = V_in * 1024 / V_ref
V_in = ADC * V_ref / 1024
Tension de référence
- AVCC
- Interne (1.1V / 2.56V)
- Externe (AREF)
Prescaler
F_ADC = F_CPU / PRESCALER
- Valeurs : 2 → 128
- Plus grand = plus précis
Modes de fonctionnement
- Conversion simple
- Mode continu
- Déclenchement externe
- Mode comparateur
- Mode timer
Exemple
ADMUX = 0;
ADMUX |= (1 << MUX0);
ADMUX |= (1 << REFS0);
ADCSRA = 0;
ADCSRA |= (7 << ADPS0);
ADCSRA |= (1 << ADEN);
Lecture :
ADCSRA |= (1 << ADSC);
while (ADCSRA & (1 << ADSC));
uint16_t result = ADC;
3. Exercices
- Travail en laboratoire
- Devoir
Objectif : contrôler une LED RGB via PWM. starter project ZIP
Connexions :
- Rouge :
PD5 - Vert :
PD7 - Bleu :
PB3
LED en anode commune (actif à l’état bas)
Tâche 1
- Exécuter le projet
- Observer le comportement
Tâche 2
Allumer la LED verte via interruptions.
Tâche 3
Implémenter analogRead() :
- Conversion simple
- Bloquante
- Retour valeur
Tâche 4
Lire capteur température (PA0)
Tâche 5 (Bonus)
Jouer une mélodie avec Timer1
4. Liens utiles