นี่เป็นปัญหาซอฟต์แวร์คุณใช้เวลามากเกินไปในการให้บริการขัดจังหวะและรูทีน I2C ของคุณไม่สามารถจัดการได้ (ดังนั้นจึงเป็นสองสิ่งที่ไม่ถูกต้อง) ฉันเคยผ่านสถานการณ์ที่คล้ายกันหลายครั้ง
ข้อแรก: คุณต้องทำน้อยที่สุดเท่าที่จะเป็นไปได้ในอินเทอร์รัปต์เพียงอ่านและเก็บข้อมูลอย่าทำการประมวลผลใด ๆ ที่คุณสามารถทำได้นอก ISR คณิตศาสตร์สามารถใช้รอบ CPU จำนวนมากและ CPU ไม่สามารถทำอะไรได้อีก ในขณะที่ขัดจังหวะ
ประการที่สอง: ตรวจสอบ DMA เพื่อทำให้สิ่งต่าง ๆ เป็นอัตโนมัติดังนั้นการขัดจังหวะของคุณจึงกลายเป็นกระบวนการอัตโนมัติเบื้องหลัง
ข้อที่สาม: ถ้า I2C มีความสำคัญให้ใส่นั่นในการขัดจังหวะด้วย แต่ให้แน่ใจว่าคุณได้จัดลำดับความสำคัญ!
ข้อที่สี่: หาสาเหตุว่าทำไมรูทีน I2C ของคุณถึงล้มเหลวตัว I2C เองสามารถตั้งเวลาได้ไม่ต่อเนื่องหยุดชั่วคราวและรอเป็นต้นดังนั้นคุณอาจต้องแก้ไขเพื่ออนุญาต
ที่ห้า: ดูว่าคุณสามารถ "หยุด" การขัดจังหวะคุณอาจพบว่าคุณสามารถให้บริการ ADC อ่านได้อย่างมีประสิทธิภาพมากขึ้นหรือทำให้ ADC อยู่ในโหมดอื่นที่มันทำงานได้ดีกว่าสำหรับคุณก่อนที่จะขัดจังหวะ (EG รอให้การอ่านทั้งหมดพร้อมใช้งาน จากนั้นอ่านทั้งหมดในหนึ่งครั้งมากกว่า 8 อินเตอร์รัปต์แยกสำหรับการอ่านแชนเนล ADC 8 รายการ)
หก: ใช้ออสซิลโลสโคปหรือลอจิกวิเคราะห์และสำรองพิน IO บนบอร์ดเพื่อติดตามจำนวนเวลาที่คุณใช้ไปกับโค้ดแต่ละบิตเพื่อดูว่าคุณสามารถเร่งความเร็วได้หรือไม่ (ตั้งค่าพินสูงเมื่อคุณเข้าสู่ฟังก์ชั่น / ISR ตั้งค่าให้ต่ำลงอีกครั้งเมื่อออก)
ที่เจ็ด: ตัดสินใจว่าคุณจำเป็นต้องอ่าน ADC มาก ๆ จริง ๆ ไหมการทำให้ ADC ช้าลงจะทำให้สิ่งเลวร้ายลงหรือไม่ มันตอบโต้ได้ง่าย แต่บางครั้งการทำงานช้าลงจริง ๆ แล้วให้ผลลัพธ์ที่ดีกว่าการทำการเฉลี่ยสัญญาณให้คุณและลดการใช้ spikes / transients ซึ่งอาจทำให้เกิดปัญหาหรือต้องการการประมวลผลเพิ่มเติมเพื่อลบ เราปรับปรุงชุดคำสั่ง PID ควบคุมมอเตอร์โดยเพียงแค่เรียกใช้ความเร็ว 1/4 ซึ่งช่วยลดเวลาในการโหลด CPU ในกระบวนการ