多个analogRead()以定时间隔调用

时间:2012-05-01 05:33:21

标签: arduino atmega

我希望能够将波形捕获功能添加到基于ATmega 328的产品中,而且我无法找到有关ATmega 328在进行A / D转换时的响应能力的详细信息。代码在Arduino上进行原型设计,但在完成后将被迁移到自定义板。

我的计划是总周期(通常为16到20毫秒,基于本地交流线路频率),并在该间隔期间采样50到100次的单个引脚。 ATmega 328可以连续可靠地执行那么多次转换吗?每次转换的最小间隔为16ms / 100 = 160us。

如果有人必须查看代码,我可以添加一个代码示例,但是现在我更关心多次连续A / D转换之间的最短时间。

1 个答案:

答案 0 :(得分:4)

最简单的方法是编写一个Arduino脚本并为自己做一些计时基准测试。

另一种方式 - 按规范执行此操作 - 需要为每个相关级别提供更多输入。

最低级别是ATmega328芯片。 ADC部分的文档说:

  

默认情况下,逐次逼近电路要求输入时钟频率介于50 kHz和200 kHz之间,以获得最大分辨率。如果需要低于10位的分辨率,ADC的输入时钟频率可能高于200 kHz,以获得更高的采样率。

假设ATMega的16 MHz时钟,ADC时钟唯一可用的预分频值为128,对于10位分辨率为125kHz。如果你可以使用8位分辨率,你可以使用预分频器值64(250kHz)。

下一篇:文档说:

  

正常转换需要13个ADC时钟周期。 ADC接通后的第一次转换(ADCSRA中的ADEN置1)需要25个ADC时钟周期才能初始化模拟电路。

因此,采用125kHz ADC时钟,这意味着“单次转换”模式下的采样率约为9600Hz。这是每个样品104μs。这些是Arduino默认值。

与160μs的要求相比,这似乎很好。

但是:到目前为止,仅考虑转换。你必须在某处传输数据。 ALSO Arduino analogRead()函数有一些开销,您可以在Arduino dist的文件wiring_analog.c中看到。

这个开销可能很大 - 你必须自己测试它。

另一方面:没有人强迫您使用Arduino analogRead功能。一些可用的选择:

  • 你可以放弃analogRead和/或
  • 的开销
  • 您可以根据需要重新配置ADC(仅8位,更高的ADC时钟)和/或
  • 您可以使用“高级”模式,如连续采样(ADC的“自由运行模式”9或
  • 您甚至可以使用中断来触发转换。

当然,所有这些选择在很大程度上取决于您的知识和时间预算。 : - )