millis () ขัดแย้งกับหมุด PWM ที่เกี่ยวข้องกับตัวจับเวลา 0 หรือไม่


9

ฉันได้อ่านแล้วว่าmillis()ฟังก์ชั่นนี้ใช้ตัวจับเวลาเดียวกันกับหมุด PWM สองสามตัว

หากคุณใช้หมุด PWM เหล่านั้นจะmillis()ยังคงส่งคืนค่าที่ถูกต้องหรือไม่

คำตอบ:


6

พวกเขาจะไม่ขัดแย้งกันเนื่องจากmillis()อ่านค่าในทันทีTCNT0ขณะที่ PWM ผ่านตัวจับเวลา 0 ใช้ความสามารถของฮาร์ดแวร์ในการเปรียบเทียบค่าของค่าTCNT0กับค่าOCR0xโดยไม่ส่งผลกระทบต่อค่าใด ๆ ของพวกเขา


millis()เพียงใช้ตัวนับล้นของ Timer 0 อ่านค่าได้ทันทีในmicros() TCNT0
Nick Gammon

5

เพียงเพิ่มคำตอบของ @ Ignacio ซึ่งตอบคำถามของคุณโดยตรง "ความขัดแย้ง" ที่คุณพูดถึงเกี่ยวข้องกับพรีTimer0สเกลเลอร์

ส่วนใหญ่คุณสามารถใช้หมุดเหล่านั้น (หมุด 5 และ 6 โดยบังเอิญบน UNO) กับ PWM โดยไม่มีปัญหาและอ่านค่าที่ถูกต้องของmillis()(รวมทั้งรับความล่าช้าที่คาดไว้จากdelay)

จุดที่คุณพบปัญหาคือถ้าคุณต้องการเปลี่ยนพรีสเกลเลอร์ (โดยปกติคือเพื่อแก้ไขความถี่ของสัญญาณ PWM) หากคุณเปลี่ยนแปลงสิ่งนี้แสดงว่าคุณมีผลต่อการคำนวณและการรายงานmillis()และความยาวของdelay(x)โดยตรง


คุณสามารถอ่านพรีสเกลเลอร์ไทเมอร์ของคุณโดยบิตด้านล่างของ Serial.println (TCCR0A, BIN); หากพวกเขาเป็น '11' ดังนั้นพรีสเกลเลอร์ของคุณคือ clk / 64 จากนั้นคุณสามารถคำนวณปัจจัยในการแก้ไขมิลลิมิลลิ () และความล่าช้า ()
Dave X

นั่นเป็นจุดที่ดีมากและฉันมักจะนำไปสู่การแก้ไข แต่ก็ไม่มีเหตุผลถ้าคุณต้องการ / ต้องการ จุดอื่น ๆ ก็คือว่าถ้าคุณแก้ไขมันคุณรู้อยู่แล้วว่า prescaler ใหม่และสามารถเปิดการเขียน wrappers สำหรับmillis ()หรือdelay ()อยู่ดี
Madivad
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.