Part 01 前言
最近在看ADC电压采样的相关资料,目前用的比较多的就是逐次逼近寄存器型ADC,又叫做SAR ADC,我们用ADC的目的就是把模拟信号转换成相应的二进制编码,之后再通过软件把相应的二进制编码转换成十进制AD值,最后通过相应的转换公式把十进制AD值转换成电压值。对应的转换公式有些资料中认为12位ADC的Vin=AD值*Vref/4095,有些资料中认为认为12位ADC的Vin=AD值*Vref/4096,各大论坛里各位硬件专家也是争论的十分激烈,可谓是公说公有理,婆说婆有理,那么到底哪个是对的呢?
Part 02 SAR ADC工作原理说明
先温习一下SAR ADC的工作原理吧,
1.采样和保持
首先,输入的模拟电压(VIN)通过采样/保持电路保持稳定,以便进行转换。初始化:N位寄存器(SAR寄存器)被初始化为中间值,即最高有效位(MSB)设置为1,其余位为0。例如,对于8位寄存器,初始值为10000000。
2.DAC转换
数模转换器(DAC)将寄存器中的值转换为对应的模拟电压(VDAC)。初始时,VDAC为基准电压(VREF)的一半,即VREF/2。
3.比较
比较器比较VIN和VDAC。如果VIN大于VDAC,比较器输出高电平(逻辑1),寄存器中的MSB保持为1;如果VIN小于VDAC,比较器输出低电平(逻辑0),寄存器中的MSB清零。
4.逐位逼近
SAR控制逻辑将寄存器移到下一位,并将该位设置为高电平。DAC再次将更新后的寄存器值转换为新的VDAC。比较器再次比较VIN和VDAC,并更新寄存器中的当前位。这一过程重复进行,每次都移到下一位,直到所有位(从MSB到LSB)都经过比较和更新。
5.完成转换
当所有位都经过比较和更新后,寄存器中的值即为对应的数字输出,代表输入模拟电压的数字量化值。最终的N位数字结果存储在寄存器中,完成模数转换过程。
Part 03 12位ADC是4095 or 4096?
为了便于理解,我们以3位ADC,Fs为参考电压为例,下图是不同的输入电压对应的二进制编码值,参考电压是Fs,3位ADC实际上是分了8段模拟输入电压范围进行编码,每一段对应的模拟输入电压为Fs/2^3=Fs/8V,那么:
0(0~Fs/16V):000
Fs/8(/16V~3*Fs/16V):001
...
Fs*7/8(13*Fs/16V~Fs*V):111
这样就能得到传递函数:Vin=AD值*Fs/2^3=AD值*Fs/8。
这个时候肯定有人会有疑问,如果输入电压Vin等于参考电压Fs,此时对应的AD值是7,那上面的等式不就不成立了?这里有个误区在于我们认为的满量程就是参考电压Fs,比如我们的ADC参考电压是5V,那么我们想当然认为5V就是满量程电压,但是基于下面的输入电压-编码图可知,111对应的是Fs*7/8,并非是Fs,也就是ADC的满量程定义为Fs-1LSB。所以虽然参考电压是Fs,但是ADC的ADC的满量程为Fs-1LSB,这样当输入电压等于Fs-1LSB时就已经达到了满量程,对应的编码就是111。
所以对于12位ADC,Vin=AD值*Vref/4096,12位ADC的二进制编码值对应是10进制AD值范围就是0~2^12 -1,也就是0~4095,但是我们在通过AD值计算输入电压时是4096哦。