ADC

计算机的世界是0和1的。单片机可以通过读取0和1来确定按键状态,也可以输出0和1来控制LED。即使是看起来不太0和1的PWM,好像可以输出0到5V之间的电压一样,达到0和1之间的效果,但本质上还是高低电平。

但是,世界上终究还是有0和1无法表示的。如果引脚上被施加0到5V之间的电压,寄存器PINx无法告诉我们具体情况,只能指示这个电压是1.5V以下还是3V以上(参考数据手册“Electrical characteristics”)。这种可以连续变化的信号称为模拟信号,与离散的、只能取0或1(0或5V)的数字信号对立。

这并不代表数字世界无法处理模拟信号,相反,一种相当常用的处理模拟信号的方法,就是把模拟信号转换成数字信号,用处理器来运算,然后再转换成模拟信号。这个过程中涉及到模拟-数字转换和数字-模拟转换,分别需要ADC和DAC来实现。大多数单片机,作为现实世界中的工具,需要接触模拟信号,尤其是模拟信号的输入,会集成ADC。

ADC的一个参数是分辨率,指它的位数,反映了可以产生的不同输出的数量(8位ADC可以产生0~255的值)与量化最小物理量(通常是电压)的能力(比如当参考电压为2.56V时,理想情况下,8位ADC可以分辨两个相差0.01V的电压的不同)。AVR单片机带有的ADC是10位的。

另一个参数是转换速率,每秒进行A/D转换的次数。AVR单片机的ADC为了达到10位分辨率的精度,最大转换速率为15kSPS(千次采样每秒)。如果可以接受较低的精度,也可以以200kSPS采样,获得8位数据。

分辨率与精度是不同的概念。在这篇入门级教程中,我们只需要知道,A/D转换是会有误差的(数据手册23.7.4一节介绍了可能的误差来源)。即使是相同的电压,两次测量的结果也可能是不同的。

要进行A/D转换,需要提供参考电压和待测电压,转换的结果为