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 nilai id yang 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 pada 2 * pclk1 dan timer pada APB2 pada 2 * pclk2; baca frekuensi bus saat ini dengan pyb.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 timer period + 1.

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

  • div dapat 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). deadtime dapat 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. deadtime mengukur tick source_freq dibagi dengan tick clock div. deadtime hanya tersedia pada timer 1 dan 8.

  • brk - menentukan apakah mode break digunakan untuk mematikan output PWM ketika input BRK_IN diaktifkan. Nilai argumen ini menentukan apakah break diaktifkan dan apa polaritasnya, dan dapat berupa salah satu dari Timer.BRK_OFF, Timer.BRK_LOW atau Timer.BRK_HIGH. Untuk memilih pin BRK_IN bangun objek Pin dengan mode=Pin.ALT, alt=Pin.AFn_TIMx. Fitur input GPIO pin tersedia dalam mode alt - pull=, value() dan irq().

  • hard dapat 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. fun diteruskan 1 argumen, objek timer. Jika fun adalah None maka 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 None jika 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:

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

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

  • polarity dapat berupa salah satu dari:

    • Timer.HIGH - output aktif tinggi

    • Timer.LOW - output aktif rendah

Argumen kata kunci opsional untuk mode Timer.IC:

  • polarity dapat 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 TIM4 diarahkan ke pin header P7 dan P8 masing-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)
counter(value: int | None = None) int | None

Mendapatkan atau mengatur counter timer.

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

Mendapatkan atau mengatur frekuensi timer (mengubah prescaler dan period jika diatur).

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

Mendapatkan atau mengatur period timer.

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

Mendapatkan atau mengatur prescaler timer.

source_freq() int

Mendapatkan frekuensi sumber timer.

Konstanta

Konstanta mode counter (argumen mode dari init()):

UP: int

Hitung dari 0 naik ke ARR (mode default).

DOWN: int

Hitung dari ARR turun ke 0.

CENTER: int

Hitung dari 0 naik ke ARR kemudian kembali turun ke 0.

Konstanta mode break (argumen brk dari init()):

BRK_OFF: int

Input break dinonaktifkan.

BRK_LOW: int

Input break aktif-rendah.

BRK_HIGH: int

Input break aktif-tinggi.

Konstanta mode saluran (argumen mode dari channel()):

PWM: int

Mengonfigurasi saluran untuk output PWM (aktif tinggi).

PWM_INVERTED: int

Mengonfigurasi saluran untuk output PWM (aktif rendah).

OC_TIMING: int

Mode timing output-compare; tidak ada pin yang dikendalikan.

OC_ACTIVE: int

Mode aktif output-compare; pin dibuat aktif pada kecocokan compare.

OC_INACTIVE: int

Mode tidak aktif output-compare; pin dibuat tidak aktif pada kecocokan compare.

OC_TOGGLE: int

Mode toggle output-compare; pin berubah keadaan pada kecocokan compare.

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.

IC: int

Mengonfigurasi saluran untuk mode input-capture.

ENC_A: int

Mode encoder: counter hanya berubah ketika CH1 berubah.

ENC_B: int

Mode encoder: counter hanya berubah ketika CH2 berubah.

ENC_AB: int

Mode encoder: counter berubah setiap kali CH1 atau CH2 berubah.

Polaritas output-compare (argumen polarity dari channel() dalam mode OC):

HIGH: int

Output aktif-tinggi.

LOW: int

Output aktif-rendah.

Polaritas input-capture (argumen polarity dari channel() dalam mode IC):

RISING: int

Menangkap pada tepi naik.

FALLING: int

Menangkap pada tepi turun.

BOTH: int

Menangkap pada salah satu tepi.