class Timer – contrôle des minuteurs internes¶
Les minuteurs peuvent servir à une grande variété de tâches. Pour l’instant, seul le cas le plus simple est implémenté : appeler une fonction de façon périodique.
Chaque minuteur est constitué d’un compteur qui s’incrémente à un certain rythme. Ce rythme correspond à la fréquence d’horloge du périphérique (en Hz) divisée par le prédiviseur du minuteur. Lorsque le compteur atteint la période du minuteur, il déclenche un événement et le compteur est réinitialisé à zéro. En utilisant la méthode callback, l’événement du minuteur peut appeler une fonction Python.
Exemple d’utilisation pour faire clignoter une LED à une fréquence fixe
tim = pyb.Timer(4) # create a timer object using timer 4
tim.init(freq=2) # trigger at 2Hz
tim.callback(lambda t:pyb.LED(1).toggle())
Exemple utilisant une fonction nommée pour la fonction de rappel
def tick(timer): # we will receive the timer object when being called
print(timer.counter()) # show current timer's counter value
tim = pyb.Timer(4, freq=1) # create a timer object using timer 4 - trigger at 1Hz
tim.callback(tick) # set the callback to our tick function
Autres exemples
tim = pyb.Timer(4, freq=100) # freq in Hz
tim = pyb.Timer(4, prescaler=0, period=99)
tim.counter() # get counter (can also set)
tim.prescaler(2) # set prescaler (can also get)
tim.period(199) # set period (can also get)
tim.callback(lambda t: ...) # set callback for update interrupt (t=tim instance)
tim.callback(None) # clear callback
Remarque : Timer(1) est utilisé pour la caméra. De même, Timer(5) commande le pilote de servomoteur, et Timer(6) est utilisé pour la lecture/écriture temporisée de l’ADC/DAC. Il est recommandé d’utiliser les autres minuteurs dans vos programmes.
Remarque : La mémoire ne peut pas être allouée pendant une fonction de rappel (une interruption) et, par conséquent, les exceptions levées dans une fonction de rappel ne donnent pas beaucoup d’informations. Consultez micropython.alloc_emergency_exception_buf() pour savoir comment contourner cette limitation.
Constructeurs¶
- class pyb.Timer(id: int, *args, **kwargs)¶
Construit un nouvel objet minuteur avec l’identifiant donné. Si des arguments supplémentaires sont fournis, le minuteur est initialisé par
init(...). L’ensemble des valeursidvalides dépend du MCU STM32 de l’OpenMV Cam utilisée ; consultez le manuel de référence STM32 pour connaître les minuteurs polyvalents et de contrôle avancé disponibles.Méthodes¶
- init(*, freq: int | float | None = None, prescaler: int | None = None, period: int | None = None, mode: int = Timer.UP, div: int = 1, callback: Callable[[Timer], None] | None = None, deadtime: int = 0, brk: int = Timer.BRK_OFF, hard: bool = True) None¶
Initialise le minuteur. L’initialisation doit se faire soit par fréquence (en Hz), soit par prédiviseur et période
tim.init(freq=100) # set the timer to trigger at 100Hz tim.init(prescaler=83, period=999) # set the prescaler and period directly
Arguments nommés :
freq— spécifie la fréquence périodique du minuteur. Vous pouvez également la voir comme la fréquence à laquelle le minuteur effectue un cycle complet.prescaler[0-0xffff] - spécifie la valeur à charger dans le registre de prédiviseur (PSC) du minuteur. La source d’horloge du minuteur est divisée par(prescaler + 1)pour obtenir l’horloge du minuteur. La source d’horloge provient du bus APB parent du minuteur et dépend du MCU. Sur STM32, les minuteurs sur APB1 cadencent généralement à2 * pclk1et les minuteurs sur APB2 à2 * pclk2; lisez les fréquences de bus actuelles avecpyb.freq()et consultez le manuel de référence STM32 du MCU de votre OpenMV Cam.period[0-0xffff] pour les minuteurs 1, 3, 4 et 6-15. [0-0x3fffffff] pour les minuteurs 2 et 5. Spécifie la valeur à charger dans le registre de rechargement automatique (ARR) du minuteur. Cela détermine la période du minuteur (c.-à-d. le moment où le compteur recommence un cycle). Le compteur du minuteur effectuera un débordement aprèsperiod + 1cycles d’horloge du minuteur.modepeut être l’un des suivants :Timer.UP- configure le minuteur pour compter de 0 jusqu’à ARR (par défaut)Timer.DOWN- configure le minuteur pour compter de ARR jusqu’à 0.Timer.CENTER- configure le minuteur pour compter de 0 jusqu’à ARR, puis redescendre jusqu’à 0.
divpeut valoir 1, 2 ou 4. Divise l’horloge du minuteur pour déterminer l’horloge d’échantillonnage utilisée par les filtres numériques.callback- comme pour Timer.callback()deadtime- spécifie la durée de temps « mort » ou inactif entre les transitions sur des canaux complémentaires (les deux canaux seront inactifs pendant cette durée).deadtimepeut être un entier compris entre 0 et 1008, avec les restrictions suivantes : 0-128 par pas de 1, 128-256 par pas de 2, 256-512 par pas de 8 et 512-1008 par pas de 16.deadtimemesure des tics desource_freqdivisé par les tics d’horlogediv.deadtimen’est disponible que sur les minuteurs 1 et 8.brk- spécifie si le mode de coupure (break) est utilisé pour interrompre la sortie du PWM lorsque l’entréeBRK_INest activée. La valeur de cet argument détermine si la coupure est activée et quelle en est la polarité, et peut valoirTimer.BRK_OFF,Timer.BRK_LOWouTimer.BRK_HIGH. Pour sélectionner la brocheBRK_IN, construisez un objet Pin avecmode=Pin.ALT, alt=Pin.AFn_TIMx. Les fonctionnalités d’entrée GPIO de la broche sont disponibles en mode alterné -pull=,value()etirq().hardpeut être l’un des suivants :True- La fonction de rappel sera exécutée dans un contexte d’interruption matérielle, ce qui minimise le délai et la gigue mais est soumis aux limitations décrites dans Écriture de gestionnaires d’interruption, notamment l’impossibilité d’allouer sur le tas.False- La fonction de rappel sera planifiée comme une interruption logicielle, ce qui lui permet d’allouer mais peut aussi introduire des délais de ramasse-miettes et de la gigue.
La valeur par défaut de cette option est True.
Vous devez spécifier soit freq, soit à la fois period et prescaler.
- deinit() None¶
Désinitialise le minuteur.
Désactive la fonction de rappel (et l’irq associée).
Désactive toutes les fonctions de rappel de canal (et les irq associées). Arrête le minuteur et désactive le périphérique minuteur.
- callback(fun: Callable[[Timer], None] | None) None¶
Définit la fonction à appeler lorsque le minuteur se déclenche.
funreçoit 1 argument, l’objet minuteur. SifunvautNone, alors la fonction de rappel sera désactivée.
- channel(channel: int, mode: int | None = None, *args, **kwargs) TimerChannel | None¶
Si seul un numéro de canal est passé, un objet canal précédemment initialisé est renvoyé (ou
Nones’il n’y a pas de canal antérieur).Sinon, un objet TimerChannel est initialisé et renvoyé.
Chaque canal peut être configuré pour effectuer du PWM, de la comparaison de sortie (output compare) ou de la capture d’entrée (input capture). Tous les canaux partagent le même minuteur sous-jacent, ce qui signifie qu’ils partagent la même horloge de minuteur.
Arguments nommés :
modepeut être l’un des suivants :Timer.PWM— configure le minuteur en mode PWM (actif à l’état haut).Timer.PWM_INVERTED— configure le minuteur en mode PWM (actif à l’état bas).Timer.OC_TIMING— indique qu’aucune broche n’est pilotée.Timer.OC_ACTIVE— la broche sera rendue active lorsqu’une correspondance de comparaison se produit (l’état actif est déterminé par la polarité)Timer.OC_INACTIVE— la broche sera rendue inactive lorsqu’une correspondance de comparaison se produit.Timer.OC_TOGGLE— l’état de la broche sera basculé lorsqu’une correspondance de comparaison se produit.Timer.OC_FORCED_ACTIVE— la broche est forcée à l’état actif (la correspondance de comparaison est ignorée).Timer.OC_FORCED_INACTIVE— la broche est forcée à l’état inactif (la correspondance de comparaison est ignorée).Timer.IC— configure le minuteur en mode capture d’entrée (Input Capture).Timer.ENC_A— configure le minuteur en mode encodeur. Le compteur ne change que lorsque CH1 change.Timer.ENC_B— configure le minuteur en mode encodeur. Le compteur ne change que lorsque CH2 change.Timer.ENC_AB— configure le minuteur en mode encodeur. Le compteur change lorsque CH1 ou CH2 change.
callback- comme pour TimerChannel.callback()pinNone (la valeur par défaut) ou un objet Pin. S’il est spécifié (et différent de None), cela configurera la fonction alternative de la broche indiquée pour ce canal de minuteur. Une erreur sera levée si la broche ne prend en charge aucune fonction alternative pour ce canal de minuteur.
Arguments nommés pour les modes Timer.PWM :
pulse_width- détermine la valeur initiale de largeur d’impulsion à utiliser.pulse_width_percent- détermine le pourcentage initial de largeur d’impulsion à utiliser.
Arguments nommés pour les modes Timer.OC :
compare- détermine la valeur initiale du registre de comparaison.polaritypeut être l’un des suivants :Timer.HIGH- la sortie est active à l’état hautTimer.LOW- la sortie est active à l’état bas
Arguments nommés optionnels pour les modes Timer.IC :
polaritypeut être l’un des suivants :Timer.RISING- capture sur front montant.Timer.FALLING- capture sur front descendant.Timer.BOTH- capture sur les deux fronts.
Notez que la capture ne fonctionne que sur le canal principal, et non sur les canaux complémentaires.
Remarques pour les modes Timer.ENC :
Nécessite 2 broches, donc une ou les deux broches devront être configurées pour utiliser la fonction alternative (AF) appropriée du minuteur à l’aide de l’API Pin.
Lisez la valeur de l’encodeur à l’aide de la méthode timer.counter().
Ne fonctionne que sur CH1 et CH2 (et non sur CH1N ou CH2N)
Le numéro de canal est ignoré lors du réglage du mode encodeur.
Exemple PWM – sur chaque OpenMV Cam STM32, les canaux 1 et 2 de
TIM4sont routés respectivement vers les broches d’en-têteP7etP8timer = pyb.Timer(4, freq=1000) ch1 = timer.channel(1, pyb.Timer.PWM, pin=pyb.Pin.board.P7, pulse_width=8000) ch2 = timer.channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.P8, pulse_width=16000)
Constantes¶
Constantes de mode de comptage (argument
modedeinit()) :Constantes de mode de coupure (argument
brkdeinit()) :Constantes de mode de canal (argument
modedechannel()) :- OC_ACTIVE: int¶
Mode actif par comparaison de sortie ; la broche est rendue active lors d’une correspondance de comparaison.
- OC_INACTIVE: int¶
Mode inactif par comparaison de sortie ; la broche est rendue inactive lors d’une correspondance de comparaison.
- OC_TOGGLE: int¶
Mode bascule par comparaison de sortie ; l’état de la broche bascule lors d’une correspondance de comparaison.
- OC_FORCED_ACTIVE: int¶
Mode actif forcé par comparaison de sortie ; la broche est forcée à l’état actif et la correspondance de comparaison est ignorée.
- OC_FORCED_INACTIVE: int¶
Mode inactif forcé par comparaison de sortie ; la broche est forcée à l’état inactif et la correspondance de comparaison est ignorée.
Polarité de comparaison de sortie (argument
polaritydechannel()dans les modes OC) :Polarité de capture d’entrée (argument
polaritydechannel()dans le mode IC) :