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

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

  • 一、锂电池充放电检测的原理
  • 二、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数据手册

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/625478.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

I2C通信的详细讲解

物理接口&#xff1a; SCL SDA &#xff08;1&#xff09;SCL&#xff08;serial clock&#xff09;:时钟线&#xff0c;传输CLK信号&#xff0c;一般是I2C主设备向从设备提供时钟的通道。 &#xff08;2&#xff09;SDA&#xff08;serial data&#xff09;&#xff1a;数据…

编程入门(二)【计算机基础二】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 前言三、数制的转换四、计算机信息的存储单位总结 前言 本系列&#xff08;分…

MongoDB的CURD(增删改查操作)

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 ✈️如果喜欢这篇文章的话 &#x1f64f;大大们可以动动发财的小手&#x1f449;&#…

【Day 2】JavaScript、Vue

1 引入方式 内部脚本 --- 将 JS 代码定义在 HTML 页面中 <script>alert("Hello javaScript") </script> JavaScript 代码必须位于 <script></s cript> 标签之间&#xff08;而不能自闭合&#xff09; 在 HTML 文档中&#xff0c;可以在任…

浅析Redis④:字典dict实现

什么是dict&#xff1f; 在 Redis 中&#xff0c;dict 是指哈希表&#xff08;hash table&#xff09;的一种实现&#xff0c;用于存储键值对数据。dict 是 Redis 中非常常用的数据结构之一&#xff0c;用于实现 Redis 的键空间。 在 Redis 源码中&#xff0c;dict 是一个通用…

交通部 JT/T 808(809 1076 1078 )车辆卫星定位系统 通信协议介绍

1 行业标准协议 1.1 官方网站 交通运输标准化信息系统 (mot.gov.cn) 附上官方下载地址&#xff1a; JT/T 808-2019 道路运输车辆卫星定位系统 终端通信协议及数据格式 JT/T 809-2019 道路运输车辆卫星定位系统 平台数据交换 JT/T 1076-2016 道路运输车辆卫星定位系统 车…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十三 简单去除图片水印效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十三 简单去除图片水印效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十三 简单去除图片水印效果 一、简单介绍 二、简单去除图片水印效果实现原理 三、简单去除图片水印效果案例…

MySQL与Redis缓存一致性的实现与挑战

缓存是提高应用性能的重要手段之一&#xff0c;而 MySQL 和 Redis 是两种常用的数据存储和缓存技术。在许多应用中&#xff0c;常常将 Redis 用作缓存层&#xff0c;以加速对数据的访问。然而&#xff0c;在使用 MySQL 和 Redis 组合时&#xff0c;保持缓存与数据库之间的一致性…

RAID 磁盘阵列及RAID配置实战

目录 一.RAID磁盘阵列介绍 二.常用的RAID磁盘阵列的介绍 1.RAID 0 &#xff08;条带化存储&#xff09; 2.RAID 1&#xff08;镜像存储&#xff09; 3.RAID 5 4.RAID 6 5.RAID 10&#xff08;先做镜像&#xff0c;再做条带&#xff09; 6.RAID 01 &#xff08;先做条带…

聊聊最近两星期的学习吧!

今天是4月14号。 自从我3月份回到学校之后&#xff0c;我每天都有记录自己的学习时长。今天晚上&#xff0c;我在复盘我自己学习时长的时候&#xff0c;我发现&#xff0c;在整个四月份&#xff0c;我平均每天的有效学习时长只有6h&#xff0c;而且到今天为止&#xff0c;整个四…

vue3 源码解析(7)— diff 算法源码的实现

前言 vue3 采用的 diff 算法名为快速 diff 算法&#xff0c;整个 diff 的过程分为以下5个阶段完成。 处理前置节点处理后置节点处理仅有新增节点处理仅有删除节点处理其他情况&#xff08;新增 / 卸载 / 移动&#xff09; 这里我们先定义新旧两个节点列表&#xff0c;接下来…

光距感-接近传感芯片的工作原理以及应用领域

接近光传感芯片是一种可以检测物体距离和位置的传感器。它的工作原理基于光电效应。当某个物体与接近光传感器靠近时&#xff0c;传感器会发出一束红外线。随着物体越来越靠近&#xff0c;被反射回来的光线会变强&#xff0c;被接近光传感器捕获。传感器可以测量时间&#xff0…