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 hodnot id zá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 * pclk1 a časovače na APB2 s 2 * 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 po period + 1 hodinových cyklech časovače.

  • mode můž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.

  • div můž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í). deadtime můž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. deadtime měří tiky source_freq dělené div hodinovými tiky. deadtime je 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 vstup BRK_IN aktivován. Hodnota tohoto argumentu určuje, zda je break povolen a jaká je jeho polarita, a může být jedna z Timer.BRK_OFF, Timer.BRK_LOW nebo Timer.BRK_HIGH. Pro výběr pinu BRK_IN vytvořte objekt Pin s mode=Pin.ALT, alt=Pin.AFn_TIMx. Vstupní funkce GPIO daného pinu jsou v alternativním režimu dostupné - pull= , value() a irq().

  • hard můž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. fun se předává 1 argument, objekt časovače. Pokud je fun None, 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:

  • mode můž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()

  • pin None (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.

  • polarity může být jedna z:

    • Timer.HIGH - výstup je aktivní v úrovni high

    • Timer.LOW - výstup je aktivní v úrovni low

Volitelné klíčové argumenty pro režimy Timer.IC:

  • polarity můž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 TIM4 směrovány na piny konektoru P7, resp. P8

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)
counter(value: int | None = None) int | None

Získá nebo nastaví čítač časovače.

freq(value: int | float | None = None) int | float | None

Získá nebo nastaví frekvenci časovače (pokud je nastavena, změní předděličku a periodu).

period(value: int | None = None) int | None

Získá nebo nastaví periodu časovače.

prescaler(value: int | None = None) int | None

Získá nebo nastaví předděličku časovače.

source_freq() int

Získá frekvenci zdroje časovače.

Konstanty

Konstanty režimu čítání (argument mode metody init()):

UP: int

Čítání od 0 nahoru k ARR (výchozí režim).

DOWN: int

Čítání od ARR dolů k 0.

CENTER: int

Čítání od 0 nahoru k ARR a poté zpět dolů k 0.

Konstanty režimu break (argument brk metody init()):

BRK_OFF: int

Vstup break je zakázán.

BRK_LOW: int

Vstup break je aktivní v úrovni low.

BRK_HIGH: int

Vstup break je aktivní v úrovni high.

Konstanty režimu kanálu (argument mode metody channel()):

PWM: int

Nastaví kanál pro výstup PWM (aktivní v úrovni high).

PWM_INVERTED: int

Nastaví kanál pro výstup PWM (aktivní v úrovni low).

OC_TIMING: int

Časovací režim porovnání výstupu; není buzen žádný pin.

OC_ACTIVE: int

Aktivní režim porovnání výstupu; pin se stane aktivním při shodě porovnání.

OC_INACTIVE: int

Neaktivní režim porovnání výstupu; pin se stane neaktivním při shodě porovnání.

OC_TOGGLE: int

Přepínací režim porovnání výstupu; pin se přepne při shodě porovnání.

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.

IC: int

Nastaví kanál do režimu zachycení vstupu.

ENC_A: int

Režim enkodéru: čítač se mění pouze při změně CH1.

ENC_B: int

Režim enkodéru: čítač se mění pouze při změně CH2.

ENC_AB: int

Režim enkodéru: čítač se mění při každé změně CH1 nebo CH2.

Polarita porovnání výstupu (argument polarity metody channel() v režimech OC):

HIGH: int

Výstup je aktivní v úrovni high.

LOW: int

Výstup je aktivní v úrovni low.

Polarita zachycení vstupu (argument polarity metody channel() v režimu IC):

RISING: int

Zachycení na náběžné hraně.

FALLING: int

Zachycení na sestupné hraně.

BOTH: int

Zachycení na kterékoli hraně.