klasa Timer – upravljanje internim mjeračima vremena

Mjerači vremena mogu se koristiti za veliki broj različitih zadataka. Trenutno je implementiran samo najjednostavniji slučaj: periodičko pozivanje funkcije.

Svaki mjerač vremena sastoji se od brojača koji broji prema gore određenom brzinom. Brzina kojom broji jest frekvencija takta periferije (u Hz) podijeljena s preddjeliteljem (prescaler) mjerača vremena. Kada brojač dosegne period mjerača vremena, okida događaj, a brojač se ponovno postavlja na nulu. Koristeći metodu callback, događaj mjerača vremena može pozvati Python funkciju.

Primjer uporabe za uključivanje i isključivanje LED-a na fiksnoj frekvenciji:

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())

Primjer s imenovanom funkcijom za povratni poziv:

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

Daljnji primjeri:

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

Napomena: Timer(1) se koristi za kameru. Slično, Timer(5) upravlja pogonom servomotora, a Timer(6) se koristi za vremenski upravljano čitanje/pisanje ADC/DAC. Preporučuje se da u svojim programima koristite ostale mjerače vremena.

Napomena: Memorija se ne može alocirati tijekom povratnog poziva (prekida), pa iznimke podignute unutar povratnog poziva ne daju mnogo informacija. Pogledajte micropython.alloc_emergency_exception_buf() za način kako zaobići ovo ograničenje.

Konstruktori

class pyb.Timer(id: int, *args, **kwargs)

Konstruira novi objekt mjerača vremena s danim id. Ako su navedeni dodatni argumenti, mjerač vremena se inicijalizira pozivom init(...). Skup valjanih id vrijednosti ovisi o STM32 MCU-u na korištenoj OpenMV Cam; pogledajte STM32 referentni priručnik za dostupne mjerače vremena opće namjene i napredne kontrole.

Metode

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

Inicijalizira mjerač vremena. Inicijalizacija se mora obaviti ili putem frekvencije (u Hz) ili putem preddjelitelja i perioda:

tim.init(freq=100)                  # set the timer to trigger at 100Hz
tim.init(prescaler=83, period=999)  # set the prescaler and period directly

Ključni argumenti:

  • freq — određuje periodičku frekvenciju mjerača vremena. Možete je također promatrati kao frekvenciju kojom mjerač vremena prolazi kroz jedan potpuni ciklus.

  • prescaler [0-0xffff] - određuje vrijednost koja se učitava u registar preddjelitelja mjerača vremena (PSC). Izvor takta mjerača vremena dijeli se s (prescaler + 1) kako bi se dobio takt mjerača vremena. Izvor takta dolazi s nadređene APB sabirnice mjerača vremena i ovisi o MCU-u. Na STM32, mjerači vremena na APB1 obično rade na taktu 2 * pclk1, a oni na APB2 na 2 * pclk2; očitajte trenutne frekvencije sabirnica pomoću pyb.freq() i pogledajte STM32 referentni priručnik za MCU vaše OpenMV Cam.

  • period [0-0xffff] za mjerače vremena 1, 3, 4 i 6-15. [0-0x3fffffff] za mjerače vremena 2 i 5. Određuje vrijednost koja se učitava u registar automatskog ponovnog učitavanja mjerača vremena (ARR). Time se određuje period mjerača vremena (tj. kada brojač završi ciklus). Brojač mjerača vremena prijeći će preko maksimuma nakon period + 1 taktnih ciklusa mjerača vremena.

  • mode može biti jedan od:

    • Timer.UP - konfigurira mjerač vremena za brojanje od 0 do ARR (zadano)

    • Timer.DOWN - konfigurira mjerač vremena za brojanje od ARR prema dolje do 0.

    • Timer.CENTER - konfigurira mjerač vremena za brojanje od 0 do ARR i zatim natrag do 0.

  • div može biti 1, 2 ili 4. Dijeli takt mjerača vremena kako bi se odredio takt uzorkovanja koji koriste digitalni filtri.

  • callback - kao i Timer.callback()

  • deadtime - određuje količinu „mrtvog” ili neaktivnog vremena između prijelaza na komplementarnim kanalima (oba kanala bit će neaktivna tijekom tog vremena). deadtime može biti cijeli broj između 0 i 1008, uz sljedeća ograničenja: 0-128 u koracima od 1, 128-256 u koracima od 2, 256-512 u koracima od 8 i 512-1008 u koracima od 16. deadtime mjeri otkucaje source_freq podijeljene s div taktnih otkucaja. deadtime je dostupan samo na mjeračima vremena 1 i 8.

  • brk - određuje koristi li se prekidni način rada (break) za prekidanje izlaza PWM-a kada se aktivira ulaz BRK_IN. Vrijednost ovog argumenta određuje je li prekid omogućen i koji je njegov polaritet, a može biti Timer.BRK_OFF, Timer.BRK_LOW ili Timer.BRK_HIGH. Za odabir pina BRK_IN konstruirajte Pin objekt s mode=Pin.ALT, alt=Pin.AFn_TIMx. Značajke GPIO ulaza pina dostupne su u alt načinu rada - pull= , value() i irq().

  • hard može biti jedan od:

    • True - Povratni poziv izvršit će se u kontekstu tvrdog prekida, što minimizira kašnjenje i podrhtavanje (jitter), ali podliježe ograničenjima opisanima u Pisanje rukovatelja prekidima, uključujući nemogućnost alociranja na hrpi (heap).

    • False - Povratni poziv bit će zakazan kao meki prekid, što mu omogućuje alociranje, ali možda i unosi kašnjenja zbog sakupljanja smeća (garbage collection) te podrhtavanje (jitter).

    Zadana vrijednost ove opcije je True.

