利用单片机内部基准电压测量电源电压
最近做一个蓝牙温度记录仪的项目,MCU采用意法半导体(ST)的STM8L151,纽扣电池供电,需要检测纽扣电池电压,低电量的时候报警。由于纽扣电池的电压在不断的改变, 在做设计验证的时候,使用一颗LDO降压后作为ADC基准源,电路图如下:
图中(1)为LDO降压电路,作为ADC的外部电压基准源,如图(3),纽扣电池电压变化的时候VREF_1.8V保持不变。
图中(2)部分为纽扣电池电压的分压电路,分压后作为ADC的采样输入,如图(4)
采用上图电路,可以实现对纽扣电池电压的检测,但是既增加了成本,又增加了电路的复杂性。是否可以考虑其他方法呢?答案是肯定的。
在STM8L151芯片的内部,有一个固定的内部参考电压,ST的技术手册里命名为VREFINT
该内部参考电压的值即使芯片电源电压在工作范围内波动时,它基本维持不变即1.224V,而且该电压信号可以通过指令控制直接连接到ADC 的某个AD 通道而求得该电压对应的AD 值。
这里需要说明一下,该内部参考电压VREFINT并非ADC 的参考电压,ADC 的参考电压
依然是VDD。即使VDD 有所波动,这个VREFINT电压恒定不变,对于ADC 电路而言,它只是个测试点。这里经常有人犯迷糊,把VREFINT内部基准参考电压跟ADC 模块的参考电压混为一谈。
此时在程序上把VREFINT作为ADC的采样电压,纽扣电池电压作为ADC的外部基准电压,那么可以得到一下公式:
只要读出ADC的值,就可以计算出纽扣电池的电压了,电路图如下:
通过和上图对比,可以看此图更加精简。
利用STM32精确测量电压
对于电压和温度的测量是很多嵌入式应用的必备功能。电压的测量一般分为电池电压的测量和其他一些模拟量的测量。电池的测量主要是随时检测电池的电量,以便给出电量的显示或者在电压在到一定的门限时发出报警,提醒用户及时充电。
同时在某些应用的时候,在电池低到一定的水平的时候还要及时存储一些关键的数据。至于温度的测量的作用在于有一些和温度有关的参数需要根据温度的高低随时调整。比如说射频发射功率的大小,频率偏移的温度校正等等。本质上电压的测量和温度的测量是一样的, 只不过温度的测量是测量温度传感器所输出的电压。
电压和温度的测量需要用到ADC功能。而影响ADC测量精度的很重要的是一个指标是参考电压的稳定程度。在很多单片机中,参考电压的选择有两种方式,一种是外接一个高精度的参考电压,另外一种是芯片内部产生一个参考电压。那不管是对于哪一种来说,要想保持高的测量精度,则对于参考电压也要有很高的精度。 对于SMT32L0系列单片机来说,为了得到高精度的参考电压,采用了一种较新颖的方法,就是在出厂时进行校正。校正的方式是在IC出厂的时候在某一个固定的电压和温度下进行测量,测得的reference电压或者温度的ADC值会保存在芯片内部的寄存器内。一般来说,STM32会选择在25度,3.0V电压的时候进行测量。 这样在客户使用片上ADC的时候,就不必去费尽心力的选择或者考虑参考电压的问题,即使参考的电压不是很稳定或者在随时变化也不会影响测试的精度。
对于STM32L0系列IC来说,在每个芯片出厂的时候都有一个校正的过程。我们可以从一份datasheet里看出他的方法。在芯片的内部有一个参考电压(VREFINT),这个电压连接在ADC的输入端。在芯片出厂的时候,VDDA端会接一个高精度的3.0V电平,环境温度会设置在25摄氏度。在这种情况下,芯片内部会执行ADC的操作,从而得到一个ADC的值,这个值会保存在芯片的内部,而且是只读的属性。
Vrefint
在实际应用当中,VDDA的值也许会很容易变化或者不容易能够很精确的知道。但是通过上述方法进行校正后,通过VREFINT_CAL可以很精确的计算出VDDA的值。
公式如下:
VDDA=3VxVREFINT_CAL/VREFINT_DATA…………………(1)
这里 VREFINT_CAL是VREFINT校正的值
而VREFINT_DATA是实际VREFINT通过ADC转换得到的值。
对于ADC来说,每个通道的实际电压的值可以通过下面的公式得到
这里VDDA是一个未知的值,所以你可以将1式带入,这样你就可以得到一个计算每个通道ADC输入电压的公式
这里 VREFINT_CAL是VREFINT校正的值ADC_DATAx每个通道ADC的测量值而VREFINT_DATA是实际VREFINT通过ADC转换得到的值。FULL_SCALE是ADC输出的最大数字值。例如12ADC,FULL_SCALE是4095,或者8位ADC,是255
其实简单点说,STM32是利用了两次ADC的操作,先是精确的测量了参考电压VDDA,继而在第二次测量中得到了精确的输入电压的测量值。首先把VREFINT接入ADC的输入,然后利用公式1得到VDDA的值,然后再将实际要测量的模拟量作为ADC的输入,从而测量出ADC_DATA的值,继而计算出待测量的精确的电压。
通过这种方式,使用者不必再去考虑参考电压的精确度和稳定度,使用STM32的电源电压作为Vref+就可以了,如图所示
ADC 参考电路
相关问答
...同时肿么 测电池 的 电压 和充电电流? 用的是51 单片机 。-ZOL问答锂电池充电的同时肿么测电池的电压和充电电流?用的是51单片机。相机电池讨论回答(4)1、电池通过MOSFET和电流采样电阻并联的网络与单片机共地,控制MOSFET导...
单片机 AD口检测 电压 ?内部晶体管处于开漏状态,无输出电压。就算可以测的也是感应电压,不是有效电压。正常使用AD口需要一个有效的模拟量才可以。内部晶体管处于开漏状态,无输出电...
怎么在 锂电池 充电时检测它这时的 电压 -ZOL问答用万用表测电池正负极两端的电压,你可以在C+端出来串一个电阻接三极管1脚,三极管二脚接单片机I/O口然后接入充电器时三极管导通不接时不导通,将单片机脚设为输...
如何用 单片机 口识别110v或220v?很简单。通过传感器或电阻分压的方式取得电压信号,经过隔离后得到3V左右(对于5V单片机)的信号电压,接入单片机的端口,编程将此端口初始化为低电平,此后实...
如何用上位机实现锂 电池 电量显示?用单片机的话主要是测量当前电池的电压,因为电压与电量之间有一定的关系,并不方便直接测量电量。实际上电量是通过计算得到的,比如知道充入了多少电量,放了多...
....我想用 单片机 控制,这个就5v 电压 啊,准备做一个流水灯_作业帮[最佳回答]5V电压串联不行的,要并联可以的.就算是普通的发光二极管,导通电压也要2V,串一个加上2V,串20个你自己算算电压要多少啊.并联可行不过电源要有足够驱...
怎么知道一款 单片机 的工作 电压 是3.3V还是5V啊?TTL数字电路的逻辑电平是5V,所以早期的单片机都使用5V电源以兼容5V逻辑,后来某些设备对功耗比较敏感,要求功耗越低越好,集成电路降低功耗最直接的办法就是降低...
51 单片机 读取 电压 原理?仿真制作的数字电压表的量程为0到5v,由于用到的模数转换芯片是ADC0809,设计系统给的供电电压为+5v。同时设计的精度为小数点后两位,满足要求的两位小数的精度...
51 单片机 可以显示输入 电压 值吗?可以的,但是需要去系统设置那里操作才可以。可以的,但是需要去系统设置那里操作才可以。
STM32 单片机 怎么检测0-24 电压 和电流 - 梦之寐时尚 的回答 - 懂得32的采集范围是0-3.3v你需0-24v电压衰减电路:电压跟随器高精度用运放,中精度用T型网络衰减电路,要求低用电阻分压的。电压缩小到0-3.3v范围内采集,...