Vous êtes sur la page 1sur 34

MICROCONTROLEUR – LP SESAM :

Partie 3 – Périphérique « Timer »

Version 2.5
Mise à jour Octobre 2020
LibreOffice 6.1 - Debian
Pourquoi les Timers ?

Comment... :
– Fabriquer un signal horloge à fréquence programmable
d0 d1 d2 d3 d4 d5 d6 d7
– pour piloter une liaison série ?

Horloge TX
Registre à décalage
Parallèle-Série
t
émission
→ Solution possible avec une sortie TOR (GPIO) :
Mise à 1 → tempo → Mise à 0 → tempo → Mise à 1 → tempo... à l'infini !

Broche de
sortie du uC

Temps
0
Mais le uC doit gérer en permanence le signal de sortie !

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 2


Pourquoi les Timers ?

Comment... :
– Compter le nombre de pièces passant devant un capteur infra-rouge ?

→ Solution possible avec une entrée TOR (GPIO) :

Pièce=0 → scrutation → pièce=1 → scrutation → pièce=2 → scrutation... à l'infini !

Tension
capteur IR
1

Temps
0

Mais le uC doit en permanence scruter le signal d'entrée !


Et alors, quel est le problème ?

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 3


Pourquoi les Timers ?

On ne peut rien faire d'autre avec notre microcontrôleur… :-(
D’où l’intérêt d’un périphérique Timer « autonome » pour les fonctions de
création de signaux, comptage uC
→ le uC peut alors s’atteler à d’autres tâches GPIO
CPU
Timer


Les Timers peuvent s'occuper de ces tâches… et d'autres, comme créer
un signal PWM pour contrôler un moteur à courant continu, un
servoMoteur


Le Timer est réglé en début de programme, et après il se débrouille seul !


Notre Cortex M3 dispose de 4 Timers indépendants (TIMER 0/1/2/3 :
LPC_TIMn) et d’un Timer spécifique pour générer des PWM (LPC_PWM)

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 4


C'est quoi un Timer ?

C'est facile : un Timer est un compteur
De manière générale, un Timer « compte » ce qu'on lui présente sur
son entrée, et peut faire « une certaine action » quand il arrive à une
valeur fixée par l'utilisateur

Ce que l'on compte :


Horloge CLK du uC Sortie
ou TIMER (optionnelle)
signal venant d'un
capteur

Il faudra donc paramétrer le Timer pour lui dire quoi compter, et si


une sortie est nécessaire : on parle de mode de fonctionnement

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 5


Modes des Timers
Nous verrons dans ce cours 3 modes de fonctionnement :
mode « Timer »
→ Permet de générer un signal créneau (rapport cyclique fixe de 50%)
Signal d'entrée = Horloge uC, une broche est utilisée pour générer le signal de
sortie
mode « PWM »
→ Permet de générer un signal PWM (rapport cyclique variable)
Signal d'entrée = Horloge uC, une broche est utilisée pour générer le signal de sortie
mode « Compteur d’événements »
→ Permet de compter des fronts en entrée (« input capture »)
Signal d'entrée = Tension (venant d'un capteur), pas de sortie

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 6


Mode 1 : « Timer »
Objectif : Fabriquer en sortie un signal créneau de fréquence désirée

MATn.0

PREDIVISION
CLK
Sortie
TIMER n
MATn.1

MATn.2
Signal d'entrée : fréquence imposée
par l'horloge du uC MATn.3
(25 MHz)

• l'« action » est donc ici une modification de temps en temps d'une
sortie MATn du Timer n pour obtenir une allure de créneau

Comment fixer le « temps désiré » ?


• Ici, le compteur s’incrémente à chaque front montant d'une horloge
prédivisée, et comptera jusqu'à une valeur limite que l'on va régler

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 7


Mode 1 : « Timer »
Démarche : faire compter le Timer jusqu'à ce qu'il faille inverser l'état du
signal de sortie
Durée souhaitée de l'état haut ou bas
Compteur du
Timer (TC)
4 Valeur limite (à régler)

3
Inversion sortie
2

Période de référence (à régler)


1

Temps (s)

Il faut : → régler la durée d'une « marche » d'escalier : Prescaler PR


