class Timer -- điều khiển bộ định thời nội bộ

Bộ định thời có thể được sử dụng cho nhiều tác vụ khác nhau. Hiện tại, chỉ trường hợp đơn giản nhất được triển khai: gọi một hàm theo chu kỳ.

Mỗi bộ định thời gồm một bộ đếm tăng dần theo một tốc độ nhất định. Tốc độ đếm là tần số xung nhịp của ngoại vi (tính bằng Hz) chia cho bộ chia tần số của bộ định thời. Khi bộ đếm đạt đến chu kỳ của bộ định thời, nó kích hoạt một sự kiện và bộ đếm được đặt lại về không. Bằng cách sử dụng phương thức callback, sự kiện bộ định thời có thể gọi một hàm Python.

Ví dụ sử dụng để bật/tắt đèn LED theo tần số cố định:

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())

Ví dụ sử dụng hàm có tên cho hàm gọi lại:

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

Các ví dụ thêm:

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

Lưu ý: Timer(1) được dùng cho camera. Tương tự, Timer(5) điều khiển bộ điều khiển servo, và Timer(6) được dùng để đọc/ghi ADC/DAC có định thời. Khuyến nghị sử dụng các bộ định thời khác trong chương trình của bạn.

Lưu ý: Không thể cấp phát bộ nhớ trong hàm gọi lại (một ngắt), vì vậy các ngoại lệ phát sinh trong hàm gọi lại không cung cấp nhiều thông tin. Xem micropython.alloc_emergency_exception_buf() để biết cách khắc phục hạn chế này.

Hàm khởi tạo

class pyb.Timer(id: int, *args, **kwargs)

Khởi tạo một đối tượng bộ định thời mới với id đã cho. Nếu có thêm các đối số, thì bộ định thời sẽ được khởi tạo bằng init(...). Tập hợp các giá trị id hợp lệ phụ thuộc vào MCU STM32 trên OpenMV Cam đang sử dụng; hãy tham khảo tài liệu tham khảo STM32 để biết các bộ định thời đa năng và điều khiển nâng cao.

Các phương thức

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

Khởi tạo bộ định thời. Quá trình khởi tạo phải thực hiện bằng tần số (tính bằng Hz) hoặc bằng bộ chia tần số và chu kỳ:

tim.init(freq=100)                  # set the timer to trigger at 100Hz
tim.init(prescaler=83, period=999)  # set the prescaler and period directly

Các đối số từ khóa:

  • freq --- chỉ định tần số chu kỳ của bộ định thời. Bạn cũng có thể hiểu đây là tần số mà bộ định thời hoàn thành một chu kỳ đầy đủ.

  • prescaler [0-0xffff] - chỉ định giá trị được nạp vào Thanh ghi Bộ chia tần số (PSC) của bộ định thời. Nguồn xung nhịp bộ định thời được chia cho (prescaler + 1) để tạo ra xung nhịp bộ định thời. Nguồn xung nhịp đến từ bus APB cha của bộ định thời và phụ thuộc vào MCU. Trên STM32, các bộ định thời trên APB1 thường chạy ở 2 * pclk1 và các bộ định thời trên APB2 ở 2 * pclk2; đọc tần số bus hiện tại bằng pyb.freq() và tham khảo tài liệu tham khảo STM32 cho MCU của OpenMV Cam.

  • period [0-0xffff] đối với bộ định thời 1, 3, 4 và 6-15. [0-0x3fffffff] đối với bộ định thời 2 & 5. Chỉ định giá trị được nạp vào Thanh ghi AutoReload (ARR) của bộ định thời. Điều này xác định chu kỳ của bộ định thời (tức là khi bộ đếm chạy hết chu kỳ). Bộ đếm bộ định thời sẽ tràn sau period + 1 chu kỳ xung nhịp.

  • mode có thể là một trong các giá trị:

    • Timer.UP - cấu hình bộ định thời đếm từ 0 đến ARR (mặc định)

    • Timer.DOWN - cấu hình bộ định thời đếm từ ARR xuống 0.

    • Timer.CENTER - cấu hình bộ định thời đếm từ 0 đến ARR rồi đếm ngược xuống 0.

  • div có thể là 1, 2 hoặc 4. Chia xung nhịp bộ định thời để xác định xung nhịp lấy mẫu dùng bởi các bộ lọc số.

  • callback - theo Timer.callback()

  • deadtime - chỉ định lượng thời gian "chết" hoặc không hoạt động giữa các chuyển tiếp trên các kênh bổ sung (cả hai kênh sẽ không hoạt động trong khoảng thời gian này). deadtime có thể là số nguyên từ 0 đến 1008, với các hạn chế sau: 0-128 theo bước 1, 128-256 theo bước 2, 256-512 theo bước 8, và 512-1008 theo bước 16. deadtime đo bằng tick của source_freq chia cho div tick xung nhịp. deadtime chỉ khả dụng trên bộ định thời 1 và 8.

  • brk - chỉ định xem chế độ ngắt có được sử dụng để tắt đầu ra PWM khi tín hiệu đầu vào BRK_IN được kích hoạt hay không. Giá trị của đối số này xác định xem ngắt có được kích hoạt và cực tính là gì, và có thể là một trong các giá trị Timer.BRK_OFF, Timer.BRK_LOW hoặc Timer.BRK_HIGH. Để chọn chân (pin) BRK_IN, hãy tạo đối tượng Pin với mode=Pin.ALT, alt=Pin.AFn_TIMx. Các tính năng đầu vào GPIO của chân (pin) có sẵn ở chế độ alt - pull=, value()irq().

  • hard có thể là một trong các giá trị:

    • True - Hàm gọi lại sẽ được thực thi trong ngữ cảnh ngắt cứng, giúp giảm thiểu độ trễ và jitter nhưng phải tuân theo các hạn chế được mô tả trong Viết trình xử lý ngắt, bao gồm việc không thể cấp phát trên heap.

    • False - Hàm gọi lại sẽ được lên lịch như một ngắt mềm, cho phép cấp phát bộ nhớ nhưng có thể tạo ra độ trễ thu gom rác và jitter.

    Giá trị mặc định của tùy chọn này là True.

