ATmega328 – Configuration du TIMER0

Les principales caractéristiques de ce timer sont les suivantes :

  • Deux sorties après comparaison indépendantes ;
  • Registres de sortie bufferisés (lecture stable pendant le comptage) ;
  • Réinitialisation du timer à la détection de l’égalité ;
  • PWM sans déphasage ;
  • PWM à période variable ;
  • Générateur de fréquence ;
  • 3 sources de d’interruption indépendantes.

Pour rappel, ci-dessous, le schéma des fonctions du TIMER0 ; il faut évidemment remplacer le n par 0.

Modulation en largeur d’impulsion (PWM rapide)

C’est l’usage le plus courant de ce timer, c’est donc la configuration qui est proposée en premier ici.

Dans ce mode de fonctionnement, le timer compte de manière incrémentale de 0 (BOTTOM) à une valeur TOP, puis se réinitialise à la valeur BOTTOM. Lorsqu’une des valeurs de comparaison est franchie (OCR0A ou OCR0B), la sortie associée change d’état ; de même lorsque la valeur du compteur atteint BOTTOM. Ainsi les sorties produisent des signaux de fréquence fixe et de rapport cyclique proportionnel à la valeur de comparaison (OCR0x).

Valeur maximum (TOP) du compteur

Pour contrôler le fonctionnement du timer, il faut d’abord choisir la valeur maximum (TOP) que peut atteindre le compteur au moyen des modes indiqués ci-dessous ; cela donne aussi la précision de la modulation :

ModeFonctionnementDescriptionWGM02,01,00
3Fast PWMCompte de 0 à 0xFF011
7Fast PWMCompte de 0 à OCRA111

Le numéro du mode doit être indiqué dans les registres TCCR0A et TCCR0B :

Registre TCCR0A :

Bit76543210
NomCOM0A1COM0A0COM0B1COM0B0--WGM01WGM00

Registre TCCR0B :

Bit76543210
NomFOC0AFOC0B--WGM02CS02CS01CS00

Horloge du compteur

Il faut ensuite paramétrer la source de l’horloge qui produit l’incrément du timer. En effet, le timer peut être cadencé, soit sur l’horloge interne, directe ou divisée, soit par une source externe appliquée à la broche T0. Le tableau suivant précise les valeurs à appliquer aux bits du registre TCCR0B en fonction de la source choisie :

CS02CS01CS00Description
000Pas de source (compteur arrêté)
001clkI/O (pas de division)
010clkI/O / 8 (pré-division)
011clkI/O / 64 (pré-division)
100clkI/O / 256 (pré-division)
101clkI/O / 1024 (pré-division)
110Source sur broche T0 ; sur front descendant
111Source sur broche T0 ; sur front montant

Registre TCCR0B :

Bit76543210
NomFOC0AFOC0B--WGM02CS02CS01CS00

Comportement des sorties

Enfin, il faut préciser le comportement attendu des broches de sortie (OC0A & OC0B) lors des changements d’état, à savoir :

COM0A1COM0A0Description
00Fonctionnement normal du port ; OC0A déconnectée
01WGM02 = 0 : fonctionnement normal du port ; OC0A déconnectée
WGM02 = 1 : bascule de OC0A lors de la détection d’égalité ;
10OC0A = 0 : lors de la détection d’égalité ;
OC0A = 1 : lorsque le compteur passe à 0 (BOTTOM)
(mode non-inversé)
11OC0A = 1 lors de la détection d’égalité ;
OC0A = 0 lorsque le compteur passe à 0 (BOTTOM)
(mode inversé)
COM0B1COM0B0Description
00Fonctionnement normal du port ; OC0B déconnectée
01Réservé
10OC0B = 0 lors de la détection d’égalité ;
OC0B = 1 lorsque le compteur passe à 0 (BOTTOM)
(mode non-inversé)
11OC0B = 1 lors de la détection d’égalité ;
OC0B = 0 lorsque le compteur passe à 0 (BOTTOM)
(mode inversé)

Les modes de fonctionnement des broches de sortie doivent être indiqués dans le registre TCCR0A :