→ régler le nombre de « marches » avec la valeur limite : Match MR
LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 8
Prescaler ?
Le Prescaler prédivise la fréquence FCLK de l'horloge d'entrée pour obtenir la
fréquence de référence de comptage du Timer (=1/durée d'une marche)
→ on le fixe avec le registre 32 bits PR (par défaut : 0, valeur max 232-1)
Exemple : Prescaler du Timer 1 défini à 3 LPC_TIM1->PR = 3;
CLK (25 MHz)

PRESCALER (état dans le registre PC)

0 1 2 3 0 1 2 3 0 1 2 3 0 1 2

COMPTEUR (état dans le registre TC du Timer 1)


3 Période de référence = (PR+1).TCLK
2
1

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 9


Valeur limite ?
• Il reste alors à définir le nombre de « marches » du compteur : on fixe cette
valeur à l'aide d'un registre nommé Match Register (MRm)
• lorsque le compteur atteint la même valeur que celle placée dans MRm, il
se déclenche un événement dans le Timer

Exemple : Timer 1, MR2 défini à 10000 LPC_TIM1->MR2=10000;


• Quand il arrive à cette valeur, plusieurs actions sont possibles :
• stopper le Timer
• remettre le Compteur TC à 0
• modifier l’état d’une sortie Timer (MATn.m associée à MRm)
• déclencher une interruption

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 10


Un exemple SVP !
Exemple : PR = 1, MR0 = 4
Evénement = RAZ du compteur lorsqu’il y a correspondance avec MR0
TCLK
CLK

PRESCALER (état dans le registre PC)

0 1 0 1 0 1 0 1 0 1 0 1 0 1 0

COMPTEUR (état dans le registre TC)


4
Période de référence = (PR+1).TCLK
3
2
1

TC=MR0 ! Evènement :
RAZ du compteur
Période de comptage = (MR+1)(PR+1).TCLK

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 11


Fréquence des événements

A quelle fréquence se passent ces événements ?

Dans l’exemple précédent, le compteur est remis à 0 (et donc un


événement intervient) tous les 10 fronts montants d’horloge
Prescaler (PR=1) de 0 à 1  2 états
Compteur (MR=4) de 0 à 4  5 états 2*5=10

Si on raisonne en fréquence :
f CLK
f événement
événement =
(PR+ 1)⋅( MR
(PR+1)⋅( MR+1)
+1)

Rappel : pour nous FCLK = 25 MHz

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 12


Mode Timer : signal carré

Génération de Signal carré : événement = RAZ MATn.0
Signal de sortie de
fréquence désirée
compteur + inversion de l’état d’une des sorties
MATn.m
CLK

PRESCALER (état dans le registre PC)

0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
COMPTEUR (état dans le registre TC)
4
RAZ RAZ

Sortie MATn.0 inversion inversion

Période du signal créneau

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 13


Mode Timer : signal carré

La période du signal carré est alors le double de la période
des événements


Ou en terme de fréquence : 1
f carré= ⋅f⋅ févénement
événement
2

f CLK
f carré
carré==
2⋅( PR+1
2⋅(PR )⋅( MR+ 1)
+1)⋅(MR+1)
Dans l’exemple précédent avec une horloge de 25 MHz, le signal carré a
donc une fréquence de ……. MHz

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 14


Mode Timer : signal carré

En choisissant judicieusement les valeurs du Prescaler (PR)
et de la limite du Compteur (MR), on peut choisir la fréquence
du signal carré en sortie du Timer


Exemple : générer un signal carré à 100 kHz

25 ff CLK
25..10
10 CLK
66
( PR+1)⋅
(PR ( MR +1 )=
+1)⋅(MR+1)= = 3
=125
3 =125
22⋅f
⋅ f carré
carré 200 .10
.10
On pourrait choisir PR=0 et MR=124...
… Ou PR=4 et MR=24, ou PR=24 et MR=4, ou …

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 15


Mode Timer : signal carré

Généralement, on choisit la valeur la plus petite possible du
Prescaler PR et on en déduit ensuite MR


Avec les Timers 32 bits, on choisira « souvent » un Prescaler à 0.
La valeur MR pouvant aller jusqu’à 232-1, on en déduit alors une
valeur de (PR+1)*(MR+1) pouvant aller jusqu’à 232
cela mène alors à une fréquence de 2,9 mHz (période 343,6s)


Sauf dans le cas d'un signal carré désiré de fréquence plus
faible, on choisira donc de manière générale PR=0

Remarque : pour des uC 8 bits, la valeur de PR est par contre


souvent différente de 0… Avez-vous compris pourquoi ?
LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 16
Signal carré : en pratique
Rappel du Cours Partie 1 – page 18
Initialisation = 3 étapes nécessaires avant d’utiliser un périphérique
Pour économiser de l’énergie, les périphériques ne sont pas
nécessairement activés (en particulier chez ARM)
Activer le périphérique
INITIALISATION

Une broche d'un microcontrôleur est généralement


Configurer le mode des reliée à différents périphériques : il faut choisir la liaison
broches (GPIO, Timer...) avec le périphérique qui nous intéresse

Configurer le périphérique

Certains registres ont un rôle de configuration du


périphérique
Utiliser le périphérique
D'autres registres ont un rôle d’utilisation du périphérique

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 17


Activation du Timer

1) Activer le Timer
 registre PCONP

