class Timer – sisäisten ajastimien ohjaus¶
Ajastimia voi käyttää monenlaisiin tehtäviin. Tällä hetkellä on toteutettu vain yksinkertaisin tapaus: funktion kutsuminen jaksoittain.
Jokainen ajastin koostuu laskurista, joka laskee ylöspäin tietyllä nopeudella. Laskentanopeus on oheislaitteen kellotaajuus (Hz) jaettuna ajastimen esijakajalla. Kun laskuri saavuttaa ajastimen jakson, se laukaisee tapahtuman, ja laskuri nollautuu takaisin nollaan. Käyttämällä callback-metodia ajastimen tapahtuma voi kutsua Python-funktiota.
Esimerkki LED:n vilkuttamisesta kiinteällä taajuudella:
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())
Esimerkki nimetyn funktion käytöstä takaisinkutsuna:
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
Lisää esimerkkejä:
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
Huomautus: Timer(1) on käytössä kameralle. Vastaavasti Timer(5) ohjaa servoajuria, ja Timer(6) on käytössä ajastettuun ADC/DAC-luku-/kirjoitustoimintoon. On suositeltavaa käyttää ohjelmissasi muita ajastimia.
Huomautus: Muistia ei voi varata takaisinkutsun (keskeytyksen) aikana, joten takaisinkutsun sisällä nostetut poikkeukset eivät anna paljoa tietoa. Katso micropython.alloc_emergency_exception_buf(), miten tämän rajoituksen voi kiertää.
Konstruktorit¶
- class pyb.Timer(id: int, *args, **kwargs)¶
Luo uuden ajastinolion annetulla id-tunnuksella. Jos lisäargumentteja annetaan, ajastin alustetaan funktiolla
init(...). Sallittujenid-arvojen joukko riippuu käytettävän OpenMV Cam -laitteen STM32-mikro-ohjaimesta; tarkista käytettävissä olevat yleiskäyttöiset ja kehittyneen ohjauksen ajastimet STM32-viiteoppaasta.Metodit¶
- 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¶
Alustaa ajastimen. Alustus täytyy tehdä joko taajuudella (Hz) tai esijakajalla ja jaksolla:
tim.init(freq=100) # set the timer to trigger at 100Hz tim.init(prescaler=83, period=999) # set the prescaler and period directly
Avainsana-argumentit:
freq— määrittää ajastimen jaksollisen taajuuden. Voit ajatella tämän myös taajuutena, jolla ajastin käy läpi yhden täydellisen syklin.prescaler[0-0xffff] - määrittää arvon, joka ladataan ajastimen esijakajarekisteriin (PSC). Ajastimen kellolähde jaetaan luvulla(prescaler + 1)ajastimen kellon johtamiseksi. Kellolähde tulee ajastimen emo-APB-väylältä ja on MCU-riippuvainen. STM32:ssa APB1:n ajastimet kelloittuvat tyypillisesti taajuudella2 * pclk1ja APB2:n ajastimet taajuudella2 * pclk2; lue nykyiset väylätaajuudet funktiollapyb.freq()ja tarkista OpenMV Cam -laitteesi MCU:ta koskevat tiedot STM32-viiteoppaasta.period[0-0xffff] ajastimille 1, 3, 4 ja 6-15. [0-0x3fffffff] ajastimille 2 ja 5. Määrittää arvon, joka ladataan ajastimen automaattisen uudelleenlatauksen rekisteriin (ARR). Tämä määrittää ajastimen jakson (eli milloin laskuri kiertää ympäri). Ajastimen laskuri kiertää ympäriperiod + 1ajastinkellojakson jälkeen.modevoi olla yksi seuraavista:Timer.UP- asettaa ajastimen laskemaan arvosta 0 arvoon ARR (oletus)Timer.DOWN- asettaa ajastimen laskemaan arvosta ARR alas nollaan.Timer.CENTER- asettaa ajastimen laskemaan arvosta 0 arvoon ARR ja sitten takaisin alas nollaan.
divvoi olla 1, 2 tai 4. Jakaa ajastinkellon määrittääkseen digitaalisten suodattimien käyttämän näytteenottokellon.callback- kuten Timer.callback()deadtime- määrittää ”kuolleen” tai epäaktiivisen ajan määrän siirtymien välillä komplementaarisilla kanavilla (molemmat kanavat ovat epäaktiivisia tämän ajan).deadtimevoi olla kokonaisluku väliltä 0-1008, seuraavin rajoituksin: 0-128 yhden askelin, 128-256 kahden askelin, 256-512 kahdeksan askelin ja 512-1008 kuudentoista askelin.deadtimemittaasource_freq-arvon jadiv-jaon mukaisia kellojaksoja.deadtimeon käytettävissä vain ajastimilla 1 ja 8.brk- määrittää, käytetäänkö katkaisutilaa (break) PWM:n ulostulon sammuttamiseen, kunBRK_IN-tulo on aktivoitu. Tämän argumentin arvo määrittää, onko katkaisu käytössä ja mikä sen polariteetti on, ja se voi olla yksi seuraavista:Timer.BRK_OFF,Timer.BRK_LOWtaiTimer.BRK_HIGH.BRK_IN-nastan valitsemiseksi luo Pin-olio asetuksillamode=Pin.ALT, alt=Pin.AFn_TIMx. Nastan GPIO-tulo-ominaisuudet ovat käytettävissä alt-tilassa -pull=,value()jairq().hardvoi olla yksi seuraavista:True- Takaisinkutsu suoritetaan kovan keskeytyksen kontekstissa, mikä minimoi viiveen ja värinän, mutta on alttiina kohdassa Keskeytyskäsittelijöiden kirjoittaminen kuvatuille rajoituksille, mukaan lukien kyvyttömyys varata muistia keosta.False- Takaisinkutsu ajastetaan pehmeäksi keskeytykseksi, mikä sallii sen varata muistia, mutta voi myös tuoda mukanaan roskienkeräysviiveitä ja värinää.
Tämän vaihtoehdon oletusarvo on True.
Sinun täytyy määrittää joko freq tai sekä period että prescaler.
- deinit() None¶
Lopettaa ajastimen toiminnan.
Poistaa takaisinkutsun (ja siihen liittyvän irq:n) käytöstä.
Poistaa käytöstä kaikki kanavien takaisinkutsut (ja niihin liittyvät irq:t). Pysäyttää ajastimen ja poistaa ajastinoheislaitteen käytöstä.
- callback(fun: Callable[[Timer], None] | None) None¶
Asettaa funktion, jota kutsutaan ajastimen lauetessa.
fun-funktiolle välitetään 1 argumentti, ajastinolio. JosfunonNone, takaisinkutsu poistetaan käytöstä.
- channel(channel: int, mode: int | None = None, *args, **kwargs) TimerChannel | None¶
Jos vain kanavan numero välitetään, palautetaan aiemmin alustettu kanavaolio (tai
None, jos aiempaa kanavaa ei ole).Muutoin alustetaan ja palautetaan TimerChannel-olio.
Jokainen kanava voidaan asettaa suorittamaan pwm:ää, output compare- tai input capture -toimintoa. Kaikki kanavat jakavat saman taustalla olevan ajastimen, mikä tarkoittaa, että ne jakavat saman ajastinkellon.
Avainsana-argumentit:
modevoi olla yksi seuraavista:Timer.PWM— asettaa ajastimen PWM-tilaan (aktiivinen korkealla).Timer.PWM_INVERTED— asettaa ajastimen PWM-tilaan (aktiivinen matalalla).Timer.OC_TIMING— ilmaisee, että mitään nastaa ei ohjata.Timer.OC_ACTIVE— nasta aktivoidaan, kun vertailuosuma tapahtuu (aktiivisuus määräytyy polariteetin mukaan)Timer.OC_INACTIVE— nasta tehdään epäaktiiviseksi, kun vertailuosuma tapahtuu.Timer.OC_TOGGLE— nastan tila vaihdetaan, kun vertailuosuma tapahtuu.Timer.OC_FORCED_ACTIVE— nasta pakotetaan aktiiviseksi (vertailuosuma ohitetaan).Timer.OC_FORCED_INACTIVE— nasta pakotetaan epäaktiiviseksi (vertailuosuma ohitetaan).Timer.IC— asettaa ajastimen Input Capture -tilaan.Timer.ENC_A— asettaa ajastimen Encoder-tilaan. Laskuri muuttuu vain, kun CH1 muuttuu.Timer.ENC_B— asettaa ajastimen Encoder-tilaan. Laskuri muuttuu vain, kun CH2 muuttuu.Timer.ENC_AB— asettaa ajastimen Encoder-tilaan. Laskuri muuttuu, kun CH1 tai CH2 muuttuu.
callback- kuten TimerChannel.callback()pinNone (oletus) tai Pin-olio. Jos määritetty (eikä None), tämä saa aikaan ilmoitetun nastan vaihtoehtoisen toiminnon asettamisen tälle ajastinkanavalle. Virhe nostetaan, jos nasta ei tue mitään vaihtoehtoisia toimintoja tälle ajastinkanavalle.
Avainsana-argumentit Timer.PWM-tiloille:
pulse_width- määrittää käytettävän pulssin leveyden alkuarvon.pulse_width_percent- määrittää käytettävän pulssin leveyden alkuprosenttiarvon.
Avainsana-argumentit Timer.OC-tiloille:
compare- määrittää vertailurekisterin alkuarvon.polarityvoi olla yksi seuraavista:Timer.HIGH- ulostulo on aktiivinen korkeallaTimer.LOW- ulostulo on aktiivinen matalalla
Valinnaiset avainsana-argumentit Timer.IC-tiloille:
polarityvoi olla yksi seuraavista:Timer.RISING- kaappaa nousevalla reunalla.Timer.FALLING- kaappaa laskevalla reunalla.Timer.BOTH- kaappaa molemmilla reunoilla.
Huomaa, että kaappaus toimii vain ensisijaisella kanavalla, ei komplementaarisilla kanavilla.
Huomautuksia Timer.ENC-tiloille:
Vaatii 2 nastaa, joten toinen tai molemmat nastat täytyy asettaa käyttämään asianmukaista ajastimen AF:ää Pin-API:n avulla.
Lue enkooderin arvo metodilla timer.counter().
Toimii vain kanavilla CH1 ja CH2 (ei kanavilla CH1N tai CH2N)
Kanavan numero jätetään huomiotta enkooderitilaa asetettaessa.
PWM-esimerkki – jokaisessa STM32-pohjaisessa OpenMV Cam -laitteessa
TIM4-kanavat 1 ja 2 on reititetty liitinnastoihinP7jaP8vastaavasti: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)
Vakiot¶
Laskuritilan vakiot (
init()-metodinmode-argumentti):Katkaisutilan vakiot (
init()-metodinbrk-argumentti):Kanavatilan vakiot (
channel()-metodinmode-argumentti):- OC_FORCED_ACTIVE: int¶
Output-compare-pakotettu-aktiivitila; nasta pakotetaan aktiiviseksi ja vertailuosuma ohitetaan.
- OC_FORCED_INACTIVE: int¶
Output-compare-pakotettu-epäaktiivitila; nasta pakotetaan epäaktiiviseksi ja vertailuosuma ohitetaan.
Output-compare-polariteetti (
channel()-metodinpolarity-argumentti OC-tiloissa):Input-capture-polariteetti (
channel()-metodinpolarity-argumentti IC-tilassa):