锂电池充放电管理-单片机通用

锂电池充放电管理-单片机通用

一、锂电池充放电检测的原理

  • ①两节锂电池通过电阻分压检测ADC,再根据电压划分电量等级;
  • ②充电使用的是锂电池充电IC方案,可通过硬件电阻参数调节充电电流,并可以通过STAT引脚检测充电和满电状态(充电注意会抬高电压);
  • ③放电根据ADC_BAT检测电池电量进行等级划分(注意大负载电压骤降瞬间);
  • ④充放电过程注意在电量划分等级临界值来回抖动现象;

二、power.c的实现

c 复制代码
#include "power.h"	

bit b_LowBat_Flag=0;		//低电进行关机	
bit b_BatAdjust_Flag=0;		//电池电压补偿
bit b_BatChargeFir_Flag=0;	//第一次充电标志
u8 batChargeMode = 0;		//0 无外电 1 充电 2 满电
u8 powerMode=0;				//1:绿色 2:黄色 3:红色 4:红色闪烁 5:充电 6:满电
u8 powerChargeMode=0;		//充电当前电量

u8 batChargeCnt=0;			//充电周期6次
u8 batChargeUp=0;			//上升次数
u8 batChargeFull=0;			//记录有6次上升表示充满

u16 adcBackup=0;			//备份上一次ADC数据
u16 adcBatAdjust=0;			//补偿ADC数据

//=============================================================================
//函数名称:checkCharge
//输	入:无
//输	出:无
//功	能:是否在接入5V充电
//=============================================================================
void checkCharge(void)
{
	if(IO_DC == 1)
	{
		b_PowerDis=1;
		if(IO_CHRG==0)
		{
			batChargeMode = 1;
			batChargeFull=0;
			if(++powerMode==5)
				powerMode=powerChargeMode;
		}
		else
		{
			//nopDelay(1000);
			if(IO_DC == 0)	return;
			if(IO_CHRG)
			{
				if(batChargeFull>=6)
				{
					batChargeMode = 2;
					powerMode = 4;
					powerChargeMode=4;
				}
				else
				{
					batChargeFull++;
				}
			}
		}
	}
	else 
	{
		batChargeMode = 0;
		batChargeFull=0;
	}
}

//=============================================================================
//函数名称:checkDCvol
//输	入:无
//输	出:无
//功	能:系统ADC采集外部供电
//=============================================================================
void checkDCvol(void)
{
	u16 DCadc=0;
	u16	DCadcFrom=0;				//ADC变化区间
	
	DCadc = getChannelVal(AD13); 	//Vcc对应的ADC值为4096 5v	锂电池放电范围3~4.2V
	BatLevelClo();	
	
	if(adcBackup>DCadc)
	{
		DCadcFrom = adcBackup-DCadc;	//计算电压骤减状态大于0.2V(92)/0.15(69) 0.1(46)
		if(DCadcFrom>=46)
		{
			b_BatAdjust_Flag=1;
			adcBatAdjust=DCadcFrom;		//备份骤减数据
		}
	}
	else
	{
		DCadcFrom = DCadc-adcBackup;
		if(DCadcFrom>16)
		{
			adcBatAdjust=0;
			b_BatAdjust_Flag=0;		//重新校准(正常放电)
		}
	}
	
	adcBackup = DCadc;				//备份上次ADC数据(备份校准)
	if(b_BatAdjust_Flag)
	{
		DCadc = DCadc+adcBatAdjust;
	}
					
	if(DCadc >1753)					//75%~100% 3.9~4.2V	8.4V 1938 1846 8v
	{
		if(powerMode>=4||Mode==0)
			powerMode = 4;
	}
	else if(DCadc >1661)			//50%~74% 3.6~3.9V	7.8V 1799 1753 7.6v
	{
		if(powerMode>=3||Mode==0)
			powerMode = 3;			//从第四格往下掉电
	}
	else if(DCadc >1603)			//25%~49% 3.3~3.6V  7.2V 1661
	{
		if(powerMode>=2||Mode==0)
			powerMode = 2;			//从第三格往下掉电
	}
	else if(DCadc >1499)			//0%~24% 2.8~3.3V	6.6V 1523
	{
		if(powerMode>=1||Mode==0)
			powerMode = 1;			//从第二格往下掉电
	}	
	else if(sleepMode)			    //低于3.3V (上电复用)
	{
		powerMode = 1;			//从第二格往下掉电
		if(DCadc >1476)	return;
		powerMode = 0;
		if(b_LowBat_Flag==0)
		{
			b_LowBat_Flag = 1;			//进入低电报警
			if(Mode==0)		return;		//长按开机不报警		
			b_KeyTone_Flag=1;			//蜂鸣器响一声
			Mode =8;
			b_PowerDis=1;
			b_Display_Flag = 1;			//刷新显示
		}		
	}
	if(Mode >=2&&Mode <=5)				//亮度立即显示电量
		b_PowerDis=1;				   //刷新电量显示
}

