ATMEGA328p将模拟值转换为电压

时间:2019-08-17 08:16:59

标签: c embedded atmega

这是官方ATMEGA328p data sheet第261页的摘录:

enter image description here

如文档所述

      Vin * 1024
ADC = ----------
         Vref

我不了解的是模拟引脚可以为我们提供10位。这是指介于0x0和0x3ff(1023)之间的值

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

3 个答案:

答案 0 :(得分:7)

0视为有效读数。 1..1023是1023步,加0表示1024。0x000表示模拟地,0x3FF表示所选参考电压减去一个LSB​​。 实际上,ADC并非完美无缺,因为结果可能会有1个以上的错误计数,而使用1023或1024则无关紧要。从理论上讲,使用1024更准确。

答案 1 :(得分:3)

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

因此,如果对1024而不是1023进行算术运算,则会在计算中引入非常小的误差。我自己做了这个错误,并且它在生产代码中使用了10年之久,没有人注意到,而当我修复该错误时,也没有人注意到它的不同之处:)但是自然地,我们应该始终为程序的正确性而努力。

答案 2 :(得分:2)

5v = 1024,是的,但是您不能使用5V参考电压测量5V,您可以测量的最大值为Vref的1023/1024,即如果Vref = 5V,则最大值为4.995V。此电压以及所有高于此的电压将显示为1023(0x3FF)。

所以,您是对的,Vref电压需要值为1024,该值需要存储11位,但是您永远无法使用ADC测量该电压。

但是根据the datasheet(第28.9页的ADC特性,在第265页),ATmega328P中ADC的绝对精度通常为2.2 LSB,因此,如果使用1023而不是1024,则不必担心出现1LSB错误。除数。

但是,仍然使用1024不仅在测量意义上更正确,而且可以在整数数学中进行优化,因此不需要诸如除法之类的复杂操作:

   // convert ADC value into millivolts (assuming Vref is 5000 mV)
   uint16_t result_in_mv = ((uint32_t)adc_result * 5000UL) >> 10;