Arduino 上 analogRead 期间的计算
Computation during analogRead on Arduino
根据手册,Arduino A/D 转换器大约需要 0.1 毫秒。实际上,我的测试表明,在 Uno 上,我可以在一个循环中每秒执行大约 7700 次。
不幸的是,analogRead 在执行读取时会等待,因此很难完成任何事情。
我希望将计算与一系列 A/D 转换交织在一起。有什么方法可以启动 analogRead,然后检查时序并稍后获得完整的值?如果这需要低级别且不可移植到其他版本,我可以处理。
寻找一种解决方案,允许定期对 Arduino 上的所有通道进行采样,然后通过 SPI 或 I2C 发送数据。我愿意考虑中断,但采样必须保持极度周期性。
是的,您可以开始 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 以在完成时调用。
一定要对 ISR 和 loop
之间共享的变量使用 volatile
关键字。
根据手册,Arduino A/D 转换器大约需要 0.1 毫秒。实际上,我的测试表明,在 Uno 上,我可以在一个循环中每秒执行大约 7700 次。
不幸的是,analogRead 在执行读取时会等待,因此很难完成任何事情。
我希望将计算与一系列 A/D 转换交织在一起。有什么方法可以启动 analogRead,然后检查时序并稍后获得完整的值?如果这需要低级别且不可移植到其他版本,我可以处理。
寻找一种解决方案,允许定期对 Arduino 上的所有通道进行采样,然后通过 SPI 或 I2C 发送数据。我愿意考虑中断,但采样必须保持极度周期性。
是的,您可以开始 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 以在完成时调用。
一定要对 ISR 和 loop
之间共享的变量使用 volatile
关键字。