Bạn phải chỉ định freq hoặc cả period và prescaler.

deinit() None

Hủy khởi tạo bộ định thời.

Vô hiệu hóa hàm gọi lại (và ngắt liên quan).

Vô hiệu hóa tất cả các hàm gọi lại của kênh (và ngắt liên quan). Dừng bộ định thời và vô hiệu hóa ngoại vi bộ định thời.

callback(fun: Callable[[Timer], None] | None) None

Đặt hàm được gọi khi bộ định thời kích hoạt. fun được truyền 1 đối số là đối tượng bộ định thời. Nếu funNone thì hàm gọi lại sẽ bị vô hiệu hóa.

channel(channel: int, mode: int | None = None, *args, **kwargs) TimerChannel | None

Nếu chỉ có số kênh được truyền vào, thì đối tượng kênh đã được khởi tạo trước đó sẽ được trả về (hoặc None nếu không có kênh nào trước đó).

Ngược lại, một đối tượng TimerChannel sẽ được khởi tạo và trả về.

Mỗi kênh có thể được cấu hình để thực hiện PWM, output compare hoặc input capture. Tất cả các kênh dùng chung bộ định thời cơ bản, nghĩa là chúng chia sẻ cùng xung nhịp bộ định thời.

Các đối số từ khóa:

  • mode có thể là một trong các giá trị:

    • Timer.PWM --- cấu hình bộ định thời ở chế độ PWM (tích cực cao).

    • Timer.PWM_INVERTED --- cấu hình bộ định thời ở chế độ PWM (tích cực thấp).

    • Timer.OC_TIMING --- cho biết không có chân (pin) nào được điều khiển.

    • Timer.OC_ACTIVE --- chân (pin) sẽ được kích hoạt khi xảy ra so sánh khớp (tích cực được xác định bởi cực tính)

    • Timer.OC_INACTIVE --- chân (pin) sẽ bị vô hiệu hóa khi xảy ra so sánh khớp.

    • Timer.OC_TOGGLE --- chân (pin) sẽ bật/tắt khi xảy ra so sánh khớp.

    • Timer.OC_FORCED_ACTIVE --- chân (pin) bị buộc ở mức tích cực (so sánh khớp bị bỏ qua).

    • Timer.OC_FORCED_INACTIVE --- chân (pin) bị buộc ở mức không tích cực (so sánh khớp bị bỏ qua).

    • Timer.IC --- cấu hình bộ định thời ở chế độ Input Capture.

    • Timer.ENC_A --- cấu hình bộ định thời ở chế độ Encoder. Bộ đếm chỉ thay đổi khi CH1 thay đổi.

    • Timer.ENC_B --- cấu hình bộ định thời ở chế độ Encoder. Bộ đếm chỉ thay đổi khi CH2 thay đổi.

    • Timer.ENC_AB --- cấu hình bộ định thời ở chế độ Encoder. Bộ đếm thay đổi khi CH1 hoặc CH2 thay đổi.

  • callback - theo TimerChannel.callback()

  • pin None (mặc định) hoặc một đối tượng Pin. Nếu được chỉ định (và không phải None), điều này sẽ khiến hàm thay thế của chân (pin) được chỉ định được cấu hình cho kênh bộ định thời này. Lỗi sẽ xuất hiện nếu chân (pin) không hỗ trợ bất kỳ hàm thay thế nào cho kênh bộ định thời này.

