kelas Timer -- mengontrol timer internal¶
Timer dapat digunakan untuk berbagai macam tugas. Saat ini, hanya kasus paling sederhana yang diimplementasikan: memanggil sebuah fungsi secara periodik.
Setiap timer terdiri dari sebuah counter yang menghitung naik dengan laju tertentu. Laju penghitungannya adalah frekuensi clock periferal (dalam Hz) dibagi dengan prescaler timer. Ketika counter mencapai period timer, ia memicu sebuah event, dan counter direset kembali ke nol. Dengan menggunakan metode callback, event timer dapat memanggil fungsi Python.
Contoh penggunaan untuk mengalihkan LED pada frekuensi tetap:
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())
Contoh menggunakan fungsi bernama untuk 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
Contoh lainnya:
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
Catatan: Timer(1) digunakan untuk kamera. Demikian juga, Timer(5) mengontrol driver servo, dan Timer(6) digunakan untuk pembacaan/penulisan ADC/DAC berwaktu. Disarankan untuk menggunakan timer lainnya dalam program Anda.
Catatan: Memori tidak dapat dialokasikan selama callback (sebuah interupsi) sehingga pengecualian yang dimunculkan dalam callback tidak memberikan banyak informasi. Lihat micropython.alloc_emergency_exception_buf() untuk cara mengatasi keterbatasan ini.
Konstruktor¶
- class pyb.Timer(id: int, *args, **kwargs)¶
Membangun objek timer baru dengan id yang diberikan. Jika argumen tambahan diberikan, maka timer diinisialisasi oleh
init(...). Kumpulan nilaiidyang valid bergantung pada MCU STM32 pada OpenMV Cam yang digunakan; lihat manual referensi STM32 untuk timer serba guna dan kontrol lanjutan yang tersedia.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¶
Menginisialisasi timer. Inisialisasi harus dilakukan baik berdasarkan frekuensi (dalam Hz) atau berdasarkan prescaler dan period:
tim.init(freq=100) # set the timer to trigger at 100Hz tim.init(prescaler=83, period=999) # set the prescaler and period directly
Argumen kata kunci:
freq--- menentukan frekuensi periodik timer. Anda juga dapat melihat ini sebagai frekuensi timer menyelesaikan satu siklus penuh.prescaler[0-0xffff] - menentukan nilai yang akan dimuat ke dalam Register Prescaler (PSC) timer. Sumber clock timer dibagi dengan(prescaler + 1)untuk mendapatkan clock timer. Sumber clock berasal dari bus APB induk timer dan bergantung pada MCU. Pada STM32, timer pada APB1 biasanya berdetak pada2 * pclk1dan timer pada APB2 pada2 * pclk2; baca frekuensi bus saat ini denganpyb.freq()dan lihat manual referensi STM32 untuk MCU OpenMV Cam Anda.period[0-0xffff] untuk timer 1, 3, 4, dan 6-15. [0-0x3fffffff] untuk timer 2 & 5. Menentukan nilai yang akan dimuat ke dalam Register AutoReload (ARR) timer. Ini menentukan period timer (yaitu kapan counter bersiklus). Counter timer akan berguling setelah siklus clock timerperiod + 1.modedapat berupa salah satu dari:Timer.UP- mengonfigurasi timer untuk menghitung dari 0 ke ARR (default)Timer.DOWN- mengonfigurasi timer untuk menghitung dari ARR turun ke 0.Timer.CENTER- mengonfigurasi timer untuk menghitung dari 0 ke ARR kemudian kembali turun ke 0.
divdapat berupa salah satu dari 1, 2, atau 4. Membagi clock timer untuk menentukan clock sampling yang digunakan oleh filter digital.callback- seperti Timer.callback()deadtime- menentukan jumlah waktu "mati" atau tidak aktif antara transisi pada saluran komplementer (kedua saluran akan tidak aktif selama waktu ini).deadtimedapat berupa bilangan bulat antara 0 dan 1008, dengan batasan berikut: 0-128 dalam langkah 1. 128-256 dalam langkah 2, 256-512 dalam langkah 8, dan 512-1008 dalam langkah 16.deadtimemengukur ticksource_freqdibagi dengan tick clockdiv.deadtimehanya tersedia pada timer 1 dan 8.brk- menentukan apakah mode break digunakan untuk mematikan output PWM ketika inputBRK_INdiaktifkan. Nilai argumen ini menentukan apakah break diaktifkan dan apa polaritasnya, dan dapat berupa salah satu dariTimer.BRK_OFF,Timer.BRK_LOWatauTimer.BRK_HIGH. Untuk memilih pinBRK_INbangun objek Pin denganmode=Pin.ALT, alt=Pin.AFn_TIMx. Fitur input GPIO pin tersedia dalam mode alt -pull=,value()danirq().harddapat berupa salah satu dari:True- Callback akan dieksekusi dalam konteks interupsi keras, yang meminimalkan penundaan dan jitter tetapi tunduk pada keterbatasan yang dijelaskan dalam Menulis interrupt handler termasuk tidak dapat mengalokasikan di heap.False- Callback akan dijadwalkan sebagai interupsi lunak, memungkinkannya untuk mengalokasikan tetapi mungkin juga memperkenalkan penundaan garbage-collection dan jitter.
Nilai default opsi ini adalah True.
Anda harus menentukan freq atau keduanya period dan prescaler.
- deinit() None¶
Mendeinialisasi timer.
Menonaktifkan callback (dan irq yang terkait).
Menonaktifkan semua callback saluran (dan irq yang terkait). Menghentikan timer, dan menonaktifkan periferal timer.
- callback(fun: Callable[[Timer], None] | None) None¶
Mengatur fungsi yang akan dipanggil ketika timer dipicu.
funditeruskan 1 argumen, objek timer. JikafunadalahNonemaka callback akan dinonaktifkan.
- channel(channel: int, mode: int | None = None, *args, **kwargs) TimerChannel | None¶
Jika hanya nomor saluran yang diteruskan, maka objek saluran yang sebelumnya diinisialisasi dikembalikan (atau
Nonejika tidak ada saluran sebelumnya).Jika tidak, objek TimerChannel diinisialisasi dan dikembalikan.
Setiap saluran dapat dikonfigurasi untuk melakukan pwm, output compare, atau input capture. Semua saluran berbagi timer yang mendasarinya, yang berarti mereka berbagi clock timer yang sama.
Argumen kata kunci:
modedapat berupa salah satu dari:Timer.PWM--- mengonfigurasi timer dalam mode PWM (aktif tinggi).Timer.PWM_INVERTED--- mengonfigurasi timer dalam mode PWM (aktif rendah).Timer.OC_TIMING--- menunjukkan bahwa tidak ada pin yang dikendalikan.Timer.OC_ACTIVE--- pin akan dibuat aktif ketika terjadi kecocokan compare (aktif ditentukan oleh polaritas)Timer.OC_INACTIVE--- pin akan dibuat tidak aktif ketika terjadi kecocokan compare.Timer.OC_TOGGLE--- pin akan diubah keadaannya ketika terjadi kecocokan compare.Timer.OC_FORCED_ACTIVE--- pin dipaksa aktif (kecocokan compare diabaikan).Timer.OC_FORCED_INACTIVE--- pin dipaksa tidak aktif (kecocokan compare diabaikan).Timer.IC--- mengonfigurasi timer dalam mode Input Capture.Timer.ENC_A--- mengonfigurasi timer dalam mode Encoder. Counter hanya berubah ketika CH1 berubah.Timer.ENC_B--- mengonfigurasi timer dalam mode Encoder. Counter hanya berubah ketika CH2 berubah.Timer.ENC_AB--- mengonfigurasi timer dalam mode Encoder. Counter berubah ketika CH1 atau CH2 berubah.
callback- seperti TimerChannel.callback()pinNone (default) atau objek Pin. Jika ditentukan (dan bukan None) ini akan menyebabkan fungsi alternatif pin yang ditunjukkan dikonfigurasi untuk saluran timer ini. Kesalahan akan dimunculkan jika pin tidak mendukung fungsi alternatif apa pun untuk saluran timer ini.
Argumen kata kunci untuk mode Timer.PWM:
pulse_width- menentukan nilai lebar pulsa awal yang akan digunakan.pulse_width_percent- menentukan persentase lebar pulsa awal yang akan digunakan.
Argumen kata kunci untuk mode Timer.OC:
compare- menentukan nilai awal register compare.polaritydapat berupa salah satu dari:Timer.HIGH- output aktif tinggiTimer.LOW- output aktif rendah
Argumen kata kunci opsional untuk mode Timer.IC:
polaritydapat berupa salah satu dari:Timer.RISING- menangkap pada tepi naik.Timer.FALLING- menangkap pada tepi turun.Timer.BOTH- menangkap pada kedua tepi.
Perhatikan bahwa capture hanya berfungsi pada saluran utama, dan tidak pada saluran komplementer.
Catatan untuk mode Timer.ENC:
Memerlukan 2 pin, sehingga satu atau kedua pin perlu dikonfigurasi untuk menggunakan AF timer yang sesuai menggunakan Pin API.
Baca nilai encoder menggunakan metode timer.counter().
Hanya bekerja pada CH1 dan CH2 (dan tidak pada CH1N atau CH2N)
Nomor saluran diabaikan saat mengatur mode encoder.
Contoh PWM -- pada setiap STM32 OpenMV Cam saluran 1 dan 2
TIM4diarahkan ke pin headerP7danP8masing-masing: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)
Konstanta¶
Konstanta mode counter (argumen
modedariinit()):Konstanta mode break (argumen
brkdariinit()):Konstanta mode saluran (argumen
modedarichannel()):- OC_FORCED_ACTIVE: int¶
Mode forced-active output-compare; pin dipaksa aktif dan kecocokan compare diabaikan.
- OC_FORCED_INACTIVE: int¶
Mode forced-inactive output-compare; pin dipaksa tidak aktif dan kecocokan compare diabaikan.
Polaritas output-compare (argumen
polaritydarichannel()dalam mode OC):Polaritas input-capture (argumen
polaritydarichannel()dalam mode IC):