Timers
Micropython permet d'utiliser les timers disponibles sur une carte donnée.
Les timers
La carte Pi Pico dispose d'un timer principal en base micro-seconde couplé à un compteur 64 bits, ce qui fait qu'il ne peut jamais avoir un dépassement (overflow pour 1000 ans à 1Mhz) (p. 557 datasheet RP2040)
Liens utiles
Description de l'objet Timer
Import
La classe Timer
est une classe du module machine
et s'importe avec :
from machine import Timer
Constructeur
Un objet timer se crée avec :
t1=Timer()
Note
Petite différence d'avec la Pyboard sur la Pi Pico : le constructeur ne prend pas de paramètre id
D'après le code source, la valeur de id est -1 par défaut, il s'agit d'un timer logiciel.
Voir : https://github.com/micropython/micropython/blob/master/ports/rp2/machine_timer.c
Fonctions
L'objet timer dispose de 2 fonctions, la fonction d'initialisation :
Initialisation
objTimer.init(*, mode=Timer.PERIODIC, freq=1, period=1, callback=None)
L'argument mode
défini le fonctionnement du Timer :
Timer.ONE_SHOT
: timer à "1 coup" qui appelle la fonction une seule fois quand le délai est écouléTimer.PERIODIC
: le timer tourne en boucle à la fréquence indiquée
L'argument freq
fréquence en hertz
L'argument period
fréquence en hertz
l'argument callback
: la fonction à appeler.
Exemple d'initialisation par la fréquence :
t1.init(freq=10, callback=namefonction) # appelle fonction à la fréquence de 10 hz
Exemple d'initialisation par la période :
t1.init(period=100, callback=namefonction) # appelle fonction à la fréquence de 10 hz (et donc période de 100ms)
Désactivation
objTimer.deinit()
Exemple d'utilisation
Faire clignoter une LED en utilisant un timer
L'avantage de cette façon de faire est de libérer le processeur le reste du temps.
Je conseille fortement de ne pas utiliser While(True) mais un timer pour toutes les opérations exécutées en boucle.
from machine import Pin, Timer
led=Pin(25,Pin.OUT) # la broche GP25 dispose d'une LED onboard
timer=Timer() # pas besoin préciser le timer
def loop(timer):
led.toggle()
# timer.init(freq=10, mode=Timer.PERIODIC, callback=tick)
timer.init(freq=10, callback=loop) # forme minimale
Bon à savoir
Une fois ce script lancé, la LED clignote, même si on ferme l'éditeur. Pour stopper le timer, il faut envoyer via l'interpréteur :
timer.deinit()
Ou bien reprogrammer la carte.
Génération de PWM
cf PWM
Génération fréquence fixe
cf tone
Interruption à intervalles régulier
todo