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

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

提前谢谢。

有帮助吗?

解决方案

没有一个尺寸适合的答案。这取决于您的时序要求,现有中断加载等。

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

只是确保你知道你在做什么,不要花更多的时间比你的中断。

其他提示

您在中断处理程序中可以做的工作越少。现在它可能不是您的应用程序的大量交易,但是将在您的系统负载较高时出现时间,并且您不希望抵消其他更高优先级的任务以处理中断。您可能希望调查信号量和适当的多线程,而不是仅设置全局标志。

取决于您想要处理ADC值的内容,以及您需要的速度。如果您需要根据ADC值采取一些时间关键措施,则应在中断中处理该时间。但是,如果是这种情况,要保存自己首次计算ADC计数的“真实”模拟值的费用,您应该只需在ADC计数方面表达您的关键阈值。

例如,如果您的ADC输出每伏8个计数,并且如果ADC报告大于1.5伏,则需要启动紧急停止,您可以在12个计数时写下您的中断代码以射击电子停止。然后,您仍然可以将ADC计入主循环,以便在用户界面的用户友好单位中转换为用户界面。

一般原则是保证您可以满足您的截止日期,您可以构建应用程序和任何设置,以使其尽可能简单地满足这些截止日期。如果某些东西没有艰难的截止日期,请将其放入主循环(一般)。

要考虑的一件事是数据一致性。如果您从ADC(位置,电压,电流等)获得了几个相关值,那么您可能希望执行某些操作以确保您使用一致的集合。这可能意味着背景更新优于ISR中的更新。算法给定通行证的单个读数的甚至一致性也可能很重要。考虑此背景代码。

  delta = data-lastData;
  //ISR could update data here.
  lastData = data;
  something = K1* data + K2 * delta;  //this may be wrong now
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top