class Timer – interne Timer steuern¶
Timer können für eine Vielzahl von Aufgaben verwendet werden. Derzeit ist nur der einfachste Fall implementiert: das periodische Aufrufen einer Funktion.
Jeder Timer besteht aus einem Zähler, der mit einer bestimmten Rate hochzählt. Die Rate, mit der er zählt, ist die Taktfrequenz des Peripheriegeräts (in Hz) geteilt durch den Timer-Vorteiler. Wenn der Zähler die Timer-Periode erreicht, löst er ein Ereignis aus und der Zähler wird wieder auf null zurückgesetzt. Mit der Callback-Methode kann das Timer-Ereignis eine Python-Funktion aufrufen.
Beispielanwendung, um eine LED mit fester Frequenz umzuschalten:
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())
Beispiel mit einer benannten Funktion für den Callback:
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
Weitere Beispiele:
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
Hinweis: Timer(1) wird für die Kamera verwendet. Ebenso steuert Timer(5) den Servo-Treiber und Timer(6) wird für getaktetes ADC/DAC-Lesen/-Schreiben verwendet. Es wird empfohlen, in Ihren Programmen die anderen Timer zu verwenden.
Hinweis: Während eines Callbacks (eines Interrupts) kann kein Speicher zugewiesen werden, und daher liefern innerhalb eines Callbacks ausgelöste Ausnahmen nicht viele Informationen. Siehe micropython.alloc_emergency_exception_buf() für Möglichkeiten, diese Einschränkung zu umgehen.
Konstruktoren¶
- class pyb.Timer(id: int, *args, **kwargs)¶
Erstellt ein neues Timer-Objekt mit der angegebenen ID. Wenn zusätzliche Argumente angegeben werden, wird der Timer durch
init(...)initialisiert. Die Menge der gültigenid-Werte hängt vom STM32-MCU der verwendeten OpenMV Cam ab; im STM32-Referenzhandbuch finden Sie die verfügbaren Allzweck- und Advanced-Control-Timer.Methoden¶
- 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¶
Initialisiert den Timer. Die Initialisierung muss entweder über die Frequenz (in Hz) oder über Vorteiler und Periode erfolgen:
tim.init(freq=100) # set the timer to trigger at 100Hz tim.init(prescaler=83, period=999) # set the prescaler and period directly
Schlüsselwortargumente:
freq— gibt die periodische Frequenz des Timers an. Sie können dies auch als die Frequenz betrachten, mit der der Timer einen vollständigen Zyklus durchläuft.prescaler[0-0xffff] - gibt den Wert an, der in das Vorteiler-Register (PSC) des Timers geladen werden soll. Die Timer-Taktquelle wird durch(prescaler + 1)geteilt, um den Timer-Takt abzuleiten. Die Taktquelle stammt vom übergeordneten APB-Bus des Timers und ist MCU-abhängig. Auf STM32 takten Timer auf APB1 typischerweise mit2 * pclk1und Timer auf APB2 mit2 * pclk2; lesen Sie die aktuellen Busfrequenzen mitpyb.freq()aus und konsultieren Sie das STM32-Referenzhandbuch für den MCU Ihrer OpenMV Cam.period[0-0xffff] für die Timer 1, 3, 4 und 6-15. [0-0x3fffffff] für die Timer 2 & 5. Gibt den Wert an, der in das AutoReload-Register (ARR) des Timers geladen werden soll. Dies bestimmt die Periode des Timers (d. h. wann der Zähler umläuft). Der Timer-Zähler läuft nachperiod + 1Timer-Taktzyklen über.modekann einer der folgenden sein:Timer.UP- konfiguriert den Timer so, dass er von 0 bis ARR zählt (Standard)Timer.DOWN- konfiguriert den Timer so, dass er von ARR herunter bis 0 zählt.Timer.CENTER- konfiguriert den Timer so, dass er von 0 bis ARR und dann wieder herunter bis 0 zählt.
divkann 1, 2 oder 4 sein. Teilt den Timer-Takt, um den von den digitalen Filtern verwendeten Abtasttakt zu bestimmen.callback- gemäß Timer.callback()deadtime- gibt die Menge an „toter“ oder inaktiver Zeit zwischen Übergängen auf komplementären Kanälen an (beide Kanäle sind während dieser Zeit inaktiv).deadtimekann eine ganze Zahl zwischen 0 und 1008 sein, mit den folgenden Einschränkungen: 0-128 in Schritten von 1, 128-256 in Schritten von 2, 256-512 in Schritten von 8 und 512-1008 in Schritten von 16.deadtimemisst Ticks vonsource_freqgeteilt durchdivTakt-Ticks.deadtimeist nur auf den Timern 1 und 8 verfügbar.brk- gibt an, ob der Break-Modus verwendet wird, um den Ausgang des PWM zu deaktivieren, wenn derBRK_IN-Eingang aktiviert wird. Der Wert dieses Arguments bestimmt, ob Break aktiviert ist und welche Polarität gilt, und kannTimer.BRK_OFF,Timer.BRK_LOWoderTimer.BRK_HIGHsein. Um denBRK_IN-Pin auszuwählen, konstruieren Sie ein Pin-Objekt mitmode=Pin.ALT, alt=Pin.AFn_TIMx. Die GPIO-Eingangsfunktionen des Pins sind im Alt-Modus verfügbar -pull=,value()undirq().hardkann einer der folgenden sein:True- Der Callback wird im Hard-Interrupt-Kontext ausgeführt, was Verzögerung und Jitter minimiert, aber den in Interrupt-Handler schreiben beschriebenen Einschränkungen unterliegt, einschließlich der Unmöglichkeit, auf dem Heap zu allozieren.False- Der Callback wird als Soft-Interrupt eingeplant, wodurch er allozieren kann, aber möglicherweise auch Garbage-Collection-Verzögerungen und Jitter einführt.
Der Standardwert dieser Option ist True.
Sie müssen entweder freq oder sowohl period als auch prescaler angeben.
- deinit() None¶
Deinitialisiert den Timer.
Deaktiviert den Callback (und den zugehörigen IRQ).
Deaktiviert alle Kanal-Callbacks (und die zugehörigen IRQs). Stoppt den Timer und deaktiviert das Timer-Peripheriegerät.
- callback(fun: Callable[[Timer], None] | None) None¶
Legt die Funktion fest, die aufgerufen wird, wenn der Timer auslöst.
funwird 1 Argument übergeben, das Timer-Objekt. WennfunNoneist, wird der Callback deaktiviert.
- channel(channel: int, mode: int | None = None, *args, **kwargs) TimerChannel | None¶
Wird nur eine Kanalnummer übergeben, wird ein zuvor initialisiertes Kanalobjekt zurückgegeben (oder
None, wenn es keinen vorherigen Kanal gibt).Andernfalls wird ein TimerChannel-Objekt initialisiert und zurückgegeben.
Jeder Kanal kann so konfiguriert werden, dass er PWM, Output-Compare oder Input-Capture durchführt. Alle Kanäle teilen sich denselben zugrunde liegenden Timer, was bedeutet, dass sie sich denselben Timer-Takt teilen.
Schlüsselwortargumente:
modekann einer der folgenden sein:Timer.PWM— konfiguriert den Timer im PWM-Modus (active high).Timer.PWM_INVERTED— konfiguriert den Timer im PWM-Modus (active low).Timer.OC_TIMING— gibt an, dass kein Pin angesteuert wird.Timer.OC_ACTIVE— der Pin wird aktiv gesetzt, wenn ein Compare-Match auftritt (aktiv wird durch die Polarität bestimmt)Timer.OC_INACTIVE— der Pin wird inaktiv gesetzt, wenn ein Compare-Match auftritt.Timer.OC_TOGGLE— der Pin wird umgeschaltet, wenn ein Compare-Match auftritt.Timer.OC_FORCED_ACTIVE— der Pin wird zwangsweise aktiv gesetzt (Compare-Match wird ignoriert).Timer.OC_FORCED_INACTIVE— der Pin wird zwangsweise inaktiv gesetzt (Compare-Match wird ignoriert).Timer.IC— konfiguriert den Timer im Input-Capture-Modus.Timer.ENC_A— konfiguriert den Timer im Encoder-Modus. Der Zähler ändert sich nur, wenn sich CH1 ändert.Timer.ENC_B— konfiguriert den Timer im Encoder-Modus. Der Zähler ändert sich nur, wenn sich CH2 ändert.Timer.ENC_AB— konfiguriert den Timer im Encoder-Modus. Der Zähler ändert sich, wenn sich CH1 oder CH2 ändert.
callback- gemäß TimerChannel.callback()pinNone (der Standard) oder ein Pin-Objekt. Wenn angegeben (und nicht None), bewirkt dies, dass die alternative Funktion des angegebenen Pins für diesen Timer-Kanal konfiguriert wird. Ein Fehler wird ausgelöst, wenn der Pin keine alternativen Funktionen für diesen Timer-Kanal unterstützt.
Schlüsselwortargumente für die Timer.PWM-Modi:
pulse_width- bestimmt den anfänglich zu verwendenden Impulsbreitenwert.pulse_width_percent- bestimmt die anfänglich zu verwendende Impulsbreite in Prozent.
Schlüsselwortargumente für die Timer.OC-Modi:
compare- bestimmt den Anfangswert des Compare-Registers.polaritykann einer der folgenden sein:Timer.HIGH- Ausgang ist active highTimer.LOW- Ausgang ist active low
Optionale Schlüsselwortargumente für die Timer.IC-Modi:
polaritykann einer der folgenden sein:Timer.RISING- erfasst bei steigender Flanke.Timer.FALLING- erfasst bei fallender Flanke.Timer.BOTH- erfasst bei beiden Flanken.
Beachten Sie, dass Capture nur auf dem primären Kanal funktioniert und nicht auf den komplementären Kanälen.
Hinweise für die Timer.ENC-Modi:
Erfordert 2 Pins, sodass einer oder beide Pins so konfiguriert werden müssen, dass sie die entsprechende Timer-AF über die Pin-API verwenden.
Lesen Sie den Encoder-Wert mit der Methode timer.counter().
Funktioniert nur auf CH1 und CH2 (und nicht auf CH1N oder CH2N)
Die Kanalnummer wird beim Festlegen des Encoder-Modus ignoriert.
PWM-Beispiel – auf jeder STM32-OpenMV Cam sind die Kanäle 1 und 2 von
TIM4auf die Header-PinsP7bzw.P8geroutet:timer = 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)
Konstanten¶
Zählmodus-Konstanten (
mode-Argument voninit()):Break-Modus-Konstanten (
brk-Argument voninit()):Kanalmodus-Konstanten (
mode-Argument vonchannel()):- OC_INACTIVE: int¶
Output-Compare-Inactive-Modus; der Pin wird bei einem Compare-Match inaktiv gesetzt.
- OC_FORCED_ACTIVE: int¶
Output-Compare-Forced-Active-Modus; der Pin wird zwangsweise aktiv gesetzt und der Compare-Match wird ignoriert.
- OC_FORCED_INACTIVE: int¶
Output-Compare-Forced-Inactive-Modus; der Pin wird zwangsweise inaktiv gesetzt und der Compare-Match wird ignoriert.
Output-Compare-Polarität (
polarity-Argument vonchannel()in den OC-Modi):Input-Capture-Polarität (
polarity-Argument vonchannel()im IC-Modus):