คลาส PWM -- การมอดูเลตความกว้างพัลส์

คลาส PWM ส่งสัญญาณ pulse-width modulation บน Pin เป็น API PWM แบบข้ามพอร์ตสมัยใหม่ บน STM32 OpenMV cams จะห่อเครื่องจักร channel ของ pyb.Timer ภายใน ดังนั้นแต่ละอินสแตนซ์ PWM จะใช้หนึ่ง timer channel

ตัวอย่างการใช้งาน:

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

Constructors

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

สร้างออบเจ็กต์ PWM ที่ขับ dest (ออบเจ็กต์ Pin บน OpenMV cams) อาร์กิวเมนต์แบบ keyword เทียบเท่ากับการเรียก init() ทันทีหลังจาก construction:

  • freq -- ความถี่ PWM เป็น Hz

  • duty_u16 -- duty cycle เป็นอัตราส่วน duty_u16 / 65535

  • duty_ns -- ความกว้างพัลส์เป็นนาโนวินาที

  • invert -- ถ้าเป็น True จะกลับขั้วเอาต์พุต

สามารถส่ง duty_u16 / duty_ns ได้อย่างมากหนึ่งตัวในแต่ละครั้ง การตั้ง freq อาจส่งผลต่ออินสแตนซ์ PWM อื่นที่ใช้ timer ร่วมกัน (เป็นจริงบน STM32 -- ทุก channel ของ TIM เดียวกันทำงานที่ความถี่เดียวกัน)

Methods

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

กำหนดค่าเอาต์พุต PWM ใหม่ เฉพาะอาร์กิวเมนต์ที่ส่งเท่านั้นที่จะถูกอัปเดต อาร์กิวเมนต์อื่นจะคงค่าเดิม ดูคำอธิบายอาร์กิวเมนต์แต่ละตัวใน constructor

deinit() None

ปิดการใช้งานเอาต์พุต PWM และปล่อย timer channel ที่ใช้อยู่

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

รับหรือตั้งค่าความถี่ PWM

เมื่อไม่มีอาร์กิวเมนต์ ให้คืนค่าความถี่ปัจจุบันเป็น Hz

เมื่อมีอาร์กิวเมนต์ value ตัวเดียว ให้ตั้งค่าความถี่เป็น Hz ตามค่านั้น อาจ raise ValueError ถ้าความถี่อยู่นอกช่วงที่ timer ภายในสามารถทำได้

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

รับหรือตั้งค่า duty cycle เป็นค่า 16 บิตไม่มีเครื่องหมายในช่วง 0 -- 65535

เมื่อไม่มีอาร์กิวเมนต์ ให้คืนค่า duty ปัจจุบัน

เมื่อมีอาร์กิวเมนต์ value ตัวเดียว ให้ตั้ง duty cycle เป็น value / 65535 ของคาบ 0 คือต่ำตลอดเวลา 65535 คือสูงตลอดเวลา

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

รับหรือตั้งค่าความกว้างพัลส์โดยตรงเป็นนาโนวินาที

เมื่อไม่มีอาร์กิวเมนต์ ให้คืนค่าความกว้างพัลส์ปัจจุบัน

เมื่อมีอาร์กิวเมนต์ value ตัวเดียว ให้ตั้งเวลาที่สัญญาณสูงในแต่ละรอบเป็น value นาโนวินาที มีประโยชน์สำหรับเอาต์พุตแบบ servo ที่ความกว้างพัลส์เป็นปริมาณที่มีความหมายมากกว่าอัตราส่วน duty

ข้อจำกัด

  • ความถี่ PWM และความละเอียด duty ขึ้นอยู่ซึ่งกันและกันบน hardware timer ทุกตัว ที่ความถี่สูง จะมี counter step น้อยลงในหนึ่งคาบ ดังนั้นบิตต่ำของ duty_u16 จึงมีความหมายน้อยลง

  • ความถี่ PWM ที่สามารถทำได้ขึ้นอยู่กับแหล่งนาฬิกาและ prescaler ของ timer STM32 TIM2/TIM5 เป็น 32 บิตบนส่วนใหญ่ (และ TIM3/TIM4 บน STM32N6 ด้วย) ทำให้มีช่วงความถี่และ duty กว้างขึ้น timer ที่เหลือเป็น 16 บิต ดู reference manual MCU ที่เกี่ยวข้องสำหรับช่วงที่แน่นอน

  • บน STM32 channel PWM หลายช่องบน TIM เดียวกันจะใช้ความถี่ร่วมกัน การตั้ง freq() บนอินสแตนซ์หนึ่งจะเปลี่ยนเอาต์พุตของทุก channel อื่นที่แนบกับ TIM นั้น