Par défaut :
- Timers 0 et 1 activés
- Timers 2 et 3 non activés

Exemple : activer le Timer 2

LPC_SC->PCONP = LPC_SC->PCONP | (1<<22);

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 18


Attribution des broches
2) Configurer une des broches en
mode MATn.m pour pouvoir
générer le signal carré
 registre PINSEL 0/1/2/… ou 9
Rappel : par défaut, toutes les broches fonctionnent en mode GPIO

Exemple : activer la broche P0.6 en mode MAT2.0 (Timer 2, sortie 0)


LPC_PINCON->PINSEL0 = LPC_PINCON->PINSEL0 | (3<<12);

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 19


Configuration du Timer
3) Configurer le périphérique
Pour la génération du signal carré, on doit ensuite procéder à
5 étapes :
- ① Choisir l'entrée du Timer  registre CTCR
- ② régler le Prescaler (0 par défaut)  registre PR
- ③ régler le Compteur pour déclencher un évènement après un
temps  registre MRm
- ④ RAZ du Compteur sur événement  bit MRmR
du registre MCR
- ⑤ inverser la sortie à chaque événement
 registre EMR

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 20


Entrée Timer = horloge CLK

① Faire varier TC (le compteur) en fonction de l'horloge prédivisée

Exemple : LPC_TIM2->CTCR = 00 ;

② Régler le Prescaler : LPC_TIM2->PR = 0;

③ Régler le Compteur : LPC_TIM2->MR0 = 124; //fsortie=100 kHz

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 21


Remise à zéro du Timer

④ Registre MCR : configure l’action à faire lorsque le compteur TC
arrive à la valeur de MRm

Si MR0

bits 3, 4, 5 : MR1 I/R/S


rem : Si l'on veut utiliser MR1/2/3 bits 6, 7, 8 : MR2 I/R/S
bits 9, 10, 11 : MR3 I/R/S
Exemple : LPC_TIM2->MCR |= 1<<1 ; …………………………………

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 22


Inversion de la sortie

⑤Registre MCR : configure l’action à faire lorsque le compteur TC
arrive à la valeur de MRm
Si MR0

Pour configurer
un événement
sur la sortie

Exemple : LPC_TIM2->EMR |= 3<<4 ; …………………………………

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 23


Synthèse : signal carré
4) Et enfin… Utiliser le périphérique
Après la configuration, on lance le Timer avec le registre TCR = 1
Synthèse : générer un signal carré de 100kHz sur P0.6 (donc en mode
MAT2.0 : Timer 2, sortie 0) → choix : P=0, N=124
int main(void)
{
LPC_SC->PCONP = LPC_SC->PCONP | (1<<22); //active le Timer 2

LPC_PINCON->PINSEL0 = LPC_PINCON->PINSEL0 | (3<<12); //P0.6 en mode MAT2.0

LPC_TIM2->CTCR = 0; //on compte des périodes d'horloge


LPC_TIM2->PR = 0; //Prescaler à 0
LPC_TIM2->MR0 = 124; //valeur de N
LPC_TIM2->MCR = LPC_TIM2->MCR | (1<<1); //RAZ du compteur si correspondance avec MR0
LPC_TIM2->EMR = LPC_TIM2->EMR | (3<<4); //inverse la sortie MAT2.0 à chaque évènement

LPC_TIM2->TCR = 1; //démarre le comptage du Timer


while (1) {} //ici on ne fait rien… mais on pourrait utiliser la CPU qui est libre !
return 0 ;
}

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 24


Mode2 : PWM

Principe de fonctionnement du mode PWM

PWM1.1

PREDIVISION
CLK PWM1.2 PWM1.1

PWM PWM1.3
PWM1.4
PWM1.5 αTPWM
PWM1.6
TPWM

Il s’agit d’un périphérique très similaire au périphérique Timer vu


précédemment, avec des registres similaires :
- PR, MRm, MCR, CTCR, TCR…
Remarque : Toutes les PWM générées ont la même fréquence

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 25


Fréquence de découpage

On étudiera dans ce cours le type de PWM suivant :
COMPTEUR (état dans le registre TC)

0 1 2 … 98 99 0 1 2 … 98 99 0 1 2 …
PWM1

TPWM
(ici MR0 = 99)
 Réglage de la fréquence de découpage fPWM :
– correspondance du compteur TC avec MR0 (et RAZ de TC) : le signal passe
à1
– (idem fonctionnement « Timer » vu précédemment)
f CLK
ff PWM = CLK
PWM =(PR+1)⋅(MR 0+1)
≠ de la formule mode Timer :
( PR+1 )⋅( MR 0 +1) pas de 2 au dénominateur

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 26



Rapport cyclique
COMPTEUR (état dans le registre TC)

