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

news2024/11/26 14:33:25

前言

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

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

相关文章

virtio-wayland

CrosVM是Chrome操作系统中&#xff0c;用于创建虚拟机的应用。是一个Rust编写的轻量级的虚拟机。借助于CrosVM 用户可以很容易的在ChromeOS中运行Linux、Android以及Windows应用程序 概述 目前crosvm实现了virtio wayland协议&#xff0c;实现了对linux虚拟机wayland协议支持 …

债务泥潭、童婚和被摘除的子宫:糖的残酷真相

今天看到《纽约时报》的一篇深度报道&#xff0c;对于女性来说&#xff0c;看完不寒而栗&#xff0c;事情发生在印度。 在那种环境下&#xff0c;女性是多么的无助&#xff0c;无望&#xff0c;迷茫&#xff0c;只能同那个地区的成千上万女性一样&#xff0c;走着同样的命运。 …

python与pycharm如何设置文件夹为源代码根目录

相信大家遇到过下面这种情况 当我们在当前项目下引入了其它项目的代码&#xff0c;这是其它项目的包的导入路径是不用于当前项目的&#xff0c;这样导致项目无法正常起来&#xff0c;但是我们又不可能一个个文件去处理&#xff0c;这时可以用下面的方式解决 pycharm直接设置 …

区块链技术与应用学习笔记(5-7节)——北大肖臻课程

​ 目录 ​BTC实现 基于交易的账本模式&#xff1a; UTXO集合&#xff1a; 交易费用&#xff1a; BTC网络 1.应用层&#xff1a; 2.网络层&#xff1a; 3传播层&#xff1a; 什么是鲁棒&#xff1f; BTC挖矿&#xff1a; 出块奖励&#xff1a; 挖矿难度调整&#…

Typescript 练习

1. 类型谓词 格式&#xff1a;类型谓词采用parameterName is Type格式&#xff0c;其中parameterName必须是当前函数的参数 interface Iuser {type: username: stringage: numberoccupation: string }interface Iadmin {type: adminname: stringage: numberrole: string }expor…

安卓备份:守护你的数据安全与记忆珍藏

手机中的数据也承载着我们的记忆和情感&#xff0c;成为我们生活中不可或缺的一部分。为了守护这些宝贵的数据&#xff0c;备份成为了我们必须要面对的问题。本文将为你详细介绍安卓备份的方法&#xff0c;以及备份的重要性&#xff0c;帮助你更好地守护自己的数据安全与记忆珍…

Python 中的递归排列

在 Python 中使用递归计算排列,适合绝对初学者 介绍 有些人发现很难理解递归算法。 这个技巧向绝对初学者展示了如何使用递归查找排列。Python 背景 这个技巧的想法来自一个问答问题:可怜的 OP 花了三天时间“翻头”,试图弄清楚一小段代码如何能够生成输入列表项的所有排列。…

从零开始利用MATLAB进行FPGA设计(五)详解双口RAM

创作于谱仪算法设计过程中的数字能谱生成模块设计。 往期回顾&#xff1a; 从零开始利用MATLAB进行FPGA设计&#xff08;四&#xff09;生成优化HDL代码 从零开始利用MATLAB进行FPGA设计&#xff08;三&#xff09;将Simulink模型转化为定点数据类型 目录 1.关于双口RAM …

Python | Leetcode Python题解之第46题全排列

题目&#xff1a; 题解&#xff1a; class Solution:def permute(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""def backtrack(first 0):# 所有数都填完了if first n: res.append(nums[:])for i in range(first, n):# 动…

【Leetcode每日一题】 穷举vs暴搜vs深搜vs回溯vs剪枝_全排列 - 子集(难度⭐⭐)(65)

1. 题目解析 题目链接&#xff1a;78. 子集 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 算法思路详解&#xff1a; 为了生成数组 nums 的所有子集&#xff0c;我们需要对数组中的每个元素进行“选择”或“不选择…

被删除的数字-第12届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第57讲。 被删除的数字&…

Redis底层数据结构之quicklist

目录 一、概述二、quicklist结构三、quicklistNode结构四、优缺点 redis底层数据结构已完结&#x1f44f;&#x1f44f;&#x1f44f;&#xff1a; ☑️redis底层数据结构之SDS☑️redis底层数据结构之ziplist☑️redis底层数据结构之quicklist☑️redis底层数据结构之Dict☑️…

SecuPress Pro 专业级WordPress网站安全防护插件优化版

下载地址&#xff1a;SecuPress Pro 专业版.zip SecuPress Pro&#xff1a;专业的WordPress安全解决方案 如果您没有时间进行每周扫描&#xff0c;SecuPress Pro将是您的理想选择。SecuPress Pro提供了所有SecuPress Free的功能&#xff0c;同时还增加了一些高级选项&#xff…

SpringBoot War打包部署

修改打包方式 <packaging>war</packaging>修改 Servlet 容器的 scope <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></d…

一分钟掌握苹果语音备忘录怎么导出的3个方法!

苹果设备自带的语音备忘录功能&#xff0c;让我们能够随时随地记录生活中的点滴声音&#xff0c;无论是会议内容、学习笔记还是灵感闪现&#xff0c;都能轻松捕捉。然而&#xff0c;有时我们可能需要将这些语音文件导出到其他设备或平台&#xff0c;以便更好地整理、分享或备份…

API提取IP

API代理作为IP代理的一项重要业务&#xff0c;在绕开地域网络限制&#xff0c;提高作业效率等方面提供强大的技术支持。它能够帮助用户快速实现软件与软件间的交流&#xff0c;无障碍连通不同应用程序逻辑开发的系统应用。API代理用途范围广泛&#xff0c;如使用API提取代理IP、…

xinput1 3.dll丢失怎么办?详细解析靠谱的xinput1 3.dll修复方法

当电脑出现提示&#xff0c;显示 ​xinput1_3.dll​文件缺失时&#xff0c;这实际上是一种常见的DLL文件遗失错误&#xff0c;其修复过程通常相对简单。今天&#xff0c;我们将探讨四种不同的方法来解决 ​xinput1_3.dll​缺失的问题。 一.xinput1_3.dll文件解析 xinput1_3.d…

RabbitMQ的幂等性、优先级队列和惰性队列

文章目录 前言一、幂等性1、概念2、消息重复消费3、解决思路4、消费端的幂等性保障5、唯一 ID指纹码机制6、Redis 原子性 二、优先级队列1、使用场景2、如何添加3、实战 三、惰性队列1、使用场景2、两种模式3、内存开销对比 总结 前言 一、幂等性 1、概念 2、消息重复消费 3、…

金职在线 央企国企 跟私企都有哪些区别

一、性质不同 央企国企是国家的全资子公司&#xff0c;属于国有企业。私企就是由自然人投资设立或由自然人控股&#xff0c;以雇佣劳动为基础的营利性经济组织。 二、管理不同 央企国企有完整的审批程序和监管机制&#xff0c;而私企的决策相对简单。国企是政府管理的&#…

李彦宏:程序员将不复存在! 周鸿祎回怼!网友:先把百度程序员都开除了!

近日&#xff0c;百度创始人、董事长兼首席执行官李彦宏在央视《对话》•开年说的访谈中指出&#xff1a;“基本上说以后其实不会存在“程序员”这种职业了&#xff0c;因为只要会说话&#xff0c;人人都会具备程序员的能力”。 “未来的编程语言只会剩下两种&#xff0c;一种…