ความถี่ของเอาต์พุต PWM บน Arduino คืออะไร


22

Arduinos ใช้ความถี่อะไรสำหรับ PWM ปกติเมื่อคุณใช้ analogWrite ()

และมันแตกต่างกันสำหรับ Arduino รุ่นอื่นหรือไม่? ฉันสนใจเฉพาะใน Mega 2560 แต่ยังต้องการทราบว่ามันสอดคล้องกันระหว่างรุ่นหรือไม่

ฉันเคยเห็นการอ้างอิงถึง Arduino โดยใช้ 500 Hz ซึ่งดูเหมือนช้ามาก


นอกจากนี้ยังขึ้นอยู่กับหมุดที่คุณใช้
Gerben

คำตอบ:


31

สัญญาณ PWM ถูกสร้างโดยตัวจับเวลาบนชิป AVR แต่ละตัวจับเวลาสามารถสร้างสัญญาณ PWM บนพินที่แตกต่างกันสองหรือสามตัว แต่ละขามีวงจรการทำงานเป็นของตัวเอง แต่ใช้ความถี่ PWM ร่วมกัน คุณสามารถเปลี่ยนความถี่ของ PWM ได้โดยการเปลี่ยนแหล่งสัญญาณนาฬิกาสำหรับตัวจับเวลา โดยค่าเริ่มต้นพวกเขาใช้นาฬิกา CPU หารด้วย 64 เช่น พวกเขาตั้งค่าพรีสเกลเลอร์ไว้ที่ 64 โดยรหัสเริ่มต้นของ Arduino เพื่อสร้างความสับสนมากขึ้นมีสองโหมด PWM ที่แตกต่างกัน: PWM ที่รวดเร็วและเฟสที่ถูกต้อง PWM ใน PWM ที่รวดเร็วตัวจับเวลานับเป็น 255 จากนั้นโอเวอร์โฟลว์และเริ่มต้นใหม่จาก 0 (256 สถานะที่แตกต่างกัน) ในการแก้ไขเฟส PWM ตัวจับเวลานับเป็น 255 จากนั้นเปลี่ยนทิศทางและนับถอยหลังสู่ศูนย์เปลี่ยนทิศทางและอื่น ๆ (510 สถานะที่แตกต่างกัน)

Arduino Mega มี 5 ตัวจับเวลา, timer0 - timer4 เนื่องจากตัวจับเวลา 0 ใช้สำหรับฟังก์ชั่นมิลลิวินาทีและไมโครวินาทีจึงใช้ PWM ที่รวดเร็วในขณะที่ตัวจับเวลาอื่นถูกกำหนดค่าสำหรับ PWM ที่ถูกต้องสำหรับเฟส ผลลัพธ์นี้มีความถี่ที่แตกต่างกันในพินที่แตกต่างกัน:

  • พิน 4 และ 13 ควบคุมโดยตัวจับเวลา 0:
    16 Mhz / 64/256 = 976.56 Hz

  • หมุด PWM อื่น ๆ ที่ควบคุมโดย timer1-4:
    16 Mhz / 64/510 = 490.20 Hz

การคำนวณคือ: สถานะจำนวนนาฬิกา / Prescaler / PWM

สถานการณ์นั้นเหมือนกันสำหรับบอร์ด Arduino อื่น ๆ ทั้งหมดที่ฉันรู้จักยกเว้นว่ามีตัวจับเวลาน้อยกว่าที่เชื่อมต่อกับพินที่แตกต่างกัน

คุณสามารถเปลี่ยนความถี่ PWM ได้โดยเปลี่ยนการจับเวลาล่วงหน้า ดูหน้านี้: http://playground.arduino.cc/Main/TimerPWMCheatsheet

นอกจากนี้ยังเป็นไปได้ที่จะทำให้ตัวจับเวลานับเป็นค่าที่แตกต่างจาก 255 ในตัวจับเวลา 8 บิตคุณจะคลายหมุดออก แต่ในตัวจับเวลา 16 บิตคุณสามารถใช้ Input Capture Register เพื่อกำหนดค่า TOP ฟังก์ชั่นการจับภาพอินพุตนั้นเป็นคุณสมบัติที่ไม่ค่อยได้ใช้ในชุมชน Arduino ดังนั้นคุณน่าจะพลาดไม่ได้

ไลบรารี Arduino อนุญาตให้คุณใช้ความละเอียด 8 บิตเท่านั้นแม้แต่บนตัวจับเวลา 16 บิต หากคุณต้องการความละเอียดสูงกว่าคุณจะต้องเขียน analogWrite ของคุณเองหรือใช้ห้องสมุดที่สร้างขึ้นเพื่อวัตถุประสงค์ บน Arduino Mega timer0 และ timer2 คือ 8 บิตในขณะที่ส่วนที่เหลือเป็น 16 บิต

ด้วยการเปลี่ยนโหมดของตัวจับเวลา 16 บิตเพื่อใช้ความละเอียดเต็มรูปแบบเมื่อรวมกับการเปลี่ยนพรีสเกลเลอร์และค่า TOP คุณจะสามารถรับความถี่ PWM ได้หลากหลายมาก

ความถี่สูงสุดที่คุณสามารถทำได้คือนาฬิกา / 4 โดยการตั้งค่าพรีสเกลเลอร์เป็น 1 และ TOP ถึง 3 ในโหมด PWM ที่รวดเร็ว - ไม่อนุญาตให้ใช้ค่าต่ำกว่า สิ่งนี้จะให้ PWM 4 MHz ที่มีความละเอียด 2 บิต สามารถอยู่ที่ 0%, 25%, 50% หรือ 75% ของเวลา ค่า TOP ที่สูงขึ้นจะให้ความละเอียดที่สูงขึ้นในความถี่ต่ำ

สำหรับคำอธิบายอีกต่อไปอ่านบทความหรือดูที่แผ่นข้อมูล

เปลี่ยน prescaler โหมด PWM หรือค่าสูงสุดสำหรับ timer0 ประสงค์ยุ่งกับและmillis()micros()


1
ฉันรวบรวมแล้วว่าความถี่ที่เร็วที่สุดที่คุณจะได้รับสำหรับ PWM คือ 16Mhz / 256 (prescaler = 1) หรือ 62.5Khz?
Duncan C

และยิ่งไปกว่านั้นความถี่ PWM จะต้องเป็นปัจจัยที่เท่าเทียมกันของ 62.5KHz? บางคนในเธรดอื่นต้องการควบคุมความเร็วพัดลมของพัดลมพีซีแบบ 4 พิน เห็นได้ชัดว่ามันต้องการสัญญาณควบคุม PWM 25KHz 62.5 / 25 คือ 2.5 ซึ่งไม่ใช่ค่าจำนวนเต็ม
Duncan C

ฉันปรับปรุงคำตอบเพื่ออธิบายเพิ่มเติมเกี่ยวกับความเป็นไปได้ในการบรรลุความถี่ที่เฉพาะเจาะจง
2973

ที่ความถี่ต่ำสุดคุณสามารถตั้งเวลาล่วงหน้า 16 บิตในโหมดแก้ไขเฟสโดย Prescaler 1024 เพื่อรับ 16e6 / 1024/2 ^ 16/2 = 0.119Hz หรือ 7.1 รอบ / นาที สำหรับต่ำกว่านั้นหนึ่งจะต้องสลับบิตตามสิ่งเช่น millis () หรืออาจเรียกเคาน์เตอร์บนขาอินพุตภายนอก T
เดฟ X
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.