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

前言

很多充电器,为了能控制电流输出,也就是充电时需要有小电流、大电流的情况,都会用副边及单片机进行控制,但因为是副边控制,需要一个比较器、一个二极管、若干电阻、若干电容,整体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.hqwc.cn/news/650490.html

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

相关文章

光伏无人机勘探技术应用分析

光伏无人机勘探与传统勘探想必&#xff0c;具有智能化作业、测控精度高、环境适应性强等明显优势&#xff1b;卫星勘探辅助其能更快速甚至实时完成测绘拼图&#xff1b;在进行勘察时&#xff0c;可根据需要自由更换机载设备&#xff1b;自动诗经建模使数据更直观&#xff0c;工…

SpringCloud引入SpringBoot Admin

Spring Boot Admin可以监控和管理Spring Boot&#xff0c;能够将 Actuator 中的信息进行界面化的展示&#xff0c;也可以监控所有 Spring Boot 应用的健康状况&#xff0c;提供警报功能。 1. 创建SpringBoot工程 2. 引入相关依赖 <dependency><groupId>com.alib…

高级数据结构—线段树(一)

学线段树的原因是因为cf的一道题目始终想不出来怎么优化&#xff0c;后来知道区间查询和修改要用到线段树。。。 原题&#xff1a;Iva & Pav 线段树的作用 区间最值查询&#xff1a;可以高效地找到给定区间内的最大值、最小值等。 区间和查询&#xff1a;可以高效地计算…

俊杰测评:电视盒子什么牌子好?电视盒子品牌排行榜

欢迎各位来到俊杰的数码测评频道&#xff0c;每年我会进行数十次电视盒子测评&#xff0c;今年已经买过二十多款电视盒子了&#xff0c;本期的测评主题是电视盒子什么牌子好&#xff0c;通过十天的深入详细对比后我整理了电视盒子品牌排行榜&#xff0c;近期想买电视盒子的可以…

【软件】ERETCAD-Env:在轨空间环境3D动态仿真软件

文章介绍了Extreme-environment Radiation Effect Technology Computer-Aided Design – Environment (ERETCAD-Env)软件&#xff0c;文章的介绍和展示了ERETCAD-Env软件的功能和特点&#xff0c;这是一款用于动态模拟在轨卫星所处空间环境的计算机辅助设计软件。强调了该软件在…

for_earch

遍历容器执行函数 #include <iostream> #include <vector> #include <algorithm>void print_element(int x) {std::cout << "Element value: " << x << std::endl; }int main() {std::vector<int> vec { 1, 2, 3, 4, 5, …

贪心算法在找零问题中的应用

贪心算法在找零问题中的应用 引言a. 贪心算法求解找零问题算法设计算法证明 b. 硬币面额为c的幂时的贪心算法证明算法设计算法证明 c. 设计使贪心算法失效的硬币面额组合d. 通用找零算法设计算法设计算法实现&#xff08;伪代码&#xff09;算法实现&#xff08;C代码&#xff…

VS2019编译OSG3.7.0+OSGEarth3.3+OSGQt5.15.2时遇到的问题及解决方法

注:本次编译以文章《VS2019编译OSG3.7.0+OSGEarth3.3+OSGQt》为基础搜集资料并进行编译 一 OSG编译 1.Osg3.7.0编译中,cmake阶段按照文章步骤即可。 2.另外,还需要对以下三项进行设置,参照《OSG-OpenSceneGraph在WIN10与VS2022下的部署(OSG3.6.5+VS2022+Win10_x64)个…

Java后台开发的前置说明

1.知识点逻辑 一个部分 都是先挑重点知识点讲解 然后根据这些重点知识点去完成一个项目的开发 然后在到返回来解决这个部分其他细枝末节的知识点 2.软件开发的分工 我们大致可以将软件开发分成四块&#xff1a; 1.前端开发(比如开发电脑中的京东 htmlcssjavascript) 2.移动开…

构建高效的商品计划系统:为品牌增长注入新动力

在当今竞争激烈的市场环境中&#xff0c;商品计划对于品牌的成功至关重要。有效的商品计划系统不仅能够帮助企业精准地把握市场需求&#xff0c;优化生产流程&#xff0c;还能提升销售效率&#xff0c;改善客户体验&#xff0c;降低业务风险。本文将深入探讨有效的商品计划系统…

触发器的基本概念及分类

目录 触发器的基本概念 作用对象 触发事件 触发条件 触发时间 触发级别或者触发频率 触发器的分类 DML 触发器 INSTEAD OF 触发器 系统触发器 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 触发器的基本概念 …

Recommended Azure Monitors

General This document describes the recommended Azure monitors which can be implemented in Azure cloud application subscriptions. SMT incident priority mapping The priority “Blocker” is mostly used by Developers to prioritize their tasks and its not a…