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

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

  • 一、锂电池充放电检测的原理
  • 二、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.mzph.cn/news/822123.shtml

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

相关文章

【问题解决分享】银河麒麟高级服务器操作系统oom分析

1.问题现象描述 服务器数据库被oomkill掉&#xff0c;但是mem查看只占用了不到60%。 2.问题分析 2.1.oom现象分析 从下面的日志信息&#xff0c;可以看到chmod进程是在内核采用GFP_KERNEL|__GFP_COMP分配order3也就是2的3次方&#xff0c;8个连续页的时候&#xff0c;因进入…

Hadoop大数据处理技术-安装配置篇

2024/4/16 ​Hadoop学习前的准备 1&#xff09;首先安装虚拟机 VMWare 虚拟机&#xff1a;因为它不是一个硬件 而是用软件做出来的 模拟真机 所以叫做虚拟机 但实际上它里面也可以安装Linux和Windows 实际它的实现 虚拟机中想要实现某个操作时 将需求发给Windows 调用Windo…

十大排序——7.希尔排序

下面我们来看一下希尔排序 目录 1.介绍 2.代码实现 3.总结与思考 1.介绍 希尔排序是插入排序的一种优化&#xff0c;可以理解为是一种分组的插入排序。 希尔排序的要点&#xff1a; 简单来说&#xff0c;就是分组实现插入&#xff0c;每组元素的间隙称为gap&#xff0c;…

leetcode-合并两个有序链表

目录 题目 图解 方法一 方法二 代码(解析在注释中) 方法一 ​编辑方法二 题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1…

OpenStack镜像管理与制作

一、OpenStack镜像服务 1、什么是镜像 镜像通常是指一系列文件或一个磁盘驱动器的精确副本。虚拟机所使用的虚拟磁盘&#xff0c;实际上是一种特殊格式的镜像文件。云环境下尤其需要镜像。镜像就是一个模板&#xff0c;类似于VMware的虚拟机模板&#xff0c;其预先安装基本的…

MySql数据库从0-1学习-第五天事务和索引

事务 事务 是一组操作的集合&#xff0c;它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作 要么同时成功&#xff0c;要么同时失败。 注意事项,默认事务是自动提交的,也就是说,当执行一条DML语句,MySql会立即隐…

计算机网络的七层模型

序 OSl(Open System Interconnect)&#xff0c;即开放式系统互联。一般都叫OSI参考模型。在网络编程中最重要的模型就是OSI七层网络模型和TCP/IP四层网络模型 一、OSI七层参考模型以及功能概述 二、各层的具体职能以及实际应用 1.应用层&#xff1a; OSI参考模型中最接近用…

【高端电流检测IC储能产品应用方案】耐压45V侧轨的电流检测芯片FP137 应用于电脑电源,开关电源以及多口快充充电器,户外移动电源,适配器,电池充电器等

近年来&#xff0c;随着电子产品的飞速发展&#xff0c;对电流检测精度和可靠性的要求也越来越高。特别是在电脑电源、开关电源以及多口快充充电器、户外移动电源、适配器、电池充电器等领域&#xff0c;对电流检测技术的需求更是日益增长。 电流检测芯片是一种关键的电子元器…

day02|最小花费爬梯子

最小花费爬梯子 比如 有一个数组 【2 5 20】我们直接选择从1号梯子&#xff08;从零编号&#xff09;跳两格就出去了。 算法原理 我们可以得出楼顶其实是数组的最后一个元素的下一个位置。对于最值问题我们可以尝试使用dpdp我们首先应该定义状态方差的含义&#xff0c;一般以…

stm32实现hid鼠标

启动CubelMX 选择芯片&#xff08;直接输入stm32f103zet6) 设置时钟 如下图 usb设置 配置usb设备 调试端口设置 配置时钟 项目输出设置 打开工程&#xff08;后记&#xff1a;此工程含有中文不能编译通过) 配置项目 配置调试器 编译无法通过 删除路径中的中文&#xff0c;以及…

