třída Timer – ovládání interních časovačů¶
Časovače lze použít pro širokou škálu úloh. V současné době je implementován pouze nejjednodušší případ: periodické volání funkce.
Každý časovač se skládá z čítače, který se zvyšuje určitou rychlostí. Rychlost čítání je dána frekvencí hodin periferie (v Hz) dělenou předděličkou časovače. Když čítač dosáhne periody časovače, vyvolá událost a vrátí se zpět na nulu. Pomocí metody callback může událost časovače zavolat funkci v Pythonu.
Příklad použití pro přepínání LED na pevné frekvenci:
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())
Příklad s použitím pojmenované funkce jako callbacku:
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
Další příklady:
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
Poznámka: Timer(1) se používá pro kameru. Podobně Timer(5) řídí budič serva a Timer(6) se používá pro časované čtení/zápis ADC/DAC. Ve svých programech doporučujeme používat ostatní časovače.
Poznámka: Během callbacku (přerušení) nelze alokovat paměť, a proto výjimky vyvolané uvnitř callbacku neposkytují mnoho informací. Jak toto omezení obejít, viz micropython.alloc_emergency_exception_buf().
Konstruktory¶
- class pyb.Timer(id: int, *args, **kwargs)¶
Vytvoří nový objekt časovače s daným id. Jsou-li uvedeny další argumenty, časovač se inicializuje pomocí
init(...). Sada platných hodnotidzávisí na MCU STM32 použitém v dané OpenMV Cam; dostupné univerzální a pokročilé řídicí časovače najdete v referenční příručce STM32.Metody¶
- 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¶
Inicializuje časovač. Inicializace musí být provedena buď frekvencí (v Hz), nebo předděličkou a periodou:
tim.init(freq=100) # set the timer to trigger at 100Hz tim.init(prescaler=83, period=999) # set the prescaler and period directly
Klíčové argumenty:
freq— určuje periodickou frekvenci časovače. Můžete to také chápat jako frekvenci, s níž časovač projde jedním celým cyklem.prescaler[0-0xffff] - určuje hodnotu, která se má načíst do registru předděličky časovače (PSC). Zdroj hodin časovače se dělí(prescaler + 1), čímž se odvodí hodiny časovače. Zdroj hodin pochází z nadřazené sběrnice APB časovače a je závislý na MCU. Na STM32 časovače na APB1 typicky pracují s frekvencí2 * pclk1a časovače na APB2 s2 * pclk2; aktuální frekvence sběrnic zjistíte pomocípyb.freq()a v referenční příručce STM32 pro MCU vaší OpenMV Cam.period[0-0xffff] pro časovače 1, 3, 4 a 6-15. [0-0x3fffffff] pro časovače 2 a 5. Určuje hodnotu, která se má načíst do registru automatického přenačtení časovače (ARR). Tím se určuje perioda časovače (tj. kdy čítač projde cyklem). Čítač časovače přeteče poperiod + 1hodinových cyklech časovače.modemůže být jedna z:Timer.UP- nastaví časovač tak, aby čítal od 0 do ARR (výchozí)Timer.DOWN- nastaví časovač tak, aby čítal od ARR dolů k 0.Timer.CENTER- nastaví časovač tak, aby čítal od 0 do ARR a poté zpět dolů k 0.
divmůže být 1, 2 nebo 4. Dělí hodiny časovače pro určení vzorkovacích hodin používaných digitálními filtry.callback- jako u Timer.callback()deadtime- určuje dobu „mrtvého“ neboli neaktivního času mezi přechody na komplementárních kanálech (oba kanály budou po tuto dobu neaktivní).deadtimemůže být celé číslo mezi 0 a 1008 s následujícími omezeními: 0-128 v krocích po 1, 128-256 v krocích po 2, 256-512 v krocích po 8 a 512-1008 v krocích po 16.deadtimeměří tikysource_freqdělenédivhodinovými tiky.deadtimeje dostupný pouze na časovačích 1 a 8.brk- určuje, zda se režim přerušení (break) používá k vypnutí výstupu PWM, když je vstupBRK_INaktivován. Hodnota tohoto argumentu určuje, zda je break povolen a jaká je jeho polarita, a může být jedna zTimer.BRK_OFF,Timer.BRK_LOWneboTimer.BRK_HIGH. Pro výběr pinuBRK_INvytvořte objekt Pin smode=Pin.ALT, alt=Pin.AFn_TIMx. Vstupní funkce GPIO daného pinu jsou v alternativním režimu dostupné -pull=,value()airq().hardmůže být jedna z:True- Callback bude proveden v kontextu tvrdého přerušení, což minimalizuje zpoždění a jitter, ale podléhá omezením popsaným v Psaní obslužných rutin přerušení včetně nemožnosti alokace na haldě.False- Callback bude naplánován jako měkké přerušení, což mu umožní alokovat, ale možná také zavede zpoždění způsobená uvolňováním paměti (garbage collection) a jitter.
Výchozí hodnota této volby je True.
Musíte zadat buď freq, nebo obojí period a prescaler.
- deinit() None¶
Deinicializuje časovač.
Zakáže callback (a související irq).
Zakáže veškeré callbacky kanálů (a související irq). Zastaví časovač a zakáže periferii časovače.
- callback(fun: Callable[[Timer], None] | None) None¶
Nastaví funkci, která se má zavolat, když je časovač spuštěn.
funse předává 1 argument, objekt časovače. Pokud jefunNone, callback bude zakázán.
- channel(channel: int, mode: int | None = None, *args, **kwargs) TimerChannel | None¶
Je-li předáno pouze číslo kanálu, vrátí se dříve inicializovaný objekt kanálu (nebo
None, pokud žádný předchozí kanál neexistuje).V opačném případě se inicializuje a vrátí objekt TimerChannel.
Každý kanál lze nakonfigurovat k provádění pwm, porovnání výstupu (output compare) nebo zachycení vstupu (input capture). Všechny kanály sdílejí stejný podkladový časovač, což znamená, že sdílejí stejné hodiny časovače.
Klíčové argumenty:
modemůže být jedna z:Timer.PWM— nastaví časovač do režimu PWM (aktivní v úrovni high).Timer.PWM_INVERTED— nastaví časovač do režimu PWM (aktivní v úrovni low).Timer.OC_TIMING— indikuje, že není buzen žádný pin.Timer.OC_ACTIVE— pin se stane aktivním při shodě porovnání (aktivita je určena polaritou)Timer.OC_INACTIVE— pin se stane neaktivním při shodě porovnání.Timer.OC_TOGGLE— pin se přepne při shodě porovnání.Timer.OC_FORCED_ACTIVE— pin je vynuceně aktivní (shoda porovnání je ignorována).Timer.OC_FORCED_INACTIVE— pin je vynuceně neaktivní (shoda porovnání je ignorována).Timer.IC— nastaví časovač do režimu zachycení vstupu (Input Capture).Timer.ENC_A— nastaví časovač do režimu enkodéru. Čítač se mění pouze při změně CH1.Timer.ENC_B— nastaví časovač do režimu enkodéru. Čítač se mění pouze při změně CH2.Timer.ENC_AB— nastaví časovač do režimu enkodéru. Čítač se mění při změně CH1 nebo CH2.
callback- jako u TimerChannel.callback()pinNone (výchozí) nebo objekt Pin. Je-li zadán (a není None), způsobí, že se alternativní funkce uvedeného pinu nakonfiguruje pro tento kanál časovače. Pokud pin nepodporuje žádné alternativní funkce pro tento kanál časovače, vyvolá se chyba.
Klíčové argumenty pro režimy Timer.PWM:
pulse_width- určuje počáteční hodnotu šířky pulzu, která se má použít.pulse_width_percent- určuje počáteční procentuální šířku pulzu, která se má použít.
Klíčové argumenty pro režimy Timer.OC:
compare- určuje počáteční hodnotu porovnávacího registru.polaritymůže být jedna z:Timer.HIGH- výstup je aktivní v úrovni highTimer.LOW- výstup je aktivní v úrovni low
Volitelné klíčové argumenty pro režimy Timer.IC:
polaritymůže být jedna z:Timer.RISING- zachytává na náběžné hraně.Timer.FALLING- zachytává na sestupné hraně.Timer.BOTH- zachytává na obou hranách.
Mějte na paměti, že zachycení funguje pouze na primárním kanálu, nikoli na komplementárních kanálech.
Poznámky pro režimy Timer.ENC:
Vyžaduje 2 piny, takže jeden nebo oba piny bude potřeba nakonfigurovat k použití příslušné AF časovače pomocí Pin API.
Hodnotu enkodéru čtěte metodou timer.counter().
Funguje pouze na CH1 a CH2 (nikoli na CH1N nebo CH2N)
Při nastavování režimu enkodéru je číslo kanálu ignorováno.
Příklad PWM – na každé STM32 OpenMV Cam jsou kanály 1 a 2 časovače
TIM4směrovány na piny konektoruP7, resp.P8timer = 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)
Konstanty¶
Konstanty režimu čítání (argument
modemetodyinit()):Konstanty režimu break (argument
brkmetodyinit()):Konstanty režimu kanálu (argument
modemetodychannel()):- OC_FORCED_ACTIVE: int¶
Vynuceně aktivní režim porovnání výstupu; pin je vynuceně aktivní a shoda porovnání je ignorována.
- OC_FORCED_INACTIVE: int¶
Vynuceně neaktivní režim porovnání výstupu; pin je vynuceně neaktivní a shoda porovnání je ignorována.
Polarita porovnání výstupu (argument
polaritymetodychannel()v režimech OC):Polarita zachycení vstupu (argument
polaritymetodychannel()v režimu IC):