คำถามติดแท็ก timers

3
ใช้ millis () และ micros () ภายในรูทีน interrupt
เอกสารสำหรับattachInterrupt()พูดว่า: ... millis()อาศัยการขัดจังหวะในการนับดังนั้นมันจะไม่เพิ่มขึ้นภายใน ISR เนื่องจากdelay()ต้องการการขัดจังหวะในการทำงานมันจะไม่ทำงานหากเรียกภายใน ISR micros()ทำงานในขั้นต้น แต่จะเริ่มทำงานผิดปกติหลังจาก 1-2 ms ... วิธีการที่ไม่micros()แตกต่างจากmillis()(ยกเว้นของหลักสูตรเพื่อความแม่นยำของพวกเขา)? คำเตือนข้างต้นหมายความว่าการใช้micros()ภายในรูทีนการขัดจังหวะเป็นความคิดที่ไม่ดีอยู่เสมอ บริบท - ฉันต้องการวัดอัตราการเต้นของชีพจรต่ำดังนั้นฉันจึงต้องทริกเกอร์รูทีนเมื่อสัญญาณอินพุทของฉันเปลี่ยนแปลงและบันทึกเวลาปัจจุบัน

2
ฟังก์ชั่นการกำหนดตัวชี้อะตอมใน Arduino?
ตัวอย่างต่อไปนี้มาจากซอร์สโค้ดของ TimerOne : // TimerOne.h: void (*isrCallback)(); // TimerOne.cpp: ISR(TIMER1_OVF_vect) // interrupt service routine that wraps a user defined function supplied by attachInterrupt { Timer1.isrCallback(); } // TimerOne.cpp: void TimerOne::attachInterrupt(void (*isr)(), long microseconds) { if(microseconds > 0) setPeriod(microseconds); isrCallback = isr; // register the user's callback with the real ISR …

1
การตั้งค่า timer3 ในโหมด CTC - ขัดแย้งกับไลบรารีเซอร์โว
ฉันต้องการตั้งค่าตัวจับเวลาเพื่อเรียกใช้ฟังก์ชัน 800 ครั้งต่อวินาที ฉันใช้ Arduino Mega และ Timer3 กับ prescaler ที่ 1024 เพื่อเลือกตัวประกอบ prescaler ที่ฉันได้พิจารณาขั้นตอนต่อไปนี้: CPU ความถี่: 16MHz ความละเอียดตัวจับเวลา: 65536 (16 บิต) ความถี่แบ่ง CPU โดย prescaler เลือก: 16x10 ^ 6/ 1024 = 15625 แบ่งส่วนที่เหลือผ่านความถี่ที่ต้องการ 62500/800 = 19 ใส่ผลลัพธ์ + 1 ในการลงทะเบียน OCR3 ฉันใช้ตารางต่อไปนี้เพื่อตั้งค่าการลงทะเบียนของ TCCR3B: ข้อผิดพลาด ไม่สามารถคอมไพล์โค้ดได้ นี่เป็นข้อผิดพลาดที่คอมไพเลอร์ส่งคืน: Servo \ Servo.cpp.o: …

3
ใครช่วยอธิบายรหัสที่ดูแปลก ๆ นี้ใช้ในการตั้งค่าเครื่องจับเวลา
ในขณะที่ดูภาพร่างที่คนอื่นเขียนฉันอาจเจอโค้ดที่มีลักษณะดังนี้: TCCR1A = 0; TCCR1B = 0; TCNT1 = 34286; TCCR1B |= (1 << CS12); TIMSK1 |= (1 << TOIE1); ทั้งหมดที่ฉันรู้ก็คือมันมีบางอย่างที่เกี่ยวกับเวลา / ตัวจับเวลา (ฉันคิดว่า) ฉันจะถอดรหัส - และสร้าง - รหัสเช่นนี้ได้อย่างไร อะไรคือTCCR1A, TCCR1B, TCNT1, CS12, TIMSK1และTOIE1?

4
เปิด Arduino ด้วยตัวจับเวลาทุก 24 ชั่วโมง
ขณะนี้ฉันกำลังทำงานในโครงการ Arduino ที่ส่งการชาร์จแบตเตอรี่รถยนต์ของฉันวันละครั้งผ่าน ESP8266 ให้ฉัน ในช่วงฤดูหนาวฉันไม่ได้ขับรถและฉันอยากได้รับแจ้งเมื่อแบตเตอรี่มีค่าเกินกว่าค่าวิกฤตดังนั้นฉันจึงสามารถชาร์จและป้องกันความเสียหายได้ ดังนั้นประสิทธิภาพการใช้พลังงานจึงเป็นสิ่งสำคัญสำหรับโครงการดังนั้นจึงไม่ปล่อยแบตเตอรี่ออกมาเอง ฉันอ่านมากเกี่ยวกับโหมดสลีปตัวควบคุมแบบดรอปดาวน์ที่มีประสิทธิภาพ ฯลฯ สิ่งเหล่านี้มีเหมือนกันกับตัวควบคุมแรงดันไฟฟ้าทำงานอยู่ตลอดเวลาซึ่งไม่ใช่สิ่งที่ฉันต้องการ ฉันกำลังมองหา "วงจรสวิตช์ตัวจับเวลา" มันควรจะนับถอยหลัง 24 ชั่วโมงแล้วเปิดรีเลย์หรือ MOSFET ซึ่งเชื่อมต่อตัวควบคุมแรงดันไฟฟ้าเข้ากับพลังงานและเมื่อเปิด Arduino และ ESP8266 เมื่อ Arduino เสร็จสิ้นการส่งสัญญาณมันจะรีเซ็ตตัวจับเวลาซึ่งจะตัดการเชื่อมต่อตัวควบคุมแรงดันไฟฟ้าจากพลังงานและอื่น ๆ แน่นอนวงจรจับเวลาควรใช้พลังงานน้อยมากเท่านั้น ไม่มีใครรู้วงจรเช่นนั้นหรือไม่? ฉันค้นหาAliExpressด้วยคำศัพท์ทั้งหมดที่อยู่ในใจของฉันไม่ประสบความสำเร็จ หรืออาจเป็น IC ที่สามารถใช้ (ง่าย) ในการสร้างวงจรดังกล่าว?
9 power  timers  relay 