0 1 2 … 98 99
Le rapport cyclique α est fixé en
PWM1
réglant le MRm pour faire passer la
sortie m associée à 0
(ici MR1 = 2)

Relation entre valeur MRm (m=1...6) et rapport cyclique :

( MRm+1 )=α⋅(
(MRm+1)=α MR 0+1)
⋅(MR 0+1)

Par exemple, pour avoir un rapport cyclique de 30%, il faudra choisir
:
MRm=0,3⋅(⋅(MR
MRm=0,3 MR 0+1
0+1)−1
)−1

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 27


Activation des sorties PWM
registre PCR

Pour choisir les


PWM alignées
(« single » pour
nous)

Pour activer les


sorties PWM

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 28


Synthèse : Mode PWM
• Etapes de configuration pour le mode PWM :
– Exactement les mêmes qu’en mode Timer pour générer un signal carré, sauf
pour le registre EMR (inversion du signal à chaque événement) remplacé
par le registre PCR (diapo précédente)

1. Activer le périphérique PWM1 : registre PCONP


2. Sélectionner le mode PWM pour les broches : registre PINSEL
3. Configuration
Mode du Timer « entrée = horloge » : registre CTCR
Fréquence et rapport cyclique : registres PR, MR0, MRm
RAZ du compteur quand correspondance avec MR0 : registre MCR
Activer les sorties PWM : registre PCR
4. Démarrer le comptage : registre TCR

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 29


Synthèse : Mode PWM

Synthèse : générer un signal PWM de 20kHz, rapport cyclique de
25% sur P2.2 (PWM1.3)
→ choix : PR=0, MR0=1249, MR3=0,25*1249=312

int main(void)
{
LPC_SC->PCONP = LPC_SC->PCONP | (1<<6); //active le périphérique PWM1

LPC_PINCON->PINSEL4 = LPC_PINCON->PINSEL4 | (1<<4); //P2.2 en mode PWM1.3

LPC_PWM1->CTCR = 0; //on compte des périodes d'horloge


LPC_PWM1->PR = 0; //Prescaler à 0
LPC_PWM1->MR0 = 1249; //valeur max du comptage pour période PWM
LPC_PWM1->MR3 = 312; //pour le rapport cyclique de 25% sur la sortie 3
LPC_PWM1->MCR = LPC_PWM1->MCR | (1<<1); //RAZ du compteur si correspondance avec MR0
LPC_PWM1->PCR = LPC_PWM1->PCR | (1<<11); //active la sortie PWM1.3

LPC_PWM1->TCR = 1; //démarre le comptage du Timer


return 0 ;
}

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 30


Mode 3 : Compteur d’événements
Principe de fonctionnement
CLK

CAPn.0 TIMER n
CAPn.1

Signal d'entrée :
signal venant d'un capteur TOR Interruption (optionnel)


Il y a toujours un signal d’horloge en entrée du TIMER qui permet
« d’échantillonner » le signal sur les entrées CAPn.m

A chaque front montant de l’horloge, le TIMER regarde l’état de l’entrée
sélectionnée, et vérifie si elle a changé (présence d'un front)

L’état d’une entrée CAPn.m doit durer au minimum 40ns (1/25MHz) pour
être certain de détecter un front

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 31


Activation des broches
2) Configurer une des broches (d'entrée) en mode CAPn.m pour pouvoir
acquérir le signal d'un capteur
 registres PINSEL 0/1/2/… ou 9

Exemple : activer la broche P0.5 en mode CAP2.1 (Timer 2, entrée 1)


LPC_PINCON->PINSEL0 = LPC_PINCON->PINSEL0 | (3<<10);

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 32


Entrée Timer = signal extérieur

Incrémentation du Compteur (plus de Prescaler dans ce mode) si
Front Montant, Descendant ou les 2 sur la voie choisie

Choix de la voie d’entrée (voie 0 ou voie 1)  Registre CTCR

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 33


Synthèse : Compteur d’événements
Synthèse : compter les fronts montants de P0.5 (CAP2.1 : Timer 2,
voie 1)

int main(void)
{
int nombre;

LPC_SC->PCONP = LPC_SC->PCONP | (1<<22); //active le Timer 2

LPC_PINCON->PINSEL0 = LPC_PINCON->PINSEL0 | (3<<10); //P0.5 en mode CAP2.1

LPC_TIM2->CTCR = 0x05; //mode compteur de fronts montants sur la voie 1

LPC_TIM2->TCR = 1; //démarre le comptage du Timer

while(1)
{
nombre=LPC_TIM2->TC; //stocke le nombre de fronts montants dans la variable ‘nombre’
}
return 0 ;
Le registre TC contient la valeur actuelle du compteur
}

LP SESAM - Cours µContrôleur n°3 : Utilisation des Timers 34

Vous aimerez peut-être aussi