Académique Documents
Professionnel Documents
Culture Documents
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 !
Tension
capteur IR
1
Temps
0
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)
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
3
Inversion sortie
2
Temps (s)
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
TC=MR0 ! Evènement :
RAZ du compteur
Période de comptage = (MR+1)(PR+1).TCLK
Si on raisonne en fréquence :
f CLK
f événement
événement =
(PR+ 1)⋅( MR
(PR+1)⋅( MR+1)
+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 1 0
COMPTEUR (état dans le registre TC)
4
RAZ RAZ
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
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 …
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
Configurer le périphérique
1) Activer le Timer
registre PCONP
Par défaut :
- Timers 0 et 1 activés
- Timers 2 et 3 non activés
Exemple : LPC_TIM2->CTCR = 00 ;
② Régler le Prescaler : LPC_TIM2->PR = 0;
③ Régler le Compteur : LPC_TIM2->MR0 = 124; //fsortie=100 kHz
Si MR0
Pour configurer
un événement
sur la sortie
PWM1.1
PREDIVISION
CLK PWM1.2 PWM1.1
PWM PWM1.3
PWM1.4
PWM1.5 αTPWM
PWM1.6
TPWM
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
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
int main(void)
{
LPC_SC->PCONP = LPC_SC->PCONP | (1<<6); //active le périphérique PWM1
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
int main(void)
{
int nombre;
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
}