Morate navesti ili freq ili oboje, period i prescaler.

deinit() None

Deinicijalizira mjerač vremena.

Onemogućuje povratni poziv (i pridruženi irq).

Onemogućuje sve povratne pozive kanala (i pridružene irq). Zaustavlja mjerač vremena i onemogućuje periferiju mjerača vremena.

callback(fun: Callable[[Timer], None] | None) None

Postavlja funkciju koja se poziva kada mjerač vremena okine. fun se predaje 1 argument, objekt mjerača vremena. Ako je fun jednak None, povratni poziv bit će onemogućen.

channel(channel: int, mode: int | None = None, *args, **kwargs) TimerChannel | None

Ako se proslijedi samo broj kanala, vraća se prethodno inicijalizirani objekt kanala (ili None ako prethodni kanal ne postoji).

U suprotnom, inicijalizira se i vraća TimerChannel objekt.

Svaki kanal može se konfigurirati za izvođenje pwm-a, izlazne usporedbe (output compare) ili ulaznog hvatanja (input capture). Svi kanali dijele isti temeljni mjerač vremena, što znači da dijele isti takt mjerača vremena.

Ključni argumenti:

  • mode može biti jedan od:

    • Timer.PWM — konfigurira mjerač vremena u PWM načinu rada (aktivno visoko).

    • Timer.PWM_INVERTED — konfigurira mjerač vremena u PWM načinu rada (aktivno nisko).

    • Timer.OC_TIMING — označava da se nijedan pin ne pobuđuje.

    • Timer.OC_ACTIVE — pin će postati aktivan kada dođe do podudaranja usporedbe (aktivno je određeno polaritetom)

    • Timer.OC_INACTIVE — pin će postati neaktivan kada dođe do podudaranja usporedbe.

    • Timer.OC_TOGGLE — pin će se preklopiti kada dođe do podudaranja usporedbe.

    • Timer.OC_FORCED_ACTIVE — pin se prisilno postavlja u aktivno stanje (podudaranje usporedbe se zanemaruje).

    • Timer.OC_FORCED_INACTIVE — pin se prisilno postavlja u neaktivno stanje (podudaranje usporedbe se zanemaruje).

    • Timer.IC — konfigurira mjerač vremena u načinu rada ulaznog hvatanja (Input Capture).

    • Timer.ENC_A — konfigurira mjerač vremena u načinu rada enkodera. Brojač se mijenja samo kada se promijeni CH1.

    • Timer.ENC_B — konfigurira mjerač vremena u načinu rada enkodera. Brojač se mijenja samo kada se promijeni CH2.

    • Timer.ENC_AB — konfigurira mjerač vremena u načinu rada enkodera. Brojač se mijenja kada se promijeni CH1 ili CH2.

  • callback - kao i TimerChannel.callback()

  • pin None (zadano) ili Pin objekt. Ako je naveden (i nije None), to će uzrokovati konfiguriranje alternativne funkcije navedenog pina za ovaj kanal mjerača vremena. Pojavit će se pogreška ako pin ne podržava nijednu alternativnu funkciju za ovaj kanal mjerača vremena.

