充电器进阶,原边恒流,单片机控制小电流(预充电)的方案

前言

很多充电器,为了能控制电流输出,也就是充电时需要有小电流、大电流的情况,都会用副边及单片机进行控制,但因为是副边控制,需要一个比较器、一个二极管、若干电阻、若干电容,整体BOM成本可能多了三毛钱左右。这里介绍了原边恒流的实现方法,并提出了一种原边恒流,单片机控制小电流的方案。

有纰漏请指出,转载请说明。

学习交流请发邮件 1280253714@qq.com

副边及单片机控制输出电流

之前的文章有提到:

I_CTRL输出电压和电流采样电阻的电压进行比较,当I_CTRL大于I_SENSE时,也就是输出电流还没到设定的电流时,此时比较器输出高电平,相当于二极管不导通,也就是电流环此时不起作用,而是由电压环控制。

当I_CTRL小于I_SENSE时,也就是输出电流大于设定的电流时,此时比较器输出低电平,二极管导通,也就是电流环此时起主导作用, 导致流经TL431的电流变大,光耦PC817的灯变亮,导致晶体管阻值变小,CR6885的FB端电压变小(FB内部有一个电阻),GATE输出的占空比变小,抑制输出电流的增大,使电流保持在设定的值。

如果单片机通过PWM控制I_CTRL电压,此时就可以进行输出电流的调节。

这种情况下,如果去掉电流环,电源IC工作在CV模式,整个电路相当于适配器的架构,这种情况不适合对电池包进行充电,CV模式对电池包进行充电,可能会反复出现过载/过流保护而重启的可能。

原边控制输出电流

之前的文章对于KP201介绍到,KP201支持CC/CV模式,这款IC内置了通用原边恒流(CC)控制功能,简化了需要输出恒流调节的隔离式电源设计,;其中CS为电流感应输入引脚,用于检测电源输出电流的大小,用来调整PWM信号的占空比,以实现恒流控制:

反激电源控制芯片解读——以KP201为例_反激芯片规格书-CSDN博客

 

对整个周期的电流进行积分后除以总时长,求得平均电流。

在上面的描述中,Is(t) 代表次级电感或整流二极管的电流,Ip(t) 代表初级电感的电流,N 是变压器初级到次级的匝数比。通过检测变压器初级绕组的电流,可以换算出次级输出的电流。

电子工程师在应用时,只需调节Rcs的阻值即可求得输出电流。

单片机控制输出电流

上述原边恒流的方案,如果设置空载电压为21V,那么可能到电池包电压为20.7才进入恒压控制,也就是输出电压接近空载电压时,电流才会下降。

如果想在电池包电压很低时进行小电流充电,那么上述方法就行不通了。

那么,如果单片机能够控制充电器的空载电压,让空载电压接近电池包电压,不就可以一直处于恒压模式吗?也就是说,在电池包电压为8-12V时,充电器电压始终比电池包电压高一点,就可以一直进入小电流充电模式。

这时候最简单的控制方式是:检测输出电流的大小,当充电电流小于设定的电流时,让空载电压高一点;当充电电流大于设定的电流时,让空载电压低一点。逻辑大概是这样:

// 假设有以下变量和常量  
const float SET_CURRENT = 1.0; // 设定的电流值  
const float VOLTAGE_INCREASE = 0.1; // 充电电流小于设定值时,电压增加的量  
const float VOLTAGE_DECREASE = 0.1; // 充电电流大于设定值时,电压减少的量  
float voltCtrlPwm = 0.0; // 当前控制输出电压的占空比  
float outputCurrent; // 输出电流,通过ADC或其他方式读取  // 读取当前输出电流  
outputCurrent = readCurrentFromADC(); // 这是一个假设的函数,用于从ADC读取电流值  // 根据电流大小调整输出电压  
if (outputCurrent < SET_CURRENT) {  // 充电电流小于设定值,增加空载电压  voltCtrlPwm += VOLTAGE_INCREASE;  if (voltCtrlPwm > MAX_VOLTAGE) { // MAX_VOLTAGE是电压的上限值对应的占空比 voltCtrlPwm = MAX_VOLTAGE;  }  
} else if (outputCurrent > SET_CURRENT) {  // 充电电流大于设定值,降低空载电压  currentOutputVoltage -= VOLTAGE_DECREASE;  if (currentOutputVoltage < MIN_VOLTAGE) { // MIN_VOLTAGE是电压的下限值对应的占空比  currentOutputVoltage = MIN_VOLTAGE;  }  
}  // 设置新的输出电压  
setVoltage(voltCtrlPwm ); // 这是一个假设的函数,用于设置输出电压

当然,这种控制方式实际上可能行不通,如果用PID的方式,代码大概是这样:

// PID控制器参数  
float Kp = 1.0; // 比例系数  
float Ki = 0.1; // 积分系数  
float Kd = 0.01; // 微分系数  
float setCurrent = 1.0; // 设定的电流值  
float error = 0.0; // 误差值  
float previousError = 0.0; // 上一次的误差值  
float integral = 0.0; // 误差的积分  
float derivative = 0.0; // 误差的微分  
float voltCtrlPwm = 0.0; // 当前输出电压对应的占空比  
float voltageAdjustment = 0.0; // 电压调整量  // PID控制函数  
void pidControl() {  // 读取当前输出电流  float currentOutputCurrent = readCurrentFromADC();  // 计算误差  error = setCurrent - currentOutputCurrent;  // 计算误差的积分  integral += error;  // 计算误差的微分  derivative = error - previousError;  // 更新之前的误差值  previousError = error;  // 计算PID输出  voltageAdjustment = Kp * error + Ki * integral + Kd * derivative;  // 限制电压调整量在合理范围内  if (voltageAdjustment > MAX_ADJUSTMENT) {  voltageAdjustment = MAX_ADJUSTMENT;  } else if (voltageAdjustment < -MAX_ADJUSTMENT) {  voltageAdjustment = -MAX_ADJUSTMENT;  }  // 调整输出电压  voltCtrlPwm += voltageAdjustment;  // 限制输出电压在安全范围内  if (voltCtrlPwm > MAX_VOLTAGE) {  voltCtrlPwm = MAX_VOLTAGE;  } else if (voltCtrlPwm < MIN_VOLTAGE) {  voltCtrlPwm = MIN_VOLTAGE;  }  // 设置新的输出电压  setVoltage(voltCtrlPwm );  
}  // 在主循环中调用PID控制函数  
void mainLoop() {  // ... 其他代码 ...  pidControl(); // 执行PID控制  // ... 其他代码 ...  
}

总结

实际上,原边恒流、单片机控制小电流的方案和副边控制电流的方法是类似的,只不过是通过代码的方式实现了电流环。

二者的本质都是当前电流与目标电流进行比较,通过控制光耦的反馈量调整电源IC输出的占空比。

 

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

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

相关文章

小红书护肤行业笔记怎么写?纯干货!

小红书上都是年轻爱美的用户群体&#xff0c;所以护肤行业在小红书上做推广很吃香&#xff0c;小红书护肤行业笔记怎么写&#xff1f;接下来&#xff0c;伯乐网络传媒将从护肤行业笔记文案的特点和写作技巧两个方面给大家讲一讲。 一、护肤行业笔记文案特点 1. 突出个人情况 …

【Qcom Camera】DumpDebugInfo分析

DumpDebugInfo&#xff1a; DumpDebugInfo主要包括Session::DumpDebugInfo、Pipeline::Dumpdebuginfo、Node::Dumpdebuginfo、DRQ::Dumpdebuginfo、Usecase::DumpDebugInfo log&#xff1a;Hit SOF threshold of [xx] consecutive frames CamX: [ERROR][CORE ] camxpip…

Spring Boot入门(20):轻松搞定多数据源配置,Spring Boot与Mybatis-Plus的完美结合!

前言 本文将介绍如何在Spring Boot框架下使用mybatis-plus实现多数据源配置。多数据源配置是一个常见的需求&#xff0c;在实际项目中也经常遇到&#xff0c;因此掌握多数据源配置的技巧是非常重要的。 摘要 本文将为大家介绍如何使用Spring Boot和mybatis-plus实现多数据源…

路由过滤,策略实验