//=============================================================================
//函数名称:chargeAI
//输	入:无
//输	出:无
//功	能:30S内读6次有3次稳定说明充到了
//=============================================================================
static u8 chargeAI(void)
{
	batChargeUp++;
	if(++batChargeCnt>=6)
	{
		batChargeCnt=0;
		if(batChargeUp>=3)	
		{
			batChargeUp=0;
			return 0;
		}
		batChargeUp=0;
	}
	return 1;
}

//=============================================================================
//函数名称:chargeAI
//输	入:无
//输	出:无
//功	能:30S内读6次有3次稳定说明充到了
//=============================================================================
static void clearAIRam(void)
{
	batChargeCnt=0;
	batChargeUp=0;
}

//=============================================================================
//函数名称:checkBatChargevol
//输	入:无
//输	出:无
//功	能:系统ADC采集电池充电电量
//=============================================================================
void checkBatChargevol(void)
{
	u16 DCadc=0;
	if(Mode ==0)	return;			//不检测电量
	DCadc = getChannelVal(AD13); 	//Vcc对应的ADC值为4096 5v	锂电池放电范围3~4.2V
	IO_COTBAT = 0;					//关闭电池电量检测
	
	if(DCadc >1800)					//50%~74% 3.6~3.9V	8V 1846
	{	
		if(b_BatChargeFir_Flag)
		{
			if(powerChargeMode<3)
			{
				if(chargeAI())	return;
			}
		}
		powerChargeMode = 3;
	}
	else if(DCadc >1707)			//25%~49% 3.3~3.6V  7.2V
	{
		if((b_BatChargeFir_Flag==1)&&(powerChargeMode>2))	
		{
			clearAIRam();
			return;
		}
		else if(b_BatChargeFir_Flag)
		{
			if(chargeAI())	return;
		}
		powerChargeMode = 2;
	}
	else if(DCadc >1673)			//0%~24% 2.8~3.3V	6.6V 有bug
	{
		if((b_BatChargeFir_Flag==1)&&(powerChargeMode>1))	
		{
			clearAIRam();
			return;
		}
		else if(b_BatChargeFir_Flag)
		{
			if(chargeAI())	return;
		}
		powerChargeMode = 1;
	}
	else
	{
		if((b_BatChargeFir_Flag==1)&&(powerChargeMode>0))
		{
			clearAIRam();
			return;
		}
		powerChargeMode = 0;
	}
}

//=============================================================================
//函数名称:getFirCharge
//输	入:无
//输	出:无
//功	能:更新第一次充电电量显示
//=============================================================================
void getFirCharge(void)
{
	if(b_BatChargeFir_Flag==0&&batChargeMode==1)
	{
		IO_COTBAT = 1;
		nopDelay(36000);
		checkBatChargevol();	//立即采集电池充电电量
		b_BatChargeFir_Flag=1;	//采集完第一次充电电量
	}
}

//=============================================================================
//函数名称:openSyscheckDCvol
//输	入:无
//输	出:无
//功	能:开机时检测电池电压低于2.8V不开机
//=============================================================================
u8 openSyscheckDCvol(void)
{
	u16 DCadc=0;
	IO_COTBAT = 1;
	nopDelay(36000);
	DCadc = getChannelVal(AD13); 	//Vcc对应的ADC值为4096 5v
	if(DCadc>=1476)
		return 0;
	else
		return 1;					//低于3.3V
}

