2

我正在开发一个用于电机控制的嵌入式应用程序,我对将 ADC 数值转换为有符号物理值 (Amps) 的一些计算有什么疑问。

我应该在中断处理程序中进行计算,还是应该只使用处理程序设置一个全局标志并在设置标志后在主循环中进行计算?

先感谢您。

4

4 回答 4

3

您可以在中断处理程序中做的工作越少越好。现在它对你的应用程序来说可能没什么大不了的,但是有一天你的系统负载会更高,你不想推迟其他更高优先级的任务来处理中断。您可能想研究信号量和适当的多线程,而不仅仅是设置全局标志。

于 2012-03-07T22:13:01.670 回答
2

这取决于您想用 ADC 值做什么,以及您需要多快完成它。如果您需要根据 ADC 值采取一些时间关键的操作,您应该在中断中处理。但是,如果是这种情况,为了节省首先从 ADC 计数计算“真实”模拟值的费用,您应该只用 ADC 计数来表示您的临界阈值。

例如,如果您的 ADC 输出每伏 8 个计数,并且如果 ADC 报告大于 1.5 伏,您需要触发紧急停止,则您编写中断代码以在 12 个计数触发紧急停止。然后,您仍然可以将 ADC 计数传递给主循环,以便转换为用户友好的单元,用于用户界面等目的。

一般原则是,为了保证您能在截止日期前完成,您可以构建您的应用程序和任何设置,以尽可能轻松地满足这些截止日期。如果某件事没有严格的截止日期,请将其放在主循环中(同样,一般而言)。

于 2012-03-07T22:20:36.570 回答
2

对此没有万能的答案。这取决于您的时序要求、现有的中断负载等。

如果它是一个相当简单的乘法或其他东西,那么我会在中断中执行它并继续前进。

只需确保您知道自己在做什么,并且不要在中断上花费过多的时间。

于 2012-03-07T22:21:52.843 回答
0

需要考虑的一件事是数据一致性。如果您从 ADC 获得多个相关值(位置、电压、电流等),那么您可能需要做一些事情来确保您使用的是一致的设置。这可能意味着后台更新比 ISR 中的更新更好。甚至对于给定的算法通过的单个读数的一致性也可能很重要。考虑这个背景代码。

  delta = data-lastData;
  //ISR could update data here.
  lastData = data;
  something = K1* data + K2 * delta;  //this may be wrong now
于 2012-03-09T08:02:42.917 回答