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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年4月最新版GPT

2024年4月最新版ChatGPT/GPT4, 附上最新的使用教程。 随着人工智能技术的不断发展&#xff0c;ChatGPT和GPT4已经成为了人们日常生活中不可或缺的助手。2024年4月,OpenAI公司推出了最新版本的GPT4,带来了更加强大的功能和更加友好的用户体验。本文将为大家带来最新版GPT4的实用…

每日一题(PTAL2-006):树的遍历--树的构建,队列

因为要层序遍历&#xff0c;所以我们可以考虑构建一颗二叉树。构建完只有利用队列就可以就行层序遍历。 #include <bits/stdc.h> using namespace std; int p1[35]; int p2[35]; typedef struct Tree {int val;struct Tree* left;struct Tree* right; }TT; typedef TT* …

鸿蒙入门02-首次安装和配置

注&#xff1a;还没有安装编辑器&#xff08; deveco studio &#xff09;的小伙伴请看鸿蒙入门01-下载和安装-CSDN博客 首次安装配置 编辑器&#xff08; deveco studio &#xff09;安装完毕以后需要进入配置界面进行相关配置配置完毕以后才可以正常使用 环境配置&#xf…

微信小程序全局配置

全局配置文件及常用的配置项 小程序根目录下的 app.json 文件是小程序的全局配置文件。常用的配置项如下&#xff1a; ① pages 记录当前小程序所有页面的存放路径 ② window 全局设置小程序窗口的外观 ③ tabBar 设置小程序底部的 tabBar 效果 ④ style 是否启用新版的组件样…

MongoDB的CURD(增删改查操作)

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

【IT运维入门(ITHW)系列】之「快速部署」第二期清单(持续更新)

ITHW是Information Technology Hello World的缩写简拼。意在提供IT领域的入门相关知识&#xff0c;近期给大家带来的是主流技术选型的快速部署系列&#xff0c;意在最大程度地简化部署过程&#xff0c;以便能快速体验或测试相关技术选型。 「快速部署」第一期清单 ITHW快捷部署…

Day 15 Linux网络管理

IP解析 IP地址组成&#xff1a;IP地址由4部分数字组成&#xff0c;每部分数字对应于8位二进制数字&#xff0c;各部分之间用小数点分开&#xff0c;这是点分2进制。如果换算为10进制我们称为点分10进制。 每个ip地址由两部分组成网络地址(NetID)和主机地址(HostID).网络地址表…

文件服务: txt文件预览乱码问题

文章目录 一、背景二、解决方案1、转换流&#xff08;解决代码与文件编码不一致读取乱码的问题&#xff09;2、获取文本文件的字符编码 一、背景 在springboot项目中使用springmvc web.resources的形式进行文件访问。本地上传txt文件编码格式为GB2312(中文简体)&#xff0c;浏…

大数据平台搭建2024(二)

二&#xff1a;Hive安装 只在node01上操作 1 安装MySQL 8.0 最小化安装需要安装这个 yum install -y wget1-1 下载MySQL的yum源 wget http://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm检查是否安装成功 rpm -qpl mysql80-community-release-el7-7.n…

什么是漏洞?最全的漏洞分类!

01 — “ 什么是漏洞**”** 漏洞是指一个系统存在的弱点或缺陷&#xff0c;系统对特定威胁攻击或危险事件的敏感性&#xff0c;或进行攻击的威胁作用的可能性。漏洞可能来自应用软件或操作系统设计时的缺陷或编码时产生的错误&#xff0c;也可能来自业务在交互处理过程中的设…

14.C++常用的算法_排序算法

文章目录 遍历算法1. sort()代码工程运行结果 2. random_shuffle()代码工程运行结果第一次运行结果第二次运行结果第三次运行结果 3. merge()代码工程运行结果 4. reverse()代码工程运行结果 遍历算法 1. sort() 代码工程 sort()函数默认是升序排列&#xff0c;如果想要降序…

ChatGPT实用指南2024

随着ChatGPT技术的演进&#xff0c;越来越多的人开始在工作中利用此工具。以下是关于ChatGPT的实用指南&#xff0c;适合不太熟悉此技术的朋友参考。 一、ChatGPT概述 1. ChatGPT是什么&#xff1f; ChatGPT是基于OpenAI开发的GPT大型语言模型的智能对话工具。它能够通过自然语…

爆肝3k字!掌握Spring与Redis的高效交互:从Jedis到Spring Data Redis

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

B203-若依框架应用

目录 简介版本RuoYi-fast项目准备新增模块/代码生成 简介 基于SpringBoot的权限管理系统&#xff0c;基于SpringBoot开发的轻量级Java快速开发框架 版本 前后端未分离单应用版本&#xff1a;RuoYi-fast&#xff0c;前后端未分离多模块版本&#xff1a;RuoYi 前后端分离单应用…

06节-51单片机-LCD1602调试工具

欢迎订阅专栏&#xff0c;持续为您更新&#xff01; 1.LCD1602调试工具 使用LCD1602液晶屏作为调试窗口&#xff0c;提供类似printf函数的功能&#xff0c;可实时观察单片机内部数据的变换情况&#xff0c;便于调试和演示。 本文提供的LCD1602代码属于模块化的代码&#xff…

Java如何用EasyExcel插件对Excel进行数据导入和数据导出

文章目录 一、EasyExcel的示例导入依赖创建实体类数据导入和导出 二、EasyExcel的作用三、EasyExcel的注解 EasyExcel是一个阿里巴巴开源的excel处理框架&#xff0c;它以使用简单、节省内存著称。在解析Excel时&#xff0c;EasyExcel没有将文件数据一次性全部加载到内存中&…

如果补货机器人也开始搬砖

过去几年&#xff0c;如果一位顾客的欲购商品疑似缺货&#xff0c;“请稍等&#xff0c;我去后台查一下”便是最常听到的一句话。随着过去几年劳动力短缺的加剧&#xff0c;货架并不总像许多人习惯的那样满满当当。为减轻不断补货的负担&#xff0c;使员工可以将精力集中于其他…

【AI工具】AI一键生成思维导图

ChatMind 被 Xmind 收购之后&#xff08;即那个 00 后团队&#xff09;&#xff0c;将重点聚焦于海外市场&#xff0c;国内职场用户可对其予以关注&#xff0c;用户体验着实不错&#xff08;我认为 AI 生成思维导图&#xff0c;其关键点在于交互与 UI&#xff09;&#xff1a; …

05节-51单片机-模块化编程

1.两种编程方式的对比 传统方式编程&#xff1a; 所有的函数均放在main.c里&#xff0c;若使用的模块比较多&#xff0c;则一个文件内会有很多的代码&#xff0c;不利于代码的组织和管理&#xff0c;而且很影响编程者的思路 模块化编程&#xff1a; 把各个模块的代码放在不同的…

【javaWeb 第七篇】后端-Spring

Spring SpringspringBoot请求简单参数实体参数数组集合参数日期参数JSON参数路径参数 响应数据分层解耦三层架构解耦操作Bean的声明Bean组件扫描问题DI详解 Spring 详细介绍结合官网查看&#xff1a;https://spring.io/why-spring Spring发展到今天已经形成一种开发生态圈&…