คลาส 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 เป็น Hzduty_u16-- duty cycle เป็นอัตราส่วนduty_u16 / 65535duty_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
- freq() int¶
- freq(value: int, /) None
รับหรือตั้งค่าความถี่ PWM
เมื่อไม่มีอาร์กิวเมนต์ ให้คืนค่าความถี่ปัจจุบันเป็น Hz
เมื่อมีอาร์กิวเมนต์
valueตัวเดียว ให้ตั้งค่าความถี่เป็น Hz ตามค่านั้น อาจ raiseValueErrorถ้าความถี่อยู่นอกช่วงที่ 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 นั้น