锂电池充放电管理-单片机通用
- 一、锂电池充放电检测的原理
- 二、power.c的实现
- 三、power.h的实现
- 四、锂电池检测和充电电路
一、锂电池充放电检测的原理
- ①两节锂电池通过电阻分压检测ADC,再根据电压划分电量等级;
- ②充电使用的是锂电池充电IC方案,可通过硬件电阻参数调节充电电流,并可以通过STAT引脚检测充电和满电状态(充电注意会抬高电压);
- ③放电根据ADC_BAT检测电池电量进行等级划分(注意大负载电压骤降瞬间);
- ④充放电过程注意在电量划分等级临界值来回抖动现象;
二、power.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的实现
#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数据手册