Ključni argumenti za Timer.PWM načine rada:

  • pulse_width - određuje početnu vrijednost širine impulsa koja će se koristiti.

  • pulse_width_percent - određuje početni postotak širine impulsa koji će se koristiti.

Ključni argumenti za Timer.OC načine rada:

  • compare - određuje početnu vrijednost registra usporedbe.

  • polarity može biti jedan od:

    • Timer.HIGH - izlaz je aktivno visok

    • Timer.LOW - izlaz je aktivno nizak

Neobavezni ključni argumenti za Timer.IC načine rada:

  • polarity može biti jedan od:

    • Timer.RISING - hvata na rastućem rubu.

    • Timer.FALLING - hvata na padajućem rubu.

    • Timer.BOTH - hvata na oba ruba.

Imajte na umu da hvatanje radi samo na primarnom kanalu, a ne na komplementarnim kanalima.

Napomene za Timer.ENC načine rada:

  • Zahtijeva 2 pina, pa će jedan ili oba pina trebati konfigurirati za korištenje odgovarajuće AF mjerača vremena pomoću Pin API-ja.

  • Očitajte vrijednost enkodera pomoću metode timer.counter().

  • Radi samo na CH1 i CH2 (a ne na CH1N ili CH2N)

  • Broj kanala se zanemaruje pri postavljanju načina rada enkodera.

Primjer PWM-a – na svakoj STM32 OpenMV Cam kanali 1 i 2 mjerača vremena TIM4 usmjereni su na pinove zaglavlja P7 odnosno 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

Dohvaća ili postavlja brojač mjerača vremena.

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

Dohvaća ili postavlja frekvenciju mjerača vremena (mijenja preddjelitelj i period ako se postavi).

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

Dohvaća ili postavlja period mjerača vremena.

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

Dohvaća ili postavlja preddjelitelj mjerača vremena.

source_freq() int

Dohvaća frekvenciju izvora mjerača vremena.

Konstante

Konstante načina brojanja (mode argument metode init()):

UP: int

Brojanje od 0 prema gore do ARR (zadani način rada).

DOWN: int

Brojanje od ARR prema dolje do 0.

CENTER: int

Brojanje od 0 prema gore do ARR i zatim natrag prema dolje do 0.

Konstante prekidnog načina rada (brk argument metode init()):

BRK_OFF: int

Prekidni ulaz je onemogućen.

BRK_LOW: int

Prekidni ulaz je aktivno nizak.

BRK_HIGH: int

Prekidni ulaz je aktivno visok.

Konstante načina rada kanala (mode argument metode channel()):

PWM: int

Konfigurira kanal za PWM izlaz (aktivno visoko).

PWM_INVERTED: int

Konfigurira kanal za PWM izlaz (aktivno nisko).

OC_TIMING: int

Način rada vremenskog usklađivanja izlazne usporedbe; nijedan pin se ne pobuđuje.

OC_ACTIVE: int

Aktivni način rada izlazne usporedbe; pin postaje aktivan pri podudaranju usporedbe.

OC_INACTIVE: int

Neaktivni način rada izlazne usporedbe; pin postaje neaktivan pri podudaranju usporedbe.

OC_TOGGLE: int

Preklopni način rada izlazne usporedbe; pin se preklapa pri podudaranju usporedbe.

OC_FORCED_ACTIVE: int

Prisilno aktivni način rada izlazne usporedbe; pin se prisilno postavlja u aktivno stanje, a podudaranje usporedbe se zanemaruje.

OC_FORCED_INACTIVE: int

Prisilno neaktivni način rada izlazne usporedbe; pin se prisilno postavlja u neaktivno stanje, a podudaranje usporedbe se zanemaruje.

IC: int

Konfigurira kanal za način rada ulaznog hvatanja.

ENC_A: int

Način rada enkodera: brojač se mijenja samo kada se promijeni CH1.

ENC_B: int

Način rada enkodera: brojač se mijenja samo kada se promijeni CH2.

ENC_AB: int

Način rada enkodera: brojač se mijenja kad god se promijeni CH1 ili CH2.

Polaritet izlazne usporedbe (polarity argument metode channel() u OC načinima rada):

HIGH: int

Izlaz je aktivno visok.

LOW: int

Izlaz je aktivno nizak.

Polaritet ulaznog hvatanja (polarity argument metode channel() u IC načinu rada):

RISING: int

Hvatanje na rastućem rubu.

FALLING: int

Hvatanje na padajućem rubu.

BOTH: int

Hvatanje na bilo kojem rubu.