模拟期间的计算在Arduino上读取



根据手册,Arduino A/D转换器大约需要0.1ms。 实际上,我的测试表明,在 Uno 上,我可以在循环中每秒执行大约 7700 次。

不幸的是,analogRead在执行读取时等待,因此很难完成任何事情。

我希望将计算与一系列 A/D 转换交错进行。 有没有办法启动 analogRead,然后检查时序并稍后获取完成的值? 如果这需要低级并且不可移植到其他版本,我可以处理。

寻找一种解决方案,允许定期对Arduino上的所有通道进行采样,然后通过SPI或I2C发送数据。 我愿意考虑中断,但采样必须保持非常周期性。

是的,您可以开始ADC转换,而无需等待其完成。 与其使用analogRead,不如在这里查看Nick Gammon的例子,在"阅读而不阻止"部分。

要获得常规采样率,您可以:

1) 让它以自由运行模式运行,尽可能快地取样,或者

2) 使用定时器ISR启动ADC,或

3) 使用 millis() 定期启动转换(常见的"轮询"解决方案)。 请务必通过添加到先前计算的转换时间来步进下一个转换时间,而不是通过添加到当前时间:

uint32_t last_conversion_time;
void setup()
{
   ...
  last_conversion_time = millis();
}
void loop()
{
  if (millis() - last_conversion_time >= ADC_INTERVAL) {
    <start a new conversion here>
    // Assume we got here as calculated, even if there
    //   were small delays
    last_conversion_time += ADC_INTERVAL;  // not millis()+ADC_INTERVAL!
    // If there are other delays in your program > ADC_INTERVAL,
    //   you won't get back in time, and your samples will not 
    //   be regularly-spaced.

无论如何定期开始转换,都可以轮询完成附加要在完成时调用的 ISR。

请务必对 ISR 和 loop 之间共享的变量使用 volatile 关键字。

相关内容

  • 没有找到相关文章

最新更新