Timer osztály – belső időzítők vezérlése¶
Az időzítők rendkívül sokféle feladatra használhatók. Jelenleg csak a legegyszerűbb eset van megvalósítva: egy függvény időszakos meghívása.
Minden időzítő egy számlálóból áll, amely adott ütemben számol felfelé. A számlálás üteme a periféria órajel-frekvenciája (Hz-ben) osztva az időzítő előosztójával. Amikor a számláló eléri az időzítő periódusát, eseményt vált ki, és a számláló visszaáll nullára. A callback metódus használatával az időzítő esemény egy Python függvényt hívhat meg.
Példa egy LED rögzített frekvenciájú kapcsolgatására:
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élda elnevezett függvény használatára a visszahíváshoz:
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
További példák:
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
Megjegyzés: A Timer(1) a kamerához van használva. Hasonlóan a Timer(5) vezérli a szervo meghajtót, a Timer(6) pedig az időzített ADC/DAC olvasáshoz/íráshoz használatos. Ajánlott a többi időzítőt használni a programjaidban.
Megjegyzés: A visszahívás (megszakítás) során nem foglalható memória, így a visszahíváson belül kiváltott kivételek nem adnak sok információt. Lásd a micropython.alloc_emergency_exception_buf() függvényt arról, hogyan lehet ezt a korlátozást megkerülni.
Konstruktorok¶
- class pyb.Timer(id: int, *args, **kwargs)¶
Új időzítő objektum létrehozása a megadott azonosítóval. Ha további argumentumokat is megadsz, akkor az időzítő az
init(...)hívással inicializálódik. Az érvényesidértékek halmaza a használt OpenMV Cam STM32 MCU-jától függ; az elérhető általános célú és haladó vezérlésű időzítőkről az STM32 referencia-kézikönyvében tájékozódhatsz.Metódusok¶
- 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¶
Az időzítő inicializálása. Az inicializálásnak vagy frekvencia (Hz-ben), vagy előosztó és periódus alapján kell történnie:
tim.init(freq=100) # set the timer to trigger at 100Hz tim.init(prescaler=83, period=999) # set the prescaler and period directly
Kulcsszavas argumentumok:
freq— megadja az időzítő időszakos frekvenciáját. Ezt úgy is felfoghatod, mint azt a frekvenciát, amellyel az időzítő egy teljes ciklust végigfut.prescaler[0-0xffff] - megadja az időzítő előosztó regiszterébe (PSC) betöltendő értéket. Az időzítő órajelforrása(prescaler + 1)értékkel oszlik el, így adódik az időzítő órajele. Az órajelforrás az időzítő szülő APB buszáról érkezik, és MCU-függő. STM32 esetén az APB1-en lévő időzítők jellemzően2 * pclk1órajellel, az APB2-n lévők pedig2 * pclk2órajellel működnek; az aktuális buszfrekvenciákat apyb.freq()függvénnyel olvashatod ki, az OpenMV Cam MCU-járól pedig az STM32 referencia-kézikönyvben tájékozódhatsz.period[0-0xffff] az 1, 3, 4 és 6-15 időzítőknél. [0-0x3fffffff] a 2-es és 5-ös időzítőknél. Megadja az időzítő automatikus újratöltő regiszterébe (ARR) betöltendő értéket. Ez határozza meg az időzítő periódusát (azaz azt, amikor a számláló újrakezdi a ciklust). Az időzítő számlálójaperiod + 1időzítő-órajelciklus után fordul át.A
modeaz alábbiak egyike lehet:Timer.UP- úgy konfigurálja az időzítőt, hogy 0-tól ARR-ig számoljon (alapértelmezett)Timer.DOWN- úgy konfigurálja az időzítőt, hogy ARR-tól 0-ig számoljon lefelé.Timer.CENTER- úgy konfigurálja az időzítőt, hogy 0-tól ARR-ig, majd vissza 0-ig számoljon.
A
divaz 1, 2 vagy 4 értékek egyike lehet. Elosztja az időzítő órajelét, hogy meghatározza a digitális szűrők által használt mintavételi órajelet.callback- a Timer.callback() szerintdeadtime- megadja a komplementer csatornák átmenetei közötti „holt” vagy inaktív idő mértékét (mindkét csatorna inaktív lesz ez idő alatt). Adeadtimeegy 0 és 1008 közötti egész szám lehet, az alábbi megkötésekkel: 0-128 között 1-es lépésekben, 128-256 között 2-es lépésekben, 256-512 között 8-as lépésekben, 512-1008 között pedig 16-os lépésekben. Adeadtimeasource_freqdivórajellel osztott órajelütéseit méri. Adeadtimecsak az 1-es és 8-as időzítőkön érhető el.brk- megadja, hogy a megszakítási (break) mód a PWM kimenet leállítására szolgál-e, amikor aBRK_INbemenet aktiválódik. Ennek az argumentumnak az értéke határozza meg, hogy a break engedélyezett-e és milyen a polaritása, és lehet aTimer.BRK_OFF,Timer.BRK_LOWvagyTimer.BRK_HIGHegyike. ABRK_INláb kiválasztásához hozz létre egy Pin objektumotmode=Pin.ALT, alt=Pin.AFn_TIMxparaméterekkel. A láb GPIO bemeneti funkciói alt módban is elérhetők -pull=,value()ésirq().A
hardaz alábbiak egyike lehet:True- A visszahívás kemény megszakítási kontextusban fut le, ami minimalizálja a késleltetést és a jittert, de a Megszakításkezelők írása szakaszban leírt korlátozások vonatkoznak rá, beleértve azt is, hogy nem foglalhat a heapen.False- A visszahívás lágy megszakításként ütemeződik, ami lehetővé teszi a foglalást, de szemétgyűjtési késleltetéseket és jittert is okozhat.
Ennek az opciónak az alapértelmezett értéke True.
Meg kell adnod vagy a freq értéket, vagy a period és a prescaler értéket is.
- deinit() None¶
Megszünteti az időzítő inicializálását.
Letiltja a visszahívást (és a hozzá tartozó irq-t).
Letiltja az összes csatorna-visszahívást (és a hozzájuk tartozó irq-t). Leállítja az időzítőt, és letiltja az időzítő perifériát.
- callback(fun: Callable[[Timer], None] | None) None¶
Beállítja az időzítő kiváltásakor meghívandó függvényt. A
fun1 argumentumot kap, az időzítő objektumot. Ha afunértékeNone, akkor a visszahívás letiltódik.
- channel(channel: int, mode: int | None = None, *args, **kwargs) TimerChannel | None¶
Ha csak egy csatornaszámot adsz át, akkor egy korábban inicializált csatorna objektum kerül visszaadásra (vagy
None, ha nincs korábbi csatorna).Egyébként egy TimerChannel objektum inicializálódik és kerül visszaadásra.
Minden csatorna konfigurálható pwm, kimeneti összehasonlítás (output compare) vagy bemeneti rögzítés (input capture) végzésére. Az összes csatorna ugyanazt az alapul szolgáló időzítőt osztja meg, ami azt jelenti, hogy ugyanazt az időzítő órajelet használják.
Kulcsszavas argumentumok:
A
modeaz alábbiak egyike lehet:Timer.PWM— az időzítő PWM módba konfigurálása (aktív magas).Timer.PWM_INVERTED— az időzítő PWM módba konfigurálása (aktív alacsony).Timer.OC_TIMING— jelzi, hogy egyetlen lábat sem hajt meg.Timer.OC_ACTIVE— a láb aktívvá válik, amikor összehasonlítási egyezés történik (az aktív állapotot a polaritás határozza meg)Timer.OC_INACTIVE— a láb inaktívvá válik, amikor összehasonlítási egyezés történik.Timer.OC_TOGGLE— a láb állapota átkapcsol, amikor összehasonlítási egyezés történik.Timer.OC_FORCED_ACTIVE— a láb kényszerítetten aktív (az összehasonlítási egyezés figyelmen kívül marad).Timer.OC_FORCED_INACTIVE— a láb kényszerítetten inaktív (az összehasonlítási egyezés figyelmen kívül marad).Timer.IC— az időzítő bemeneti rögzítés (Input Capture) módba konfigurálása.Timer.ENC_A— az időzítő enkóder módba konfigurálása. A számláló csak akkor változik, amikor a CH1 változik.Timer.ENC_B— az időzítő enkóder módba konfigurálása. A számláló csak akkor változik, amikor a CH2 változik.Timer.ENC_AB— az időzítő enkóder módba konfigurálása. A számláló akkor változik, amikor a CH1 vagy a CH2 változik.
callback- a TimerChannel.callback() szerintpinNone (az alapértelmezett) vagy egy Pin objektum. Ha meg van adva (és nem None), akkor a megjelölt láb alternatív funkciója ehhez az időzítő-csatornához lesz konfigurálva. Hiba keletkezik, ha a láb nem támogat egyetlen alternatív funkciót sem ehhez az időzítő-csatornához.
Kulcsszavas argumentumok a Timer.PWM módokhoz:
pulse_width- meghatározza a használandó kezdeti impulzusszélesség-értéket.pulse_width_percent- meghatározza a használandó kezdeti impulzusszélesség-százalékot.
Kulcsszavas argumentumok a Timer.OC módokhoz:
compare- meghatározza az összehasonlító regiszter kezdeti értékét.A
polarityaz alábbiak egyike lehet:Timer.HIGH- a kimenet aktív magasTimer.LOW- a kimenet aktív alacsony
Opcionális kulcsszavas argumentumok a Timer.IC módokhoz:
A
polarityaz alábbiak egyike lehet:Timer.RISING- felfutó élnél rögzít.Timer.FALLING- lefutó élnél rögzít.Timer.BOTH- mindkét élnél rögzít.
Vedd figyelembe, hogy a rögzítés csak az elsődleges csatornán működik, a komplementer csatornákon nem.
Megjegyzések a Timer.ENC módokhoz:
2 lábat igényel, így egy vagy mindkét lábat a megfelelő időzítő AF használatára kell konfigurálni a Pin API segítségével.
Olvasd ki az enkóder értékét a timer.counter() metódussal.
Csak a CH1-en és a CH2-n működik (a CH1N-en vagy a CH2N-en nem)
Az enkóder mód beállításakor a csatornaszám figyelmen kívül marad.
PWM példa – minden STM32 alapú OpenMV Cam esetén a
TIM41-es és 2-es csatornája aP7ésP8fejléclábakra van vezetve: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)
Konstansok¶
Számlálási mód konstansai (az
init()modeargumentuma):Break mód konstansai (az
init()brkargumentuma):Csatorna mód konstansai (a
channel()modeargumentuma):- OC_ACTIVE: int¶
Kimeneti összehasonlítás aktív mód; a láb aktívvá válik összehasonlítási egyezéskor.
- OC_INACTIVE: int¶
Kimeneti összehasonlítás inaktív mód; a láb inaktívvá válik összehasonlítási egyezéskor.
- OC_TOGGLE: int¶
Kimeneti összehasonlítás átkapcsolási mód; a láb állapota átkapcsol összehasonlítási egyezéskor.
- OC_FORCED_ACTIVE: int¶
Kimeneti összehasonlítás kényszerített aktív mód; a láb kényszerítetten aktív, és az összehasonlítási egyezés figyelmen kívül marad.
- OC_FORCED_INACTIVE: int¶
Kimeneti összehasonlítás kényszerített inaktív mód; a láb kényszerítetten inaktív, és az összehasonlítási egyezés figyelmen kívül marad.
Kimeneti összehasonlítás polaritása (a
channel()polarityargumentuma OC módokban):Bemeneti rögzítés polaritása (a
channel()polarityargumentuma IC módban):