这是官方ATMEGA328p数据表第261页的摘录:
正如文档所说
Vin * 1024
ADC = ----------
Vref
Run Code Online (Sandbox Code Playgroud)
我不明白的是,一个模拟引脚可以为我们提供10位。这意味着0x0到0x3ff之间的值(1023)
所以我不明白为什么文档会说Vin * 1024而不是1023。因为对我来说0v = 0和5v = 1023?
0计为有效读数。1..1023是1023步,加0表示1024。0x000表示模拟地,0x3FF表示所选参考电压减去一个LSB。实际上,ADC并不是完美的,因为结果可能会有超过1个错误计数,并且使用1023还是1024并没有多大关系。从理论上讲,使用1024更准确。
是的,这是一个常见的错误。人们认为 10 位 = 2^10 = 1024,所以会有 1024 个步骤,对吧?不,10 位 ADC 只能提供最多 1023 (3FFh) 的输出,因为这是 10 位可以容纳的最大数字。
因此,如果您对 1024 而不是 1023 进行算术运算,则会在计算中引入非常轻微的误差。我自己就解决了这个 bug,它在生产代码中存在了 10 多年,没有人注意到,当我修复这个 bug 时,也没有人注意到差异:) 但自然地,我们应该始终努力确保程序的正确性。