1

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

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

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

4

1 回答 1

4

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

另一种方式——按规范执行——需要为每个涉及的级别提供更多输入。

最底层的是 ATmega328 芯片。ADC 部分的文档说:

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

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

下一个: 文档说:

正常转换需要 13 个 ADC 时钟周期。ADC 开启后的第一次转换(ADCSRA 中的 ADEN 置位)需要 25 个 ADC 时钟周期来初始化模拟电路。

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

与您要求的 160µs 相比,这似乎不错。

但是:到目前为止,仅考虑了转换。您必须将数据传输到某个地方。正如您在Arduino distanalogRead()中的文件中所见,Arduino函数也有一些开销。wiring_analog.c

这个开销可能太多了 - 你必须自己测试它。

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

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

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

于 2012-05-01T07:23:43.540 回答