ทำไมบางพินถึงมีความถี่ PWM แตกต่างกัน?


20

อ้างอิงจากArduino สำหรับanalogWrite()ความถี่ PWM บนพินส่วนใหญ่คือ ~ 490 Hz อย่างไรก็ตามมันมีค่า ~ 980 Hz สำหรับหมุด 5 และ 6 บน Uno และสำหรับหมุด 3 และ 11 บน Leonardo

ทำไมเหล่านี้แตกต่างกันอย่างไร มันเป็นคุณสมบัติการออกแบบโดยเจตนาหรือเป็นไปตามที่ฮาร์ดแวร์กำหนดไว้หรือไม่?

คำตอบ:


23

สิ่งเหล่านี้ไม่ใช่ความถี่เดียวที่มีสำหรับสัญญาณ PWM อย่างไรก็ตามพวกเขาเป็นความถี่ที่กำหนดโดย prescaler ที่ใช้ (ซึ่งคุณสามารถเปลี่ยนได้อย่างง่ายดายตามรายละเอียดด้านล่าง)

หมุด PWM 3 คู่แต่ละตัวเชื่อมโยงกับตัวจับเวลาหนึ่งตัวแต่ละตัวมีความถี่พื้นฐานของตัวเองดังต่อไปนี้:

  • พินที่ 5 และ 6 ถูกจับคู่กับตัวจับเวลา 0 พร้อมความถี่พื้นฐาน 62500Hz
  • หมุด 9 และ 10 ถูกจับคู่บน timer1 โดยมีความถี่พื้นฐาน 31250Hz
  • พิน 3 และ 11 ถูกจับคู่บน timer2 โดยมีความถี่พื้นฐาน 31250Hz

จากนั้นชุดพินแต่ละชุดจะมีค่าพรีเซลเลอร์จำนวนหนึ่งซึ่งสามารถเลือกได้ซึ่งจะแบ่งความถี่พื้นฐานของพินคู่นั้น ค่าพรีสเกลเลอร์ที่มีคือ:

  • พิน 5 และ 6 มีค่าพรีเซลเลอร์เป็น 1, 8, 64, 256 และ 1024
  • พิน 9 และ 10 มีค่าพรีสเกลเลอร์เป็น 1, 8, 64, 256 และ 1024
  • พิน 3 และ 11 มีค่าพรีสเกลเลอร์เป็น 1, 8, 32, 64, 128, 256, และ 1024

การผสมที่แตกต่างกันจะให้ความถี่ที่แตกต่างกันในพิน PWM ที่กำหนด ขอให้สังเกตว่าตัวจับเวลา 2 (ผูกกับหมุด 3 และ 11) มีค่าพรีสเกลเลอร์มากกว่าที่มีอยู่ทำให้มีความถี่มากขึ้น

ทีนี้ทำไมตัวจับเวลา 2 ถึงแตกต่างนั่นเป็นคำถามแยกต่างหาก

แก้ไข: นี่คือรายการความถี่ PWM ที่เป็นไปได้ต่อขา (จากบทความนี้ ):

สำหรับพิน 6 และ 5 (OC0A และ OC0B):

  • หาก TCCR0B = xxxxx001 ความถี่คือ 64kHz
  • หาก TCCR0B = xxxxx010 ความถี่คือ 8 kHz
  • หาก TCCR0B = xxxxx011 ความถี่คือ 1kHz (นี่เป็นค่าเริ่มต้นจาก Diecimila bootloader)
  • หาก TCCR0B = xxxxx100 ความถี่คือ 250Hz
  • หาก TCCR0B = xxxxx101 ความถี่คือ 62.5 Hz

สำหรับพิน 9, 10, 11 และ 3 (OC1A, OC1B, OC2A, OC2B):

  • หาก TCCRnB = xxxxx001 ความถี่คือ 32kHz
  • หาก TCCRnB = xxxxx010 ความถี่คือ 4 kHz
  • หาก TCCRnB = xxxxx011 ความถี่คือ 500Hz (นี่คือค่าเริ่มต้นจาก Diecimila bootloader)
  • หาก TCCRnB = xxxxx100 ความถี่คือ 125Hz
  • หาก TCCRnB = xxxxx101 ความถี่คือ 31.25 Hz

