锂电池充放电管理-单片机通用
- 一、锂电池充放电检测的原理
- 二、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.2VBatLevelClo(); 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.2VIO_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 5vif(DCadc>=1476)return 0;elsereturn 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数据手册