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

news2024/11/25 4:24:16

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

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

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

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

相关文章

区块链与数字身份:Web3的身份验证革命

随着数字化时代的发展&#xff0c;个人身份认证在日常生活和商业活动中变得越来越重要。然而&#xff0c;传统的身份认证方式存在着许多问题&#xff0c;如安全性不足、数据泄露、信息篡改等。而区块链技术的出现为数字身份认证带来了全新的解决方案。本文将深入探讨区块链与数…

无人零售行业展望:智能化与便利性引领未来

无人零售行业展望&#xff1a;智能化与便利性引领未来 无人零售&#xff0c;这一依靠智能化技术如人工智能、物联网、和大数据的零售模式&#xff0c;正逐步成为全球零售行业的新趋势。该模式允许消费者在没有店员的情况下自助完成购物&#xff0c;提供了24小时服务&#xff0…

【Web】陇原战“疫“2021网络安全大赛 题解

目录 CheckIN eaaasyphp EasyJaba CheckIN 拿到附件&#xff0c;贴出关键代码 func getController(c *gin.Context) {cmd : exec.Command("/bin/wget", c.QueryArray("argv")[1:]...)err : cmd.Run()if err ! nil {fmt.Println("error: ", …

Web3.0与AI的交融:开启智能互联网新时代

目前有140 多个 Web3 AI 概念项目&#xff0c;覆盖了基础设施、数据、预测市场、计算与算力、教育、DeFi & 跨链、安全、NFT & 游戏 & 元宇宙、搜索引擎、社交 & 创作者经济、AI 聊天机器人、DID & 消息传递、治理、医疗、交易机器人等诸多方向。持续关注…

SQLite数据库中JSON 函数和运算符

返回&#xff1a;SQLite—系列文章目录 上一篇:维护SQLite的私有分支&#xff08;二十六&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 ​ 1. 概述 默认情况下&#xff0c;SQLite 支持 29 个函数和 2 个运算符 处理 JSON 值。还有两个表值函数可用于分解 JSON…

二级综合医院云HIS系统源码,B/S架构,采用JAVA编程,集成相关医保接口

二级医院云HIS系统源码 云HIS系统是一款满足基层医院各类业务需要的健康云产品。该产品能帮助基层医院完成日常各类业务&#xff0c;提供病患预约挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生工作站和护士工作站等一系列常规功能&#xff0c;还能与公卫…

中立分析腾讯云故障相关的事件

最近腾讯云的故障&#xff0c;让一堆云计算爱好者兴奋地远看指点江山、近看沐猴而冠。我比这群爱好者们更了解云计算&#xff0c;但是我尊重我的读者&#xff0c;你们从我这里看到的科普信息&#xff0c;不仅仅只有情绪价值。 在信息爆炸的时代&#xff0c;大家关注和信任某个媒…

OSPF:MGRE实验

一、拓扑图 二、实验内容 1&#xff0c;R6为ISP只能配置IP地址&#xff0c;R1-R5的环回为私有网段 2&#xff0c;R1/4/5为全连的MGRE结构&#xff0c;R1/2/3为星型的拓扑结构&#xff0c;R1为中心站点 3&#xff0c;所有私有网段可以互相通讯&#xff0c;私有网段使用OSPF完成 …

js-pytorch:开启前端+AI新世界

嗨&#xff0c; 大家好&#xff0c; 我是 徐小夕。最近在 github 上发现一款非常有意思的框架—— js-pytorch。它可以让前端轻松使用 javascript 来运行深度学习框架。作为一名资深前端技术玩家&#xff0c; 今天就和大家分享一下这款框架。 往期精彩 Nocode/Doc&#xff0c;可…

uni-app中页面生命周期与vue生命周期的执行顺序对比

应用生命周期 uni-app 支持如下应用生命周期函数&#xff1a; 函数名说明平台兼容onLaunch当uni-app 初始化完成时触发&#xff08;全局只触发一次&#xff09;&#xff0c;参数为应用启动参数&#xff0c;同 uni.getLaunchOptionsSync 的返回值onShow当 uni-app 启动&#x…

