class Timer – controllo dei timer interni¶
I timer possono essere utilizzati per un’ampia varietà di compiti. Al momento è implementato solo il caso più semplice: quello della chiamata periodica di una funzione.
Ogni timer è composto da un contatore che conta in avanti a una certa velocità. La velocità con cui conta è la frequenza di clock della periferica (in Hz) divisa per il prescaler del timer. Quando il contatore raggiunge il periodo del timer, viene generato un evento e il contatore viene riportato a zero. Utilizzando il metodo callback, l’evento del timer può chiamare una funzione Python.
Esempio di utilizzo per far lampeggiare un LED a una frequenza fissa:
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())
Esempio che utilizza una funzione con nome per la callback:
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
Ulteriori esempi:
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
Nota: Timer(1) è utilizzato per la camera. Analogamente, Timer(5) controlla il driver del servo e Timer(6) è utilizzato per la lettura/scrittura temporizzata di ADC/DAC. Si consiglia di utilizzare gli altri timer nei propri programmi.
Nota: la memoria non può essere allocata durante una callback (un interrupt) e quindi le eccezioni sollevate all’interno di una callback non forniscono molte informazioni. Vedere micropython.alloc_emergency_exception_buf() per sapere come aggirare questa limitazione.
Costruttori¶
- class pyb.Timer(id: int, *args, **kwargs)¶
Costruisce un nuovo oggetto timer con l’id specificato. Se vengono forniti argomenti aggiuntivi, il timer viene inizializzato tramite
init(...). L’insieme dei valoriidvalidi dipende dal MCU STM32 della OpenMV Cam in uso; consultare il manuale di riferimento STM32 per i timer general-purpose e advanced-control disponibili.Metodi¶
- 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¶
Inizializza il timer. L’inizializzazione deve avvenire o tramite frequenza (in Hz) oppure tramite prescaler e periodo:
tim.init(freq=100) # set the timer to trigger at 100Hz tim.init(prescaler=83, period=999) # set the prescaler and period directly
Argomenti keyword:
freq— specifica la frequenza periodica del timer. Si può anche considerare come la frequenza con cui il timer completa un ciclo completo.prescaler[0-0xffff] - specifica il valore da caricare nel registro Prescaler (PSC) del timer. La sorgente di clock del timer viene divisa per(prescaler + 1)per ricavare il clock del timer. La sorgente di clock proviene dal bus APB genitore del timer ed è dipendente dal MCU. Su STM32, i timer su APB1 hanno tipicamente un clock pari a2 * pclk1e i timer su APB2 pari a2 * pclk2; leggere le frequenze di bus correnti conpyb.freq()e consultare il manuale di riferimento STM32 per il MCU della propria OpenMV Cam.period[0-0xffff] per i timer 1, 3, 4 e 6-15. [0-0x3fffffff] per i timer 2 e 5. Specifica il valore da caricare nel registro AutoReload (ARR) del timer. Questo determina il periodo del timer (cioè quando il contatore completa il ciclo). Il contatore del timer effettuerà il roll-over dopoperiod + 1cicli di clock del timer.modepuò essere uno tra:Timer.UP- configura il timer per contare da 0 fino ad ARR (predefinito)Timer.DOWN- configura il timer per contare da ARR fino a 0.Timer.CENTER- configura il timer per contare da 0 fino ad ARR e poi di nuovo fino a 0.
divpuò essere 1, 2 o 4. Divide il clock del timer per determinare il clock di campionamento utilizzato dai filtri digitali.callback- come per Timer.callback()deadtime- specifica la quantità di tempo «morto» o inattivo tra le transizioni sui canali complementari (entrambi i canali saranno inattivi per questo tempo).deadtimepuò essere un intero compreso tra 0 e 1008, con le seguenti restrizioni: 0-128 a passi di 1, 128-256 a passi di 2, 256-512 a passi di 8 e 512-1008 a passi di 16.deadtimemisura i tick disource_freqdivisi per i tick di clock didiv.deadtimeè disponibile solo sui timer 1 e 8.brk- specifica se la modalità break viene utilizzata per disattivare l’uscita del PWM quando l’ingressoBRK_INviene asserito. Il valore di questo argomento determina se il break è abilitato e quale ne è la polarità, e può essere uno traTimer.BRK_OFF,Timer.BRK_LOWoTimer.BRK_HIGH. Per selezionare il pinBRK_INcostruire un oggetto Pin conmode=Pin.ALT, alt=Pin.AFn_TIMx. Le funzionalità di ingresso GPIO del pin sono disponibili in modalità alt -pull=,value()eirq().hardpuò essere uno tra:True- La callback verrà eseguita in contesto di hard interrupt, il che minimizza ritardo e jitter ma è soggetto alle limitazioni descritte in Scrittura dei gestori di interrupt, tra cui l’impossibilità di allocare sull’heap.False- La callback verrà schedulata come soft interrupt, consentendole di allocare ma introducendo possibilmente anche ritardi e jitter dovuti al garbage collection.
Il valore predefinito di questa opzione è True.
È necessario specificare freq oppure entrambi period e prescaler.
- deinit() None¶
Deinizializza il timer.
Disabilita la callback (e l’irq associato).
Disabilita eventuali callback dei canali (e gli irq associati). Arresta il timer e disabilita la periferica del timer.
- callback(fun: Callable[[Timer], None] | None) None¶
Imposta la funzione da chiamare quando il timer si attiva. A
funviene passato 1 argomento, l’oggetto timer. SefunèNoneallora la callback verrà disabilitata.
- channel(channel: int, mode: int | None = None, *args, **kwargs) TimerChannel | None¶
Se viene passato solo un numero di canale, viene restituito un oggetto canale precedentemente inizializzato (oppure
Nonese non esiste un canale precedente).Altrimenti, viene inizializzato e restituito un oggetto TimerChannel.
Ogni canale può essere configurato per eseguire pwm, output compare o input capture. Tutti i canali condividono lo stesso timer sottostante, il che significa che condividono lo stesso clock del timer.
Argomenti keyword:
modepuò essere uno tra:Timer.PWM— configura il timer in modalità PWM (attivo alto).Timer.PWM_INVERTED— configura il timer in modalità PWM (attivo basso).Timer.OC_TIMING— indica che nessun pin viene pilotato.Timer.OC_ACTIVE— il pin verrà reso attivo quando si verifica una corrispondenza di compare (lo stato attivo è determinato dalla polarità)Timer.OC_INACTIVE— il pin verrà reso inattivo quando si verifica una corrispondenza di compare.Timer.OC_TOGGLE— il pin verrà commutato quando si verifica una corrispondenza di compare.Timer.OC_FORCED_ACTIVE— il pin viene forzato attivo (la corrispondenza di compare viene ignorata).Timer.OC_FORCED_INACTIVE— il pin viene forzato inattivo (la corrispondenza di compare viene ignorata).Timer.IC— configura il timer in modalità Input Capture.Timer.ENC_A— configura il timer in modalità Encoder. Il contatore cambia solo quando cambia CH1.Timer.ENC_B— configura il timer in modalità Encoder. Il contatore cambia solo quando cambia CH2.Timer.ENC_AB— configura il timer in modalità Encoder. Il contatore cambia quando cambia CH1 o CH2.
callback- come per TimerChannel.callback()pinNone (il valore predefinito) oppure un oggetto Pin. Se specificato (e non None) questo farà sì che la funzione alternativa del pin indicato venga configurata per questo canale del timer. Verrà sollevato un errore se il pin non supporta alcuna funzione alternativa per questo canale del timer.
Argomenti keyword per le modalità Timer.PWM:
pulse_width- determina il valore iniziale della larghezza di impulso da utilizzare.pulse_width_percent- determina la percentuale iniziale della larghezza di impulso da utilizzare.
Argomenti keyword per le modalità Timer.OC:
compare- determina il valore iniziale del registro di compare.polaritypuò essere uno tra:Timer.HIGH- l’uscita è attiva altaTimer.LOW- l’uscita è attiva bassa
Argomenti keyword opzionali per le modalità Timer.IC:
polaritypuò essere uno tra:Timer.RISING- cattura sul fronte di salita.Timer.FALLING- cattura sul fronte di discesa.Timer.BOTH- cattura su entrambi i fronti.
Si noti che la cattura funziona solo sul canale primario e non sui canali complementari.
Note per le modalità Timer.ENC:
Richiede 2 pin, quindi uno o entrambi i pin dovranno essere configurati per utilizzare l’AF del timer appropriata tramite l’API Pin.
Leggere il valore dell’encoder utilizzando il metodo timer.counter().
Funziona solo su CH1 e CH2 (e non su CH1N o CH2N)
Il numero del canale viene ignorato quando si imposta la modalità encoder.
Esempio PWM – su ogni OpenMV Cam STM32 i canali 1 e 2 di
TIM4sono instradati rispettivamente ai pin di headerP7eP8timer = 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)
Costanti¶
Costanti della modalità di conteggio (argomento
modediinit()):Costanti della modalità break (argomento
brkdiinit()):Costanti della modalità del canale (argomento
modedichannel()):- OC_ACTIVE: int¶
Modalità output-compare active; il pin viene reso attivo alla corrispondenza di compare.
- OC_INACTIVE: int¶
Modalità output-compare inactive; il pin viene reso inattivo alla corrispondenza di compare.
- OC_FORCED_ACTIVE: int¶
Modalità output-compare forced-active; il pin viene forzato attivo e la corrispondenza di compare viene ignorata.
- OC_FORCED_INACTIVE: int¶
Modalità output-compare forced-inactive; il pin viene forzato inattivo e la corrispondenza di compare viene ignorata.
Polarità di output-compare (argomento
polaritydichannel()nelle modalità OC):Polarità di input-capture (argomento
polaritydichannel()nella modalità IC):