ADC检测实际电压值方法 最近学习STM32单片机的基础部分,之前一直用的是STC系列的8位单片机,比如STC8A8K64S4A12,一款STC公司高性能单片机,可以满足跑个小型RTOS(Small RTOS)。于是学习之余,在B站看到一位大佬用STC8芯片加0.96寸oled屏幕制作一款简易的示波器,突然心中一动,正好手中缺一款对精度和功能都要求不高的检测装置(其实是囊中羞涩,好的示波器一款的上千,现实面前不得不低头啊),正好可以设计出来用于简单的为后续实验检测设计提供保障,果断买原件来制作。 在制作期间,研究了大佬的电压演算过程,发现很是奇怪,不知道其中奥妙,具体列举下:Vx = (uint32)BGV_ADR * ADCx * lsb / ADCbg / 100,其中BGV_ADR定值为65015,lsb是浮动校准值,范围0-600,ADCx为实际STC8单片机的AD采样值,基于12bit,所以范围是0-4095,ADCbg是单片机第十六通道,也就是内部基准电压值(VREF非常重要)的采样值。就是这样一个奇葩的公式,Vx为采集到的当前电池电压。其中电池接入电压为3.7v左右,外部串联了2个电阻分压用。 图1.1 简单分压电路图 下面我们就用初中学过的分压公式:Vc=VCC*(R4/(R4+R3)),大致计算一下值因该为0.617v,如果此时我们的输入电压利用3.3v(单片机电源输入电压),则计算值为0.55v左右。那么接下来,把它接到单片机的一路12bitADC采样端,基准电压值VREF为2.5v,为此我们来采用通常的电池电压采样方式计算一下:Vc=VREF*(采样值/4096)[此处特别强调:ADC采样时数字量的大小取决于基准电压,而不是输入的VCC,这是个重大误区,此处经统计采样值为1600-1800之间,那么Vc取中点值1700计算为1.0375v,咦,咋和0.55v不等呢,说明此时有问题,这样的方式计算的结果是不对的。 图1.2 proteus仿真结果
那么,这个时候疑问就来了,为什么会出现这样的结果呢?难道说是公式不对吗?这样的计算方式不是在很多例子中最常用的吗?比如说之前的PCF8591、STM32ADC检测电压值等等。我要说的是这样的计算公式使用范围是有限制的,重点突出的是ADC的采样功能,而对采集计算的到的电压值是存在误差的,当然有些简易电路也是适用的,不如说可调电位器,简单的2分压电路,所以到这里你就会发现,1.0375v/2=0.5187是接近0.55v的,但是也仅仅是接近而已,误差很明显的。为此我通过以上几种方式总结出一种比较精准的方法,那就是如果我们在接了外部电阻,且采样端电阻值已知的情况下,我们可以得到公式:Vc=VREF*(ADC采样值/(4096*R4)),也就是在原来的基础上加入了一个分压电阻值2K,为了使得到的电压值更加精准,在VREF的定值上在加入浮动校准值最好是按照每100,0.02V增长规律即可(此处电压校准值仅限于上述电路,不同分压电路,请以实际计算值为准)。到这里我们比较精准的电压计算公式就有了。这里还是要特别提醒,ADC采样值在多次求取平均值时会有100-300的误差,比如开路时单次值为4095,而去多次平均值后变为了43xx(这个本人估计是在采样期间受到单片机供电电流、电压影响,对此采样在延时和程序语句执行中时间长短可能会影响),可见误差显现,这个是在STC8中发现的问题,在STM32上没有试过。
以上图文word格式:
关于ADC检测实际电压值.docx
(31.47 KB, 下载次数: 109)
|