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ịidhợ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 * pclk1và các bộ định thời trên APB2 ở2 * pclk2; đọc tần số bus hiện tại bằngpyb.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 sauperiod + 1chu kỳ xung nhịp.modecó 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.
divcó 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).deadtimecó 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ủasource_freqchia chodivtick xung nhịp.deadtimechỉ 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àoBRK_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_LOWhoặcTimer.BRK_HIGH. Để chọn chân (pin)BRK_IN, hãy tạo đối tượng Pin vớimode=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()vàirq().hardcó 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ếufunlàNonethì 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
Nonenế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:
modecó 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()pinNone (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.polaritycó thể là một trong các giá trị:Timer.HIGH- đầu ra tích cực caoTimer.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:
polaritycó 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) headerP7vàP8tươ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)
Hằng số¶
Các hằng số chế độ đếm (đối số
modecủainit()):Các hằng số chế độ ngắt (đối số
brkcủainit()):Các hằng số chế độ kênh (đối số
modecủachannel()):- 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.
Cực tính output-compare (đối số
polaritycủachannel()trong các chế độ OC):Cực tính input-capture (đối số
polaritycủachannel()trong chế độ IC):