这是一个软件问题,您花费了太多时间来处理中断并且您的 I2C 例程无法处理它(所以这是不正确的两件事)。我经历过好几次类似的情况。
第一:你需要在中断中做尽可能少的事情,只读取和存储数据,不要做任何你可以在 ISR 之外做的处理,数学会占用很多 CPU 周期,而 CPU 不能做任何其他事情在那个中断中。
第二:研究 DMA 以使事情自动化,因此您的中断几乎成为后台自动化进程。
第三:如果 I2C 很重要,也将其放入中断中,但请确保确定优先级!
第四:找出您的 I2C 例程失败的原因,I2C 本身可以承受非常间歇性的计时、暂停和等待等,因此您的例程可能需要修改以允许这样做。
第五:看看你是否可以“链接”中断,你可能会发现你可以更有效地为 ADC 读取提供服务,或者将 ADC 置于不同的模式,在中断之前它可以为你做更多的工作(EG 等待所有读数可用,然后一次读取全部,而不是 8 个单独的中断用于 8 个单独的 ADC 通道读取)。
第六:使用示波器或逻辑分析仪,以及板上的备用 IO 引脚,跟踪您在每一位代码中花费了多少时间,看看您是否可以加快速度。(进入功能/ISR 时将引脚设置为高电平,退出时再次将其设置为低电平)。
第七:决定你是否真的需要这么多地阅读 ADC,放慢速度会让事情变得更糟吗?这是违反直觉的,但有时运行速度较慢实际上会产生更好的结果,为您平均信号并减少可能导致问题或需要额外处理才能消除的尖峰/瞬变。我们通过简单地以 1/4 的速度运行它来改进电机控制 PID 例程,从而在此过程中释放大量 CPU 时间。