Stm8 Temporisateurs / Timers
Pile
18/09/2019
Le besoin et les temporisateurs du STM8S105
Toutes les applications embarquées se caractérisent par l'obligation de répondre à un événement donné par une action appropriée dans un délai déterminé. Le temps est un élément essentiel à maîtriser, ce qui fait que l'on peut aussi parler d'application temps réel ou de logiciel temps réel.
Cette prise en compte du temps passent généralement par l'utilisation de "compteur de temps", ce que l'on appelle un temporisateur ou timer. Certaines applications nécessitent de réserver l'usage de lignes d'entrée-sortie à un sous-compteur d'un temporisateur, un canal.
Ces compteurs de temps sont de simples compteurs qui comptent des événements si ces événements sont des fronts montants d'une horloge on a un compteur de temps, mais on peut compter toute sorte d'événement comme des passages d'objets, des accélérations brusques, etc.
En utilisant ces temporisateurs, on libère le cœur du processeur de la surveillance permanente de donnée externe; pour un micro-contrôleur, la mise à disposition de nombreux timers réduit le besoin de puissance de calcul et permet donc d'obtenir un produit plus économique.
Par exemple dans la famille STM32 il peut y avoir jusqu’à 14 temporisateurs dont certains sont cascadables.
Lors de l'étude de l'utilisation d'un temporisateur, il est nécessaire d’identifier précisément l'étendue de ce que l'on va compter (le maximum du comptage), comment on commence à compter et comment on arrête de compter.
Le microcontrôleur STM8S105C6 est équipé de 4 temporisateurs de performances différentes:
- Timer 1 - Advanced control timer
- compteur 16 bits,
- performances avancées,
- prescaler de 16 bits,
- connexions directes possibles avec 10 lignes GPIO.
- Timer 2 - General purpose timer
- compteur 16 bits,
- prescaler de 4 bits,
- connexions directes possibles avec 3 lignes GPIO.
- Timer 3 - General purpose timer
- compteur 16 bits,
- prescaler de 4 bits,
- connexions directes possibles avec 2 lignes GPIO.
- Timer 4 - Basic timerApplication à la m
- compteur 8 bits,
- fonctions de base,
- prescaler de 3 bits,
- aucune connexion directe avec des lignes GPIO.
=Principe de fonctionnement=
Un temporisateur est un élément capable de compter des événements "entrants" dans un registre et de générer des événements "sortants" en fonction de caractéristiques de fonctionnement.
Complémentairement il peut être contrôlé par un élément externe, générer des événements à destination d'autres éléments. L'élément principal est un compteur que l'on peut lire et modifier. Prenons des exemples simples
- Comptage du nombre de personnes entrant dans une salle de spectacle
- Les événements entrants sont émis par le capteur de détection de passage par exemple un signal haut pendant 10 ms chaque fois qu'un spectateur entre dans la salle.
- On peut connaître le nombre de spectateur en lisant le compteur de registre
- On peut lever une interruption lorsque le compteur atteint le nombre maximum de spectateur de la salle
- Détection du passage d'un spectateur lent entrant dans la salle
- Les événements entrants vont être les tops d'une horloge par exemple toutes les milli-secondes,
- on va commencer quand le spectateur commence à interrompre un faisceau lumineux à l'entrée de la salle
- et on arrête de compter lorsque le faisceau lumineux n'est plus interrompu
- la durée de passage peut alors être lue dans le compteur du temporisateur
- Commande d'un servomoteur par PWM
- Une horloge entrante va définir la période de base du signal modulé en largeur d'impulsion
- Un canal (sous-compteur) va être dédié à ce servomoteur, le registre du canal définit la longueur de l'impulsion à appliquer
- Lorsque l'horloge entrante a un front montant le temporisateur charge le compteur du canal avec la consigne de largeur d'impulsion, et met la ligne à 1
- Lorsque le compteur du canal atteint 0, le temporisateur remet la ligne à 0
- Acquisition d'un signal PWM
- Les événements entrants vont être les tops d'une horloge par exemple toutes les milli-secondes,
- Lorsque le signal PWM a un front montant, on active le comptage de tops dans le compteur du canal associé à la ligne à partir de 0
- Lorsque le signal PWM a un front descendant, on arrête le comptage de tops, la lecture du compteur du canal associé donne la largeur d'impulsion du signal PWM.
Certains temporisateurs sont cascadables (cf.Doc.technique), ce qui permet de générer des signaux complexes sans programmation en temps réel.
[/doc/19/09/bTc@3etW.svg]
L'usage le plus courant d'un temporisateur est le comptage d'impulsion de période constante, typiquement d'une horloge, pour obtenir une valeur numérique proportionnelle à la durée de comptage.===Procédure===
Dans cet exemple nous capturons les la valeur TIM1_CCR1 quand l'entrée TI1 est levé.
- Selection de l'entrée active: Par exemple pour lier le compteur de capture TIM1_CCR1 à l'entrée TI1, onécrit le sbits CC1S de TIM1__CCMR1 à 01, ce qui définit le canal correspondant en en trée et rend le registre en lecture seule.
- Programmation la durée de filtration du signal entré: Cela s'effectue pour chaque entrée en définissant les bits ICiF (TIM1_CCMRi). Par exemple si les signal d'entrée est instable pendant au plus 5 cycles de tMaster, alors la durée de filtration doit être supérieure à 5 cycles d'horloge. =Mesure de durée= La mesure consiste à déterminer combien de périodes d’un signal périodique sont comptées entre l’apparition du signal caractérisant le début de la durée et l’apparition de celui caractérisant sa fin. Le rôle du compteur est donc de déterminer cette valeur, pour cela il doit être mis en service au début de l’intervalle de temps et arrêté à la fin de cet intervalle. Il existe un signal de contrôle (CEN) qui laissera passer ou non les impulsions de l’horloge vers le compteur. Le processeur pourra alors faire le calcul de la durée en multipliant la valeur contenue dans le compteur par la période du signal périodique. Avant toute mise en opération, il faut déterminer la résolution de la mesure et sa valeur maximale. La résolution est la plus petite durée que l’on peut identifier dans une mesure. La résolution est définie par la période du signal, la valeur maximale dépend de la taille du compteur ( 8 ou 16 bits). Il peut exister des cas ou le comptage peut dépasser la capacité du compteur, l'examen de l'indicateur de débordement (UIF) est alors nécessaire afin de ne pas dépendre de valeur invalide. Pour les durées importantes il est nécessaire de prendre en compte l’indicateur de débordement UIF en comptabilisant le nombre de fois où cela se produit. =Génération de durée= La génération d'une durée repose sur le comptage d'un nombre requis de périodes élémentaires. Ce nombre est fourni au temporisateur avant le démarrage du comptage. Lorsque le contenu du compteur a atteint cette valeur le temporisateur signale que la durée est écoulée en positionnant l’indicateur UIF. Le temporisateur contient donc un comparateur binaire ( 8 ou 16 bits comme le compteur). La durée doit être définie avant la mise en œuvre du temporisateur. Cette durée, plus précisément le nombre d'impulsions correspondant à la durée, est chargé dans un registre spécifique ARR ("Auto Reload Register").
- Dès que le bit CEN est mis à 1 et donc que les impulsions sont appliquées à l’entrée du compteur le contenu du registre ARR est comparé en permanence au contenu du compteur.
- Lorsque la valeur du compteur dépasse celle du registre de référence le bit indicateur UIF est mis à 1 et le contenu du compteur est remis à 0.
- Cet indicateur UIF caractérise cet événement de fin de durée; il peut être utilisé comme source d’interruption.
Structure physique et constituants du timer
La fréquence d'un STM8S105C6T6 est de 16MHz, avec un compteur de 16 bits cadencé par l'horloge principale, on pourrait compter jusqu'à 65536/16MHz soit une durée maximale de 4ms. Dans de nombreux cas cela est inadapté, on active alors dans le temporisateur un diviseur de fréquence ("prescaler") en entrée qui va nous permettre de compter des puissances de 2 du signal entré.
Ce valeur du diviseur est définie dans le registre spécifique (PSCR) du timer.
En fonction des timers les caractéristiques du prescaler différent.
- Timer 1: prescaler sur 16 bits, autre mode de calcul
- Timer 2 et Timer 3: prescaler sur 4 bits [ 0 à 15 ]
- Timer 4: prescaler sur 3 bits [ 0 à 7 ]
Le calcul de la fréquence de comptage pour le timer 4 est :
PSCR [2:0] représente la valeur correspondant aux 3 bits de poids faibles du registre PSCR du Timer 4. Pour les timers 2 et 3, on prendrait les 4 bits de poids faibles du PSCR.
Exemple : PSCR contient 2 ( en binaire 010 ) donc F CK__CNT vaudra 2MHz / 4 soit 500 KHz. Note: 2 MHz est, par défaut, la fréquence du microcontrôleur lors de sa mise sous tension, elle peut ensuite être modifiée.
Le moment où la valeur du compteur dépasse celle du contenu du registre ARR est un événement très important appelé "Update event", il est physiquement caractérisé par le passage à 1 d’un indicateur d’état UIF [ "Update Interrupt Flag" ] du registre de status ( TIMx_SR) du timer.
Lors du traitement d'une interruption, le processeur peut tester ce drapeau pour identifier le timer qui a provoqué l'exécution de l'interruption.
Généralement on a la suite d'états suivants:
- le compteur est activé et compte les événements entrants, UIF est a 0
- le compteur dépasse la valeur de ARR, le bit UIF est mis à un, le compteur est remis à zéro et une interruption est levée
- si une interruption a été activée, la routine d'interruption teste les drapeaux UIF pour identifier le timer déclenchant, fait les actions propres à ce timer et remet à zéro le bit UIF. Il n'est pas obligatoire d'avoir une routine d'interruption, on peut très bien paramétrer un timer pour produire un signal périodique, dans ce cas le bit UIF n'est jamais remis à zéro. =Les registres du temporisateur= En fonction du type de temporisateur ( Advanced, general ou basic) le nombre de registres est différent. Les timers Basic disposent de 7 registres, mais les Advanced disposent eux de 32 registres. Les caractéristiques des registres eux-même différent (cf.PSCR) et seuls les documents de référence du constructeur les décrivent avec précision. Chaque timer dispose d'un ou deux registres d'états (TIMx_SRy), ils permettent de connaître l'état du timer, les événements qu'il a connu au travers de ses indicateurs d'état (bits du registre d'état) et ce indépendamment du fonctionnement du processeur. ==Les registres du Timer 4== L’exploitation du TIMER 4 se fait au travers de 7 registres :
- 2 de taille 8 bits pour les valeurs du compteur et de l’auto rechargement
- 1 de taille 5 bits pour le contrôle
- 1 de taille 3 bits pour la valeur du diviseur de fréquence
- 3 de taille 1 bit dont le registre d’état
TIM4_CR1 - Control Register 1
| 7 | 6 5 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|
| ARPE | Reserved | OPM | URS | UDIS | CEN |
| rw | r | rw | rw | rw | rw |
CR1[3] - OPM : One pulse mode
Indique si le compteur compte une seule fois (0x08) ou boucle indéfiniment (0x00). Bit à 1 : le compteur s’arrête de compter au prochain événement de mise à jour (UEV - Update EVent). Le bit CEN est alors remis à 0.
CR1[2] - URS : Update Request Source
Définit quand l'interruption peut être levée, à chaque actualisation ou au débordement/vidage du compteur Bit à 0: Si autorisée (bit UDIS à 0) la demande d’IT sur événement est générée dès que les registres sont actualisés (dont le débordement de compteur) Bit à 1 : Si autorisée (bit UDIS à 0) la demande d’IT UIF n’est générée que si le compteur déborde.
CR1[1] - UDIS : Update Disable
Permet de désactiver les événements de mise à jour.
Bit à 0 : un UEV est généré dès qu’un débordement se produit ou bien qu’un UEV logiciel est généré (par le bit UG du registre EGR). Les registres sont alors chargés avec leurs valeurs de pré chargement. Bit à 1 : Aucun UEV n’est généré, les registres masqués (ARR et PSC) conservent leurs valeurs. Le compteur et le prescaler ne sont réinitialisés que par logiciel au moyen du bit UG du registre EGR.
CR1[0] - CEN : Counter Enable
Bit à 0 : le compteur est arrêté. Bit à 1 : le compteur est en service : le signal de l’horloge de référence CK_PSC est appliqué au diviseur de fréquence [prescaler].
TIM4_IER - Interrupt Enable Register
-
IER[0] - UEI : Update interrupt enable
Bit à 0 : source d’interruption est masquée
TIM4_SR - Status Register
SR[0] UIF : Update Interrupt flag Ce bit est positionné par le comparateur dès que le contenu du compteur dépasse la valeur placée dans le registre ARR. Il est destiné à informer le processeur du débordement du compteur, en même temps le contenu du compteur est mis à 0. Le processeur doit ensuite impérativement remettre le bit UIF à 0.
Bit à 1 : positionné lorsque les registres sont réactualisés : • lors d’un débordement du compteur si le bit UDIS est à 0 • quand le compteur est rechargé par logiciel en utilisant la procédure logicielle au moyen du bit UG à condition que les bits URS et UDIS soient à 0.
TIM4_CNTR - Counter register
C’est la valeur binaire de 8 bits contenue dans le compteur. Pour les Timers 1, 2 et 3 ce registre est de 16 bits et est accessible en 2 fois 8 bits.
TIM_4 PSCR - Prescaler register
PSC 2 : valeur binaire de 3 bits contenue dans le registre prescaler Cette valeur divise par une puissance de 2 la fréquence de l’horloge de référence CK_PSC. La fréquence f CK_CNT de l’horloge du compteur vaut f CK_PSC / 2 PSC2
Tableau avec les valeurs de la fréquence f CK_CNT ou la période correspondante en fonction des valeurs du registre prescaler :
| PSC[ 2:0 ] | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| fMASTER 2MHz | 2 MHz | 1 MHz | 500 kHz | 250 kHz | 125 kHz | 62,5 kHz | 31,25 kHz | 15,625 kHz |
| 0,5 µs | 1 µs | 2 µs | 4 µs | 8 µs | 16 µs | 32 µs | 64 µs |
TIM4_ARR - Auto-reload register
Il contient la valeur de 8 bits qui est comparée régulièrement au contenu du compteur.
Pour les Timers 1, 2 et 3 ce registre est de 16 bits et est accessible en 2 fois 8 bits.
Pour écrire leurs contenus il est impératif d’écrire d’abord dans le registre de poids fort H puis dans celui de poids faible L.
Périodes de CK_CNT en fonction du contenu du registre PSCR pour les temporisateurs TIM2, TIM3 et TIM4 Pour une fréquence f MASTER de 2 MHZ
| Facteur de division | Valeur de PSCR | Période de CK_CNT |
|---|---|---|
| 1 | 0 | 0,5 µs |
| 2 | 1 | 1 µs |
| 4 | 2 | 2 µs |
| 8 | 3 | 4 µs |
| 16 | 4 | 8 µs |
| 32 | 5 | 16 µs |
| 64 | 6 | 32 µs |
| 128 | 7 | 64 µs |
| 256 | 8 | 128 µs |
| 512 | 9 | 256 µs |
| 1024 | A | 512 µs |
| 2048 | B | 1,02 ms |
| 4096 | C | 2,04 ms |
| 8192 | D | 4,08 ms |
| 16384 | E | 8,16 ms |
| 32768 | F | 16,32 ms |
Mise en œuvre de la capture d'entrée
Dans le mode de capturer d'entrée (Input Capture Mode), les registres de capture ou de comparaison (TIM1_CCRi) sont utilisé pour conserver la valeur du compteur quand une transition a été détectée sur le signal ICi correspondant.. Quan une capture s'effectue , le drapeau CCiIF (TIM1_SR1) est levé.
Une interruption peut-être levée si elle a été activée en positrionnant le bit CCiIE (TIM1_IER) correspondant. SI une capturer se produit alors que le drapeau CCiF est déjà levé alors le drapeau de sur-capture (Over-capture) CCiOF (TIM1_SR2) est levé. CCiF peut être rabaissé par loiciel en y écrivant un 0 ou en lisant l'octet de poids faible de la valeur capturée dans le registre TIMx_CCRiL. CCiOF est rabaissé en y écrivant 0.
Procédure
Dans cet exemple nous capturons les la valeur TIM1_CCR1 quand l'entrée TI1 est levé.
- Selection de l'entrée active: Par exemple pour lier le compteur de capture TIM1_CCR1 à l'entrée TI1, onécrit le sbits CC1S de TIM1__CCMR1 à 01, ce qui définit le canal correspondant en en trée et rend le registre en lecture seule.
- Programmation la durée de filtration du signal entré: Cela s'effectue pour chaque entrée en définissant les bits ICiF (TIM1_CCMRi). Par exemple si les signal d'entrée est instable pendant au plus 5 cycles de tMaster, alors la durée de filtration doit être supérieure à 5 cycles d'horloge. Les bits de filtration permettent de sélectionner 8 cycles en écrivant 0011 dans TIMx_CCMR1. Quand ce filtrage est paramétré une transition sur TI1 est valide que si 8 échantillons avec a nouvelle valeur ont été détectées (échantillonnées à la fréquence f_MASTER .
- Sélection du front de transition: par exemple mettre 0 au CC1P bit (TIM1_CCER1) pour un front montant.
- Paramétrage du prescaler: dans cet exemple la capture doit être effectuée à chaque transition valide, donc le prescaler est désactivé (ICPS (TIM1_CCER1) à 00.
- Activation de la capture du compteur en levant CC1E (TIM1_CCER1).
- Si nécessaire activer l'interruption associée en levant CC1IE (TIM1_IER). Quand une capture se produit :
- Le registre TIM1__CCR1 ( H et L) enregistrela valeur du compteur au moment de la transition
- Le drapeau CC1IF est levé; le drapeau de dépassement C1OF est levé si aumoins deux captures consecutives ont été effectuées avec le drapeau non rabaissé.
- Une interruption est éventuellement levée. Pour gérer le dépassement (CC1OF), il est conseillé de lire la valeur avant le drapeau de dépassement. Cela évite de perdre un dépassement se produisant après lecture du drapeau et avant lecture de la valeur. //Note: les interruptions de capture d'entrée (ICà peuvent être levées par logiciel en levant le bit correspondant CCiG (TIM1_EGR). ==Mesure d'impulsion d'un signal MLI== La mesure de la largeur d'impulsion d'un signal MLI ( Modulation de Largeur d'Imulsion ou PWM) est un cas particulier de mise en oeuvre de la capture d'entrée. Dans ce cas
- Deux signaux de capture d'entrée ICi sont liés à la même entrée de timer (TIi).
- Ces deux signaux d'entrée sont actifs sur des fronts opposés.
- Un de ces deux signaux est sélectionné en entrée de déclenchement et et le contrôleur d'horloge et déclenchement est configuré en mode déclenchement-reset. ===Procédure=== Dans cet exemple on obtient la période du signal dans TIM1_CCR1 et la durée haute dans TIM1_CCR2.
- TIM1_CCMR1.CC1S = 01b //CC1 channel is configured as input, IC1 is mapped on TI1FP1 (Timer Input 1 Filtered Prescaled) //
- TIM1_CCER1.CC1P = 0 TI1FP1 active on rising edge
- TIM1_CCMR2.CC2S = 10b TI1FP2 as active input of TIM1_CCR2
- TIM1_CCER1.CC2P = 1 Capture on a falling edge of TI1F or TI2F
- TIM1_SMCR.TS = 101b TIFP2 active on falling edge
- TIM1_SMCR.SMS = 100b clock/trigger controller in reset mode
- TM1_CCER1.CC1E = 1; TIM1_CCER1.CC2E = 1 enable the captures