TCCRnBเป็นที่ที่คุณตั้งค่าบิต prescaler สำหรับตัวจับเวลาnแทนที่nด้วย 0, 1 หรือ 2 ขึ้นอยู่กับตัวจับเวลาที่คุณต้องการตั้งค่า หากคุณยังไม่แน่ใจเกี่ยวกับการใช้งานระดับบิตโปรดอ่านบทช่วยสอนคณิตศาสตร์นี้

แหล่งที่มาของฉัน:

โปรดทราบว่าดูเหมือนว่ามีความแตกต่างในแหล่งข้อมูลเหล่านั้นเกี่ยวกับว่าหมุด 9 และ 10 มีพฤติกรรมเช่นเดียวกับ 5 และ 6 หรือ 3 และ 11 แต่คุณได้รับแนวคิดดังกล่าว ฉันกำลังอ่านชุดข้อมูลเพื่อลองและหาว่าถูกต้องหรือไม่ว่านี่เป็นความแตกต่างระหว่างบอร์ดหรือไม่


1
คำตอบนี้อ้างถึง ATmega อะไร? ฉันไม่ได้ตรวจสอบ แต่ฉันคิดว่ามันต่างกันเล็กน้อยต่อคอนโทรลเลอร์
jippie

@ jippie จุดดี! แหล่งข้อมูลอ้างถึง ATmega168 และ 328
Ricardo

@ jippie เพียงเพื่อชี้แจงในคำตอบของฉันหมายเลขพินอ้างถึงวิธีการที่พวกเขาได้รับมอบหมายในคณะกรรมการ Uno (pin 1 หมายถึง Digital Pin 1 หรือ D1 เป็นต้น) ไม่ใช่ IC (ATmega328 pin 1 ถูกรีเซ็ต)
Ricardo

1
ฉันเชื่อว่ารายละเอียดเหล่านั้นมีการเปลี่ยนแปลงเช่นกันกับบอร์ด, Uno, Duemilanove, Mega, ...
jippie

@ jippie แน่นอนใช่
Ricardo

8

ฉันไม่ได้ตระหนักถึงการพิจารณาการออกแบบ แต่ถ้าคุณตรวจสอบแผ่นข้อมูลสำหรับไมโครคอนโทรลเลอร์บน Arduino ของคุณคุณจะสังเกตเห็นว่าหมุด PWM ถูกจัดกลุ่มเข้าด้วยกันและต่อกลุ่มที่เชื่อมต่อกับตัวจับเวลา ความเร็วที่ตัวจับเวลานี้เพิ่มขึ้นจะแตกต่างกันไปตามพรีสเกลเลอร์ที่กำหนดค่าไว้ หากคุณเปลี่ยนพรีสเกลเลอร์สำหรับตัวจับเวลาบางตัวคุณจะเปลี่ยนความถี่ PWM สำหรับพิน PWM ที่เกี่ยวข้อง ฉันเชื่อว่าตัวจับเวลาบางตัวเป็นสองเท่าสำหรับวัตถุประสงค์อื่นเช่นmillis();ฟังก์ชั่น หากคุณเปลี่ยนพรีสเกลเลอร์สำหรับตัวจับเวลานั้นค่าที่ส่งคืนmillis()จะถูกปิดโดยปัจจัยเดียวกัน

คุณสามารถคำนวณการตั้งค่าสำหรับพรีสเกลเลอร์ดังนี้:

$$ \ text {prescaler} = \ dfrac {f_ {CPU}} {PWM การแก้ไข× f_ {PWM}} = \ dfrac {16 \ text {MHz}} {256 × 490} \ ประมาณ 128 $$

prescaler = f [CPU] / (PWM การแก้ไข× f [PWM]) = 16000000 / (256 × 490) = ประมาณ 128

ตรวจสอบแผ่นข้อมูลแล้วคุณจะพบว่า 128 เป็นหนึ่งในค่าพรีสเกลเลอร์ที่คุณสามารถเลือกได้


2
เด็กชายเราคิดถึง MathJax หรือเปล่า ฉันหวังว่าเราจะเปิดใช้งานได้หลังจากเบต้า
Ricardo

1
@Ricardo ฉันมีปุ่ม MathJax ในเบราว์เซอร์ของฉัน; o) meta.arduino.stackexchange.com/questions/13/…
jippie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.