Các đối số từ khóa cho các chế độ Timer.PWM:

  • pulse_width - xác định giá trị độ rộng xung ban đầu để sử dụng.

  • pulse_width_percent - xác định phần trăm độ rộng xung ban đầu để sử dụng.

Các đối số từ khóa cho các chế độ Timer.OC:

  • compare - xác định giá trị ban đầu của thanh ghi so sánh.

  • polarity có thể là một trong các giá trị:

    • Timer.HIGH - đầu ra tích cực cao

    • Timer.LOW - đầu ra tích cực thấp

Các đối số từ khóa tùy chọn cho các chế độ Timer.IC:

  • polarity có thể là một trong các giá trị:

    • Timer.RISING - bắt trên cạnh lên.

    • Timer.FALLING - bắt trên cạnh xuống.

    • Timer.BOTH - bắt trên cả hai cạnh.

Lưu ý rằng chế độ capture chỉ hoạt động trên kênh chính, không hoạt động trên các kênh bổ sung.

Lưu ý cho các chế độ Timer.ENC:

  • Yêu cầu 2 chân (pin), vì vậy một hoặc cả hai chân (pin) sẽ cần được cấu hình để sử dụng AF bộ định thời thích hợp bằng cách sử dụng Pin API.

  • Đọc giá trị encoder bằng phương thức timer.counter().

  • Chỉ hoạt động trên CH1 và CH2 (không hoạt động trên CH1N hoặc CH2N)

  • Số kênh bị bỏ qua khi đặt chế độ encoder.

Ví dụ PWM -- trên mọi STM32 OpenMV Cam, các kênh 1 và 2 của TIM4 được định tuyến đến các chân (pin) header P7P8 tương ứng:

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

Lấy hoặc đặt bộ đếm bộ định thời.

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

Lấy hoặc đặt tần số cho bộ định thời (thay đổi bộ chia tần số và chu kỳ nếu được đặt).

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

Lấy hoặc đặt chu kỳ của bộ định thời.

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

Lấy hoặc đặt bộ chia tần số cho bộ định thời.

source_freq() int

Lấy tần số của nguồn xung nhịp của bộ định thời.

Hằng số

Các hằng số chế độ đếm (đối số mode của init()):

UP: int

Đếm từ 0 lên đến ARR (chế độ mặc định).

DOWN: int

Đếm từ ARR xuống 0.

CENTER: int

Đếm từ 0 lên đến ARR rồi đếm ngược xuống 0.

Các hằng số chế độ ngắt (đối số brk của init()):

BRK_OFF: int

Đầu vào ngắt bị vô hiệu hóa.

BRK_LOW: int

Đầu vào ngắt ở mức tích cực thấp.

BRK_HIGH: int

Đầu vào ngắt ở mức tích cực cao.

Các hằng số chế độ kênh (đối số mode của channel()):

PWM: int

Cấu hình kênh cho đầu ra PWM (tích cực cao).

PWM_INVERTED: int

Cấu hình kênh cho đầu ra PWM (tích cực thấp).

OC_TIMING: int

Chế độ output-compare timing; không có chân (pin) nào được điều khiển.

OC_ACTIVE: int

Chế độ output-compare active; chân (pin) được kích hoạt khi so sánh khớp.

OC_INACTIVE: int

Chế độ output-compare inactive; chân (pin) bị vô hiệu hóa khi so sánh khớp.

OC_TOGGLE: int

Chế độ output-compare toggle; chân (pin) bật/tắt khi so sánh khớp.

OC_FORCED_ACTIVE: int

Chế độ output-compare forced-active; chân (pin) bị buộc ở mức tích cực và so sánh khớp bị bỏ qua.

OC_FORCED_INACTIVE: int

Chế độ output-compare forced-inactive; chân (pin) bị buộc ở mức không tích cực và so sánh khớp bị bỏ qua.

IC: int

Cấu hình kênh cho chế độ input-capture.

ENC_A: int

Chế độ Encoder: bộ đếm chỉ thay đổi khi CH1 thay đổi.

ENC_B: int

Chế độ Encoder: bộ đếm chỉ thay đổi khi CH2 thay đổi.

ENC_AB: int

Chế độ Encoder: bộ đếm thay đổi bất cứ khi nào CH1 hoặc CH2 thay đổi.

Cực tính output-compare (đối số polarity của channel() trong các chế độ OC):

HIGH: int

Đầu ra ở mức tích cực cao.

LOW: int

Đầu ra ở mức tích cực thấp.

Cực tính input-capture (đối số polarity của channel() trong chế độ IC):

RISING: int

Bắt trên cạnh lên.

FALLING: int

Bắt trên cạnh xuống.

BOTH: int

Bắt trên cả hai cạnh.