6
หน่วงเวลานานมาก () เป็นไปได้หรือไม่
ฉันกำลังพยายามเปิดและปิดประตูเล็ก ๆ ที่ควรเปิดหรือปิดทุก ๆ 12 ชั่วโมง ฉันสงสัยว่าฉันสามารถสร้างสคริปต์ลูปขนาดเล็กที่มีการหน่วงเวลา () เป็นเวลา 12 ชั่วโมงล่าช้า (43 200,000 ล้าน); ฉันคิดว่า? อย่างไรก็ตามฉันไม่รู้ว่ามันเป็นไปได้และ / หรือแนะนำได้ ข้อเสนอแนะ / ทางเลือก (ถ้าจำเป็น) จะดี :)

1
จำเป็นต้องมีความผันผวนหรือไม่เมื่อเข้าถึงตัวแปรจาก> 1 ISR แต่ไม่แชร์ภายนอก ISR
มีการบันทึกไว้อย่างชัดเจนว่าเมื่อมีการแบ่งปันข้อมูลทั่วโลกกับ ISR และโปรแกรมหลักข้อมูลจะต้องประกาศvolatileเพื่อรับประกันการมองเห็นหน่วยความจำ (และนั่นเพียงพอสำหรับข้อมูล 1 ไบต์เท่านั้นสิ่งที่ใหญ่กว่าต้องมีการจัดการพิเศษเพื่อรับประกันอะตอม . ที่นี่เรามีกฎระเบียบที่ดี: ตัวแปรที่ใช้ภายนอก ISR เท่านั้นไม่ควรเปลี่ยนแปลงได้ ตัวแปรที่ใช้ภายใน ISR เท่านั้นไม่ควรเปลี่ยนแปลงได้ ตัวแปรที่ใช้ทั้งภายในและภายนอก ISR ควรมีความผันผวน แต่volatileจำเป็นเมื่อมีการเข้าถึงตัวแปรจาก> 1 ISR แต่ไม่ได้ใช้ร่วมกันนอก ISR ตัวอย่างเช่นฉันมีฟังก์ชั่นที่รักษาสถานะภายในโดยใช้staticตัวแปร: void func() { static volatile long counter; // volatile or not? // Do stuff with counter etc. } ฟังก์ชั่นนั้นเรียกว่าสองวิธี: จากการขัดจังหวะด้วยพินและจากไลบรารี TimerOne : attachInterrupt(0, func, CHANGE); Timer1.attachInterrupt(func); ไม่มีปัญหา …
9 interrupt  timers  isr 

2
millis () ขัดแย้งกับหมุด PWM ที่เกี่ยวข้องกับตัวจับเวลา 0 หรือไม่
ฉันได้อ่านแล้วว่าmillis()ฟังก์ชั่นนี้ใช้ตัวจับเวลาเดียวกันกับหมุด PWM สองสามตัว หากคุณใช้หมุด PWM เหล่านั้นจะmillis()ยังคงส่งคืนค่าที่ถูกต้องหรือไม่
9 timers  pwm  millis 

5
Arduino สามารถส่งออกความถี่พาหะเฉพาะ (เช่น 56 kHz) ได้อย่างไร?
ฉันกำลังทำงานในโครงการทัศนศาสตร์อวกาศเพื่อส่งข้อมูลแบบไร้สายระหว่างสองจุด เพื่อให้บรรลุผลนี้ฉันใช้ IR LED เชื่อมต่อกับ Arduino Uno ที่พัลส์ด้วยความถี่ตัวส่งสัญญาณ 56 kHz สำหรับเครื่องส่งสัญญาณและ Arduino ตัวที่สองที่มีโมดูลตัวตรวจจับ IR 56 kHz สำหรับตัวรับสัญญาณ ฉันพยายามใช้ delayMicroseconds () ระหว่างคำสั่ง pin high และ pin low เพื่อสร้างความถี่ของผู้ให้บริการ งานประเภทนี้ แต่ความถี่ไม่เหมือนกันเสมอและความล่าช้าเพิ่มเติมใด ๆ สำหรับการส่งสัญญาณ (เช่นเวลาที่ต้องใช้ในการเรียกใช้ฟังก์ชั่นและการลดลง) สามารถเปลี่ยนแปลงได้ การอ่านแผ่นข้อมูลสำหรับ ATmega328 ดูเหมือนว่ามีวิธีการตั้งค่าพัลส์ที่แม่นยำยิ่งขึ้นโดยใช้ตัวจับเวลาของชิป เป็นไปได้และถ้าเป็นเช่นนั้นคุณจะสร้างพัลส์ 56 kHz โดยใช้ตัวจับเวลาได้อย่างไร?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.