在Arduino上的analogRead期间进行计算

时间:2016-02-10 14:14:36

标签: arduino i2c spi analog-digital-converter

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

不幸的是,在阅读过程中,analogRead会等待,因此很难完成任何操作。

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

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

1 个答案:

答案 0 :(得分:1)

是的,您可以在不等待其完成的情况下开始ADC转换。不要使用analogRead,请查看Nick Gammon的示例here,在“无阻塞读取”部分中。

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

1)让它在自由运行模式下运行,尽可能快地采样,或

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

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

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。

请确保将volatile关键字用于ISR和loop之间共享的变量。