class PWM -- điều chế độ rộng xung

Lớp PWM xuất tín hiệu điều chế độ rộng xung trên một Pin. Đây là API PWM hiện đại, đa cổng; trên các camera OpenMV STM32 nó bao bọc cơ chế kênh pyb.Timer bên dưới, vì vậy mỗi thực thể PWM chiếm dụng một kênh timer.

Ví dụ sử dụng:

from machine import PWM, Pin

# 50 Hz PWM on a header pin with a 12.5 % duty.
pwm = PWM(Pin("P7"), freq=50, duty_u16=8192)

pwm.duty_u16(32768)            # change duty to 50 %
pwm.init(freq=5000, duty_ns=5000)  # re-init at 5 kHz, 5 us pulse
pwm.duty_ns(3000)              # 3 us pulse

pwm.deinit()

Hàm khởi tạo

class machine.PWM(dest: Pin | int, *, freq: int | None = None, duty_u16: int | None = None, duty_ns: int | None = None, invert: bool = False)

Khởi tạo một đối tượng PWM điều khiển dest (một Pin trên OpenMV cams). Các đối số từ khóa tương đương với việc gọi init() ngay sau khi khởi tạo:

  • freq -- tần số PWM tính bằng Hz.

  • duty_u16 -- chu kỳ nhiệm vụ theo tỉ lệ duty_u16 / 65535.

  • duty_ns -- độ rộng xung tính bằng nanosecond.

  • invert -- nếu True, đảo ngược cực tính đầu ra.

Chỉ được truyền tối đa một trong hai duty_u16 / duty_ns tại một thời điểm. Việc đặt freq có thể ảnh hưởng đến các thực thể PWM khác dùng chung timer bên dưới (đúng trên STM32 -- mọi kênh của một TIM nhất định đều chạy ở cùng tần số).

Các phương thức

init(*, freq: int | None = None, duty_u16: int | None = None, duty_ns: int | None = None) None

Cấu hình lại đầu ra PWM. Chỉ các đối số được cung cấp mới được cập nhật; các đối số khác giữ nguyên giá trị trước đó. Xem phần hàm khởi tạo để biết ý nghĩa của từng đối số.

deinit() None

Vô hiệu hóa đầu ra PWM và giải phóng kênh timer mà nó chiếm dụng.

freq() int
freq(value: int, /) None

Lấy hoặc đặt tần số PWM.

Không có tham số, trả về tần số hiện tại tính bằng Hz.

Với một tham số value, đặt tần số về giá trị đó tính bằng Hz. Có thể ném ValueError nếu tần số nằm ngoài phạm vi đạt được của timer bên dưới.

duty_u16() int
duty_u16(value: int, /) None

Lấy hoặc đặt chu kỳ nhiệm vụ dưới dạng giá trị 16-bit không dấu trong phạm vi 0 -- 65535.

Không có tham số, trả về chu kỳ nhiệm vụ hiện tại.

Với một tham số value, đặt chu kỳ nhiệm vụ thành value / 65535 của chu kỳ. 0 luôn thấp, 65535 luôn cao.

duty_ns() int
duty_ns(value: int, /) None

Lấy hoặc đặt trực tiếp độ rộng xung tính bằng nanosecond.

Không có tham số, trả về độ rộng xung hiện tại.

Với một tham số value, đặt thời gian mức cao của mỗi chu kỳ thành value nanosecond. Hữu ích cho các đầu ra kiểu servo nơi độ rộng xung là đại lượng có ý nghĩa thay vì tỉ lệ chu kỳ nhiệm vụ.

Giới hạn

  • Tần số PWM và độ phân giải chu kỳ nhiệm vụ phụ thuộc lẫn nhau trên mọi timer phần cứng: ở tần số cao, ít bước đếm hơn phù hợp trong một chu kỳ và do đó ít bit thấp hơn của duty_u16 có ý nghĩa.

  • Tần số PWM đạt được phụ thuộc vào nguồn xung nhịp và bộ chia trước của timer. STM32 TIM2 / TIM5 là 32-bit trên hầu hết các linh kiện (và TIM3 / TIM4 cũng vậy trên STM32N6), cho phạm vi tần số và chu kỳ nhiệm vụ rộng hơn; các timer còn lại là 16-bit. Xem sổ tay tham khảo MCU liên quan để biết phạm vi chính xác.

  • Trên STM32, nhiều kênh PWM trên cùng một TIM dùng chung tần số. Việc đặt freq() trên một thực thể sẽ thay đổi đầu ra của mọi kênh khác được gắn vào TIM đó.