[大模型]InternLM2-7B-chat Xtuner Qlora 微调

InternLM2-7B-chat Xtuner Qlora 微调 Xtuner介绍 XTuner是上海人工智能实验室开发的低成本大模型训练工具箱&#xff0c;XTuner 是一个高效、灵活、全能的轻量化大模型微调工具库。只要8G。最低只需 8GB 显存&#xff0c;就可以微调InternLM2-7B模型&#xff0c;打造专属于你…

强强联手|AI赋能智能工业化,探索AI在工业领域的应用

随着人工智能&#xff08;AI&#xff09;技术的不断发展和应用&#xff0c;AI在各个领域展现出了巨大的潜力和价值。在工业领域&#xff0c;AI的应用也越来越受到关注。AI具备了丰富的功能和强大的性能&#xff0c;为工业领域的发展带来了巨大的机遇和挑战。 YesPMP是专业的互联…

复习回顾ES6基础篇(一小时学会es6)

基本语法 多行注释 /* 这里的所有内容 都是注释。 */单行注释 // 这是一条注释。变量定义 var x "" //定义范围变量 let y "" //定义局部变量 const z "" //定义常量运算符 变量类型 流程语句 if (condition) {/* 条件为真时运行的代…

【位运算 子集状态压缩】982按位与为零的三元组

算法可以发掘本质&#xff0c;如&#xff1a; 一&#xff0c;若干师傅和徒弟互有好感&#xff0c;有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。 二&#xff0c;有无限多1X2和2X1的骨牌&#xff0c;某个棋盘若干格子坏了&#xff0c;如何在没有坏…

案例研究|众乐邦将MeterSphere持续测试平台融入DevOps流水线

众乐邦网络科技有限公司&#xff08;以下简称为“众乐邦”&#xff09;是一家企业服务公司。其旗下的众乐邦灵活用工数字化薪税管理平台&#xff08;以下简称为灵活用工管理平台&#xff09;&#xff0c;以财税服务视角切入灵活用工场景&#xff0c;连接企业、灵活就业者和监管…

力扣:141. 环形链表

力扣&#xff1a;141. 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾…

一个文生视频MoneyPrinterTurbo项目解析

最近抖音剪映发布了图文生成视频功能,同时百家号也有这个功能,这个可以看做是一个开源的实现,一起看看它的原理吧~ 一句话提示词 大模型生成文案 百家号生成视频效果 MoneyPrinterTurbo生成视频效果 天空为什么是蓝色的? 天空之所以呈现蓝色,是因为大气中的分子和小粒子会…

35、链表-LRU缓存

思路&#xff1a; 首先要了解LRU缓存的原理&#xff0c;首先定下容量&#xff0c;每次get请求和put请求都会把当前元素放最前/后面&#xff0c;如果超过容量那么头部/尾部元素就被移除&#xff0c;所以最近最少使用的元素会被优先移除&#xff0c;保证热点数据持续存在。 不管放…

鸿蒙画布组件使用介绍

一、前言 DevEco Studio版本&#xff1a;4.0.0.600 前些天写了一篇 鸿蒙自定义控件实现罗盘数字时钟效果 的文章&#xff0c;有同学私信说能不能介绍鸿蒙中的画布组件&#xff0c;下面文章介绍下鸿蒙中的Canvas画布、CanvasRenderingContext2D绘制组件&#xff0c;实现绘制文…

股票市场预测模型:未来趋势的智能分析工具

&#x1f4c8; 股票市场预测模型&#xff1a;未来趋势的智能分析工具 &#x1f911; &#x1f3e6; 概述 在这个充满变数的股票市场中&#xff0c;投资者需要一个强大的工具来预测未来的价格走势。我们的机器学习模型旨在通过分析历史数据&#xff0c;为投资者提供科学的市场…