//=============================================================================
//函数名称:clearBatAdjust
//输	入:无
//输	出:无
//功	能:清除电池校准
//=============================================================================
void clearBatAdjust(void)
{
	b_BatAdjust_Flag=0;
	adcBackup=0;
	adcBatAdjust=0;
}
  • 根据外电5.0V和STAT引脚判断锂电池是否进入充电或满电状态,判断满电临界可能有抖动额外添加2/6的比例进行满电判断处理;
  • 放电进行周期采集电量,判断出现骤减超0.1V进行补偿处理,防止显示电量立即减低;当电量上升超0.1V取消骤减补偿处理(充电和睡眠清除补偿操作);
  • 放电过程处于等级划分,进行只降不升 放电等级处理,防止电量不断升降闪烁显示。单个锂电池电量低于3.3V进行低电关机保护锂电池过放处理(根据实际负载微调);
  • 充电过程到达等级划分临界值 ,也会出现电量来回跳变的异常情况,进行了3/6周期判断电量上升处理,除第一次充电周期检测不对其进行。充电过程会把电池电压抬高进行充电,与放电电量划分的等级会不一样;
  • 开机过程检测电量低于6.6V继续关机保护锂电池过放;

三、power.h的实现

c 复制代码
#ifndef	__POWER_H__
#define	__POWER_H__

#include "board.h"

#define BatLevelOpen()			(IO_COTBAT=1)		  //控制检测电池电量
#define BatLevelClo()		    (IO_COTBAT=0)

sbit	IO_DC			=		P2^4;
sbit	IO_CHRG			=		P3^3;
sbit	IO_COTBAT		=		P2^3;

extern bit b_RedSharp_Flag;
extern bit b_PowerDis;
extern bit b_LowBat_Flag;
extern bit b_BatChargeFir_Flag;		//第一次充电标志
extern u8 powerMode,powerChargeMode;
extern u8 batChargeMode;
extern u8 batChargeFull;
extern void checkDCvol(void);	//检测电源电压功能
extern void checkCharge(void);	//检测电池充电状态
extern u8 openSyscheckDCvol(void);
extern void checkBatChargevol(void);	//充电时检测电池电量	
extern void clearBatAdjust(void);		//清除校准
extern void checkBatChargevol(void);	//检测充电电量
extern void getFirCharge(void);			//充电立即进行充电


#endif

四、锂电池检测和充电电路

电量检测电路


两节锂电池充电电路

双节锂电池串联升压充电管理HE5080E 数据手册

相关推荐
jmlinux14 分钟前
电学基础概念详解及三相电公式汇总
stm32·单片机·嵌入式硬件
wit_yuan1 小时前
BMC 虚拟i2c访问PCA9545(switch芯片)后面的设备,为什么找不到PCA9545?
linux·服务器·嵌入式硬件
马浩同学2 小时前
【ESP32】ESP-IDF开发 | UART通用异步收发传输器+串口收发例程
c语言·单片机·嵌入式硬件·mcu
优信电子2 小时前
关于有源蜂鸣器及无源蜂鸣器的区别及驱动各类单片机案例
stm32·单片机·嵌入式硬件
Tlog嵌入式3 小时前
蓝桥杯【物联网】零基础到国奖之路:八. RTC
arm开发·stm32·单片机·mcu·物联网·蓝桥杯·iot
胡小禾3 小时前
mongoDB-1
数据库·mongodb
石板小湫3 小时前
【Proteus51单片机仿真】基于51单片机的汽车电动助力转向系统(包括代码讲解视频电流传感器、车速传感器、扭矩传感器、LCD12864显示模块)
嵌入式硬件·汽车·51单片机·proteus
firewood20243 小时前
初学51单片机之IO口上下拉电阻相关
单片机·嵌入式硬件
A 八方3 小时前
Python MongoDB
开发语言·python·mongodb
天冬忘忧3 小时前
MongoDB在Linux系统中的安装与配置指南
数据库·mongodb·datax