我希望能够将波形捕获功能添加到基于ATmega 328的产品中,而且我无法找到有关ATmega 328在进行A / D转换时的响应能力的详细信息。代码在Arduino上进行原型设计,但在完成后将被迁移到自定义板。
我的计划是总周期(通常为16到20毫秒,基于本地交流线路频率),并在该间隔期间采样50到100次的单个引脚。 ATmega 328可以连续可靠地执行那么多次转换吗?每次转换的最小间隔为16ms / 100 = 160us。
如果有人必须查看代码,我可以添加一个代码示例,但是现在我更关心多次连续A / D转换之间的最短时间。
答案 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
和/或当然,所有这些选择在很大程度上取决于您的知识和时间预算。 : - )