首页 文章

在Arduino上的analogRead期间进行计算

提问于
浏览
1

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

不幸的是,在阅读过程中,analogRead会等待,这使得很难完成任何工作 .

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

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

1 回答

  • 1

    是的,您可以在不等待其完成的情况下开始ADC转换 . 不要使用 analogRead ,而是在"Read Without Blocking"部分查看Nick Gammon的示例here .

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

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

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

    3)使用 millis() 定期开始转换(常见的"polling"解决方案) . 请务必通过添加到先前计算的转换时间,而不是通过添加到当前时间来逐步转换到下一个转换时间:

    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 之间共享的变量 .

相关问题