20240416,对象初始化和清理,对象模型和THIS指针

哈哈哈乌龟越狱了 目录 2.5 深拷贝&浅拷贝 2.6 初始化列表 2.7 类对象作为类成员 2.8 静态成员 2.9 成员变量和成员函数分开存储 2.10 THIS指针的用途 2.11 空指针访问成员函数 2.12 COSNT修饰成员函数 2.5 深拷贝&浅拷贝 浅拷贝&#xff1a;简单的赋值拷贝…

如何调整Hostease服务器cPanel中的域名数量限制

近段时间我们的网站总是受到攻击&#xff0c;为了保障网站的安全&#xff0c;我们准备将所有网站迁移至Hostease提供的高防服务器中。我们的服务器配置是Intel I3 - 2120&#xff0c;8GB 内存 1TB 机械硬盘&#xff0c;100M 带宽出口&#xff0c;外加10G 防御的防御&#xff0…

Day06 - React 第六天

学习react的第六天&#xff0c;持续更新中 关注不迷路&#xff01;&#xff01;&#xff01; 使用脚手架创建一个react项目 全局下载react脚手架 npm install -g create-react-app 在需要的项目文件中创建一个react项目 create-react-app #项目名 创建好项目以后 npm或yar…

Activity——spring方式创建activiti所需数据表结构

文章目录 前言依赖引入编写数据库连接等配置配置日志文件编写java代码生成数据库表结构问题反馈与解决思路问题一&#xff1a;Cause: java.sql.SQLSyntaxErrorException: Table activiti_02.act_ge_property doesnt exist 为什么文件名必须写死&#xff1f; 前言 在之前创建ac…

java绘图在ubuntu报错

把JRT网站部署到ubuntu桌面系统上&#xff0c;开始没测试绘图部分功能&#xff0c;只试了连PostGreSql部分正常。后面试了生成位图部分发现报错。 报下面错误&#xff1a; (ColorModel.java:220)\n\tat java.desktop/java.awt.image.BufferedImage.(BufferedImage.java:286)\n…

设计模式之状态模式(上)

状态模式 1&#xff09;概述 1.定义 允许一个对象在其内部状态改变时改变它的行为&#xff0c;对象看起来似乎修改了它的类。 2.作用 状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。 3.方案 状态模式将一个对象的状态从该对象中分离出来&…

RabbitMQ 各种通信模式的Python实现

一、RabbitMQ 原理 1、基本原理 RabbitMQ是流行的开源消息队列系统&#xff0c;用erlang语言开发。RabbitMQ是AMQP&#xff08;高级消息队列协议&#xff09;的标准实现。支持多种客户端&#xff0c;如&#xff1a;Python、Java、Javascript、C#、C/C,Go等&#xff0c;支持AJ…

【ENSP】华为三层交换机配置AAA认证,开启telnet服务

配置步骤 1.给交换机配置ip地址&#xff0c;以便登陆 2.配置AAA&#xff0c;用户名&#xff0c;密码&#xff0c;服务类型&#xff0c;用户权限 3.配置接入设备的数量 4.开启telnet服务 LSW2交换机配置 u t m #关闭提示 sys …

微信小程序scroll-view组件

一、介绍 当一个容器内容很多时&#xff0c;若容器无法显示完整内容&#xff0c;则可通过滚动操作查看所有内容 在微信小程序中scroll-view组件可以实现滚动效果 二、scroll-view组件的属性值 &#xff08;1&#xff09;scroll-x 【boolean型】 允许横向滚动条&#xff0c;默…

Python也可以合并和拆分PDF,批量高效!

PDF是最方便的文档格式&#xff0c;可以在任何设备原样且无损的打开&#xff0c;但因为PDF不可编辑&#xff0c;所以很难去拆分合并。 知乎上也有人问&#xff0c;如何对PDF进行合并和拆分&#xff1f; 看很多回答推荐了各种PDF编辑器或者网站&#xff0c;确实方法比较多。 …