1配置ip [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 100.1.1.1 24 [r1-GigabitEthernet0/0/0]int l0 [r1-LoopBack0]ip add 192.168.0.1 32 [r1-LoopBack0]int l1 [r1-LoopBack1]ip add 192.168.1.1 32 [r2]int g0/0/0 [r2-GigabitEthernet0/0/0]ip add 100.1.1.2 24 [r…

自动化测试的三种测试报告模板

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

java中多线程的创建方式及常用的方法

目录 概述 继承Thread类&#xff1a; 实现Runnable接口&#xff1a; 实现Callable接口&#xff1a; 示例代码 继承Thread类示例 实现Runnable接口示例 实现Callable接口示例 调用三种线程测试示例 线程常用的成员方法 概述 常见的创建线程的方式包括&#xff1a;继承…

Axure糖尿病健康管理APP原型图,医疗保健血糖监测饮食控制

作品概况 页面数量&#xff1a;共 50 页 源文件格式&#xff1a;rp格式&#xff0c;兼容 Axure RP 9/10&#xff0c;非程序软件无源代码 应用领域&#xff1a;医疗健康、慢病管理、糖尿病管理 作品特色 本作品为Axure糖尿病健康管理APP端原型图&#xff0c;设计规范内容清晰…

浏览器跨标签页通信的方式都有哪些

跨标签页的实际应用场景&#xff1a; 1. 共享登录状态&#xff1a; 用户登录后&#xff0c;多个标签页中需要及时获取到登录状态&#xff0c;以保持一致的用户信息。这种情况&#xff0c;可以使用浏览器的 localStorage 或者 sessionStorage 来存储登录状态&#xff0c;并通过…

difflib 标准库详解:Python 文本对比的利器

&#x1f340; 前言 博客地址&#xff1a; CSDN&#xff1a;https://blog.csdn.net/powerbiubiu &#x1f44b; 简介 difflib 模块是 Python 标准库中的一个模块&#xff0c;用于比较文本之间的差异。它提供了一些函数和类&#xff0c;可以帮助你找到两个字符串或列表之间的…

“傻瓜”学计量——核密度估计KDE

提纲&#xff1a; 什么是核密度估计&#xff0c;是干什么的 代码 1 前言 参数估计vs非参数估计参数估计是样本数据来自一个具有明确概率密度函数的总体。非参数估计是样本数据的概率分布未知&#xff0c;这时&#xff0c;为了对样本数据进行建模&#xff0c;需要估计样本数据…

进阶C语言-文件操作

文件操作 &#x1f388;1.为什么使用文件&#x1f388;2.什么是文件&#x1f52d;2.1程序文件&#x1f52d;2.2数据文件&#x1f52d;2.3文件名 &#x1f388;3.文件的打开和关闭&#x1f52d;3.1文件指针&#x1f52d;3.2文件的打开和关闭 &#x1f388;1.为什么使用文件 ✅ 我…

标准解读|美国纽扣硬币电池新规UL 4200A-2023标准详解

深度解析美国新纽扣电池安全标准UL4200A-关注儿童安全,推动全行业提升 近年来,儿童不慎吞咽纽扣电池并导致严重伤害甚至死亡的事故时有发生,引起社会高度关注。为了降低此类安全隐患,美国权威安全认证机构UL于发布了新的纽扣电池安全标准UL 4200A,对相关电池和产品提出了更严格…

Java精品项目--第8期基于SpringBoot的宠物用品商城的设计分析与实现

项目使用技术栈 SpringBootThymeleafMyBatisMySQLAopJavajdk1.8 项目介绍 项目截图

今日arXiv最热NLP大模型论文:浙江大学:蒸一蒸,多Agent变成单一模型,效果更好

“团结就是力量”&#xff0c;面对复杂多变的现实环境&#xff0c;multi-agent应运而生。相较于单打独斗的single-agent&#xff0c;multi-agent集结了多个功能各异的LLM&#xff0c;共同攻克难关。然而&#xff0c;这种协同作战的方式也带来了沉重的推理负担&#xff0c;限制了…

500道Python毕业设计题目推荐,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

React自定义Hook函数:高效组件开发的秘密武器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

ZISUOJ 数据结构--队列及其应用

说明&#xff1a; 基本都是bfs的常见模板题型&#xff0c;思路都很直接&#xff0c;不过后面有两道题很搞心态&#xff0c;它们给的坐标x、y是反的&#xff0c;导致刚开始一直错。题目还是要看仔细&#xff0c;不能先入为主。 题目列表&#xff1a; 问题 A: 围圈报数(完善程序…

快速部署stable diffusion@Ubuntu

Stable Diffusion可以根据文本描述生成相关的图像&#xff0c;是当前最热门的文生图模型。 在Ubuntu下&#xff0c;可以选择快速安装&#xff0c;或者手动一步步安装。 快速安装 使用文档中的方法&#xff0c;先下载一个sh文件&#xff0c;然后执行这个文件&#xff0c;就自动…

就业班 第三阶段(负载均衡) 2401--4.19 day3 nginx3

二、企业 keepalived 高可用项目实战 1、Keepalived VRRP 介绍 keepalived是什么keepalived是集群管理中保证集群高可用的一个服务软件&#xff0c;用来防止单点故障。 ​ keepalived工作原理keepalived是以VRRP协议为实现基础的&#xff0c;VRRP全称Virtual Router Redundan…

乐鑫科技收购创新硬件公司 M5Stack 控股权

乐鑫科技 (688018.SH) 宣布收购 M5Stack&#xff08;明栈信息科技&#xff09;的控股权。这一战略举措对于物联网和嵌入式系统领域的两家公司来说都是一个重要的里程碑&#xff0c;也契合了乐鑫和 M5Stack 共同推动 AIoT 技术民主化的愿景。 M5Stack 以其创新的硬件开发方式而闻…