Bit76543210
NomCOM0A1COM0A0COM0B1COM0B0--WGM01WGM00

Interruptions

Il est aussi possible d’utiliser des interruptions qui sont déclenchées lors des phases d’égalité du compteur avec les registres de comparaison (OCR0A & OCR0B) ou lorsque le compteur se réinitialise de TOP à BOTTOM (overflow).

Modulation en largeur d’impulsion sans déphasage

Dans ces modes, le compteur compte, puis décompte et les changements d’état des sorties n’ont lieu qu’à légalité entre le compteur et la valeur de référence. Ainsi la modulation reste symétrique et phasée quelque soit la valeur de référence retenue. Le contre-partie de ces modes et que la fréquence de modulation est 2 fois plus faible que pour une modulation PWM « rapide ». Pour le reste, le comportement du timer0 dans ces modes est identique au fonctionnement en PWM rapide.

Valeur maximum (TOP) du compteur

Pour contrôler le fonctionnement du timer, il faut d’abord choisir la valeur maximum (TOP) que peut atteindre le compteur au moyen des modes indiqués ci-dessous ; cela donne aussi la précision de la modulation :

ModeFonctionnementDescriptionWGM02,01,00
1PWM sans déphasageCompte de 0 à 0xFF001
5PWM sans déphasageCompte de 0 à OCRA101

Le numéro du mode doit être indiqué dans les registres TCCR0A et TCCR0B :

Registre TCCR0A :

Bit76543210
NomCOM0A1COM0A0COM0B1COM0B0--WGM01WGM00

Registre TCCR0B :

Bit76543210
NomFOC0AFOC0B--WGM02CS02CS01CS00

Horloge du compteur

Il faut ensuite paramétrer la source de l’horloge qui produit l’incrément du timer. En effet, le timer peut être cadencé, soit sur l’horloge interne, directe ou divisée, soit par une source externe appliquée à la broche T0. Le tableau suivant précise les valeurs à appliquer aux bits du registre TCCR0B en fonction de la source choisie :

CS02CS01CS00Description
000Pas de source (compteur arrêté)
001clkI/O (pas de division)
010clkI/O / 8 (pré-division)
011clkI/O / 64 (pré-division)
100clkI/O / 256 (pré-division)
101clkI/O / 1024 (pré-division)
110Source sur broche T0 ; sur front descendant
111Source sur broche T0 ; sur front montant

Registre TCCR0B :

Bit76543210
NomFOC0AFOC0B--WGM02CS02CS01CS00

Comportement des sorties

Enfin, il faut préciser le comportement attendu des broches de sortie (OC0A & OC0B) lors des changements d’état, à savoir :

COM0A1COM0A0Description
00Fonctionnement normal du port ; OC0A déconnectée
01WGM02 = 0 : fonctionnement normal du port ; OC0A déconnectée
WGM02 = 1 : bascule de OC0A lors de la détection d’égalité ;
10OC0A = 0 : lors de la détection d’égalité en incrémentant ;
OC0A = 1 : lors de la détection d’égalité en décrémentant.
11 OC0A = 0 : lors de la détection d’égalité en décrémentant ;
OC0A = 1 : lors de la détection d’égalité en incrémentant.
COM0B1COM0B0Description
00Fonctionnement normal du port ; OC0B déconnectée
01Réservé
10OC0B = 0 : lors de la détection d’égalité en incrémentant ;
OC0B = 1 : lors de la détection d’égalité en décrémentant.
11OC0B = 0 : lors de la détection d’égalité en décrémentant ;
OC0B = 1 : lors de la détection d’égalité en incrémentant.

Les modes de fonctionnement des broches de sortie doivent être indiqués dans le registre TCCR0A :

Bit76543210
NomCOM0A1COM0A0COM0B1COM0B0--WGM01WGM00

Interruptions

Il est aussi possible d’utiliser des interruptions qui sont déclenchées lors des phases d’égalité du compteur avec les registres de comparaison (OCR0A & OCR0B) ou lorsque le compteur se réinitialise de TOP à BOTTOM (overflow).