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(...). Sallittujen id-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 taajuudella 2 * pclk1 ja APB2:n ajastimet taajuudella 2 * pclk2; lue nykyiset väylätaajuudet funktiolla pyb.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äri period + 1 ajastinkellojakson jälkeen.

  • mode voi 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.

  • div voi 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). deadtime voi 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. deadtime mittaa source_freq-arvon ja div-jaon mukaisia kellojaksoja. deadtime on käytettävissä vain ajastimilla 1 ja 8.

  • brk - määrittää, käytetäänkö katkaisutilaa (break) PWM:n ulostulon sammuttamiseen, kun BRK_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_LOW tai Timer.BRK_HIGH. BRK_IN-nastan valitsemiseksi luo Pin-olio asetuksilla mode=Pin.ALT, alt=Pin.AFn_TIMx. Nastan GPIO-tulo-ominaisuudet ovat käytettävissä alt-tilassa - pull=, value() ja irq().

  • hard voi 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. Jos fun on None, 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:

  • mode voi 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()

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

  • polarity voi olla yksi seuraavista:

    • Timer.HIGH - ulostulo on aktiivinen korkealla

    • Timer.LOW - ulostulo on aktiivinen matalalla

Valinnaiset avainsana-argumentit Timer.IC-tiloille:

  • polarity voi 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 liitinnastoihin P7 ja P8 vastaavasti:

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

Hakee tai asettaa ajastimen laskurin.

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

Hakee tai asettaa ajastimen taajuuden (muuttaa esijakajaa ja jaksoa, jos asetetaan).

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

Hakee tai asettaa ajastimen jakson.

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

Hakee tai asettaa ajastimen esijakajan.

source_freq() int

Hakee ajastimen lähteen taajuuden.

Vakiot

Laskuritilan vakiot (init()-metodin mode-argumentti):

UP: int

Laske arvosta 0 ylös arvoon ARR (oletustila).

DOWN: int

Laske arvosta ARR alas arvoon 0.

CENTER: int

Laske arvosta 0 ylös arvoon ARR ja sitten takaisin alas arvoon 0.

Katkaisutilan vakiot (init()-metodin brk-argumentti):

BRK_OFF: int

Katkaisutulo on poistettu käytöstä.

BRK_LOW: int

Katkaisutulo on aktiivinen matalalla.

BRK_HIGH: int

Katkaisutulo on aktiivinen korkealla.

Kanavatilan vakiot (channel()-metodin mode-argumentti):

PWM: int

Aseta kanava PWM-ulostuloon (aktiivinen korkealla).

PWM_INVERTED: int

Aseta kanava PWM-ulostuloon (aktiivinen matalalla).

OC_TIMING: int

Output-compare-ajoitustila; mitään nastaa ei ohjata.

OC_ACTIVE: int

Output-compare-aktiivitila; nasta aktivoidaan vertailuosumalla.

OC_INACTIVE: int

Output-compare-epäaktiivitila; nasta tehdään epäaktiiviseksi vertailuosumalla.

OC_TOGGLE: int

Output-compare-vaihtotila; nastan tila vaihtuu vertailuosumalla.

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.

IC: int

Aseta kanava input-capture-tilaan.

ENC_A: int

Encoder-tila: laskuri muuttuu vain, kun CH1 muuttuu.

ENC_B: int

Encoder-tila: laskuri muuttuu vain, kun CH2 muuttuu.

ENC_AB: int

Encoder-tila: laskuri muuttuu aina, kun CH1 tai CH2 muuttuu.

Output-compare-polariteetti (channel()-metodin polarity-argumentti OC-tiloissa):

HIGH: int

Ulostulo on aktiivinen korkealla.

LOW: int

Ulostulo on aktiivinen matalalla.

Input-capture-polariteetti (channel()-metodin polarity-argumentti IC-tilassa):

RISING: int

Kaappaa nousevalla reunalla.

FALLING: int

Kaappaa laskevalla reunalla.

BOTH: int

Kaappaa kummalla tahansa reunalla.