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 valjanihidvrijednosti 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 taktu2 * pclk1, a oni na APB2 na2 * pclk2; očitajte trenutne frekvencije sabirnica pomoćupyb.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 nakonperiod + 1taktnih ciklusa mjerača vremena.modemož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.
divmož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).deadtimemož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.deadtimemjeri otkucajesource_freqpodijeljene sdivtaktnih otkucaja.deadtimeje 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 ulazBRK_IN. Vrijednost ovog argumenta određuje je li prekid omogućen i koji je njegov polaritet, a može bitiTimer.BRK_OFF,Timer.BRK_LOWiliTimer.BRK_HIGH. Za odabir pinaBRK_INkonstruirajte Pin objekt smode=Pin.ALT, alt=Pin.AFn_TIMx. Značajke GPIO ulaza pina dostupne su u alt načinu rada -pull=,value()iirq().hardmož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.
funse predaje 1 argument, objekt mjerača vremena. Ako jefunjednakNone, 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
Noneako 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:
modemož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()pinNone (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.polaritymože biti jedan od:Timer.HIGH- izlaz je aktivno visokTimer.LOW- izlaz je aktivno nizak
Neobavezni ključni argumenti za Timer.IC načine rada:
polaritymož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
TIM4usmjereni su na pinove zaglavljaP7odnosnoP8timer = 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)
- freq(value: int | float | None = None) int | float | None¶
Dohvaća ili postavlja frekvenciju mjerača vremena (mijenja preddjelitelj i period ako se postavi).
Konstante¶
Konstante načina brojanja (
modeargument metodeinit()):Konstante prekidnog načina rada (
brkargument metodeinit()):Konstante načina rada kanala (
modeargument metodechannel()):- 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_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.
Polaritet izlazne usporedbe (
polarityargument metodechannel()u OC načinima rada):Polaritet ulaznog hvatanja (
polarityargument metodechannel()u IC načinu rada):