基于STM32设计的锂电池电量(电压/电流)检测
前言:使用STM32F103C8T6的ADC,和电阻分压法及均值滤波来测量18650锂电池的电压,并在OLED显示屏上显示电池电压值,求出电池电压值即求出电池的电流值和电量值。本文将对其实现过程进行详细介绍。
演示视频:
基于STM32设计的18650锂电池电量(电压电流)检测系统
所需硬件:STM32F103C8T6核心板、18650锂电池、10K电阻、104电容、OLED显示屏、杜邦线
目录
1.硬件电路
2.电阻分压原理
2.ADC原理
3.电池电压和电池剩余电量关系
4.程序设计及资料下载链接
1.硬件电路
实物图如下所示
电路原理示意图如下所示
如上图所示为STM32设计的18650锂电池电量(电压/电流)检测系统的电路示意图,上图中的元件U1为STM32F103C8T6核心板,使用的电源是3.3V的正极电源,功能引脚包括OLED显示屏的SDA引脚(PB9)和SCL引脚(PB8)以及检测锂电池电量的ADC引脚BAT_ADC(PA0)引脚。元件OLED1为4针OLED显示屏,用来进行电池电压/电流/电量的显示。上图中右下角为锂电池电量检测电流,使用的是电阻分压原理(后面会详细介绍),使用两个10K电阻和一个104电容(100nF),18650锂电池的正极引脚接在BAT+处,负极引脚接电源地。
2.电阻分压原理
那么为什么要进行电阻分压来进行电池电量检测呢?那是因为单片机的参考电压有关系,电池电压高于参考电压就没办法测量了,那么本系统所采用的单片机的参考电压是多少呢?
如下图为单个ADC框图,可以看到有VREF参考电压的接入。
如下表为ADC的引脚定义表,可以看到VREF+的电压范围在2.4V和VDDA之间,
可以知道,VDDA为 2.4V-3.6V,而锂电池电压在3.0V-4.2V之间变化,所以需要将锂电池的电压进行缩小来测量,那么咱们就来使用电阻分压原理来将锂电池的电压进行缩小来测量。
先直接使用电阻分压进行计算测量的电压:本系统使用的是10K的电阻,若当前BAT电池电压为3.7V,有如下的计算得到单个电阻的电压值,当前BAT_ADC引脚所测量的电压1.85V,所测电压乘以2即为电池的BAT电压3.7V(1.85*2V)。则通过这个过程,测量的电压为实际的电压的一半,则满足单片机参考电压量程的需求。
接下来讲解一下这个过程的原理: 这个原理基于串联电路的基本定律和欧姆定律。让我们一步步解释为什么无论电阻是多大,只要两个电阻相等,电压总是会均分。
在串联电路中,如果两个电阻相等,那么它们会均分总电压。这是因为电路中的电流是相同的,而电压通过欧姆定律分布在电阻上。由于电阻值相等,电压降也是相等的。
2.ADC原理
测量电池的电压就需要使用到单片机的ADC功能了:
- ADC(Analog-Digital Converter)模拟-数字转换器,简称模数转换器或AD转换器
-
ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。(1.STM32主要是数字电路,数字电路只有高低电平,没有几v电压的概念,所以想读取电压值,就需要借助adc模数转换器来实现,adc读取引脚上的模拟电压转换为一个数据存在寄存器里,我们再把这个数据读取到变量里来就可以进行显示、判断、记录等操作了;2.数字到模拟的桥梁是DAC数字模拟转换器,使用DAC就可以将数字变量转换为模拟电压,PWM也是数字到模拟的桥梁,PWM实现的就是DAC的功能,同时PWM只有完全导通和完全断开两种状态,在这两种状态上都没有功率损耗,所以在直流电机调速这种大功率的应用场景使用pwm来等效模拟量是比DAC更好的选择并且pwm电路更加简单更加常用,所以pwm还是挤占了dac很多的应用空间,目前dac的应用主要是在波形生成领域比如信号发生器、音频解码芯片等这些领域pwm还是不好代替的)
-
12位逐次逼近型ADC,1us转换时间。(逐次逼近型是ADC的工作模式;12位和1us涉及到adc的俩个关键参数,第一个是分辨率,一般用多少位来表示,12位ad值表示范围就是0~2^12-1就是量化结果的范围0~4095,位数越高量化结果就越精细,对应分辨率就越高;第二个是转换时间就是转换频率,ad转换是需要花一小段时间的,这里1us就是表示从ad转换开始到产生结果需要花1us的时间,对应ad转换的频率就是1MHz(1MHz的周期是1微秒,是stm32的adc最快转换频率),如果你需要转换一个频率非常高的信号那就需要考虑一下这个转换频率是不是够用,如果你的信号频率比较低那这个最大1MHz的转换频率也完全够用)
- 输入电压范围:0~3.3V,转换结果范围:0~4095。(adc的输入电压一般要求是在芯片供电的负极和正极之间变化的,0v对应0,3.3v对应4095,中间都是一一对应的线性关系)
-
18个输入通道,可测量16个外部和2个内部信号源。(外部信号源就是16个gpio口,在引脚上直接接模拟信号就行了,不需任何额外的电路,引脚就直接能测电压;2个内部信号源是内部温度传感器和内部参考电压,温度传感器可以测量cpu的温度,比如你电脑可以显示一个cpu的温度就可以用adc读取这个温度传感器来测量,内部参考电压是一个1.2v左右的基准电压,这个基准电压是不随外部供电电压变化而变化的,所以如果你芯片的供电不是标准的3.3v那测量外部引脚的电压可能就不对,这时就可以读取这个基准电压进行校准,这样就能得到正确的电压值了)
- 规则组和注入组两个转换单元。(是stm32 adc的增强功能,普通的ad转换流程是启动一次转换读一次值然后再启动再读值这样的流程,stm32的adc可以列一个组,一次启动一个组连续转换多个值并且有两个组,一个是用于常规使用的规则组,一个是用于突发事件的注入组)
-
模拟看门狗自动监测输入电压范围。(一般可以用于测量光线强度,温度这些值,并且经常会有个需求,就是如果光线高于某个阈值/低于某个阈值或者温度高于某个阈值/低于某个阈值执行一些操作,这个高于某个阈值/低于某个阈值的判断就可以用模拟看门狗来自动执行,模拟看门狗可以监测指定的某些通道,当ad值高于设定的上阈值或低于下阈值时它就会申请中断,就可以在中断函数里执行相应的操作,这样就不用不断地手动读值再用if进行判断了)
- STM32F103C8T6 的ADC资源:ADC1、ADC2,10个外部输入通道。(最多支持16个外部信号源,若想用更多的外部通道,可以选择引脚更多的型号,具体有多少个通道可以参考数据手册)
对于单片机的普通GPIO来说,只能读取引脚的高低电平,要么是高电平,要么是低电平,只有两个值,而使用了ADC之后,我们就可以对高电平和低电平之间的任意电压进行量化,最终用一个变量来表示,读取这个变量就可以知道这个引脚的具体电压到底是多少了,所以ADC其实就是一个电压表,把引脚的电压测出来放在一个变量里,这就是ADC的作用。
关于ADC的相关知识点还有很多,可以参见我的AD博文进行更为详细的学习:19.ADC模数转换器知识点+AD单通道&AD多通道应用程序示例_ad模数转换器-CSDN博客https://archie.blog.csdn.net/article/details/136723340
3.电池电压和电池剩余电量关系
当前系统可以实现对电压的检测,根据电压与电池剩余电量的关系即可得到电量值,根据欧姆定律即可求出电流值,即本系统可以完整实现对18650锂电池的电量、电压和电量的检测。
锂电池电压与电池剩余电量关系如下表所示(可能不同产品不一样,可参见电池厂商资料):
截止电压2.5-2.75v左右 稳定电压3.7v左右 满电4.2v左右
4.程序设计及资料下载链接
程序源码中使用了均值滤波来消除噪声干扰。
程序源码、原理图等资料下载见下方链接,或与我联系。
资料下载链接:基于STM32设计的18650锂电池电量(电压电流)检测系统-采用电阻分压法、均值滤波及ADC测量-皆可毕设/课设/作业/竞赛中资源-CSDN文库https://download.csdn.net/download/m0_61712829/89734164?spm=1001.2014.3001.5501