ATMEGA328p将模拟值转换为电压

Fpa*_*uer 5 c embedded atmega

这是官方ATMEGA328p数据表第261页的摘录:

在此处输入图片说明

正如文档所说

      Vin * 1024
ADC = ----------
         Vref
Run Code Online (Sandbox Code Playgroud)

我不明白的是,一个模拟引脚可以为我们提供10位。这意味着0x0到0x3ff之间的值(1023)

所以我不明白为什么文档会说Vin * 1024而不是1023。因为对我来说0v = 0和5v = 1023?

Lak*_*uma 7

0计为有效读数。1..1023是1023步,加0表示1024。0x000表示模拟地,0x3FF表示所选参考电压减去一个LSB​​。实际上,ADC并不是完美的,因为结果可能会有超过1个错误计数,并且使用1023还是1024并没有多大关系。从理论上讲,使用1024更准确。

  • “理论上使用1024更为准确。” 不可以,因为1024不能容纳10位。 (3认同)

Lun*_*din 2

是的,这是一个常见的错误。人们认为 10 位 = 2^10 = 1024,所以会有 1024 个步骤,对吧?不,10 位 ADC 只能提供最多 1023 (3FFh) 的输出,因为这是 10 位可以容纳的最大数字。

因此,如果您对 1024 而不是 1023 进行算术运算,则会在计算中引入非常轻微的误差。我自己就解决了这个 bug,它在生产代码中存在了 10 多年,没有人注意到,当我修复这个 bug 时,也没有人注意到差异:) 但自然地,我们应该始终努力确保程序的正确性。

  • 不,你错了。**不包括 5v** - 您仍然没有意识到这一点,因此您不断得到错误的答案。如果您按最小值定义代码电压,则正确答案是使用系数 1024。如果您希望按中值定义代码电压,则使用 1024 并向代码或输出电压添加半个 LSB。如果您希望通过最大值来定义它们,则添加一个 LSB。**在任何情况下都不允许扭曲乘法因子本身!!!** 。你无法通过“乘法”来解决“加法”问题,并且试图只会使事情更加扭曲。 (2认同)