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

前言

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

 

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

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

相关文章

VUE 项目 自动按需导入

你是否有这样的苦恼&#xff0c;每个.vue都需要导入所需的vue各个方法 unplugin-auto-import 库 Vite、Webpack和Rollup的按需自动导入API 本章提供Vite、Webpack中使用说明 1. 安装 npm i -D unplugin-auto-import 2. config.js 配置文件内追加配置 2.1 Vite // vite.conf…

用Nest实现对数据库的增删改查~

概述 为了与 SQL和 NoSQL 数据库集成&#xff0c;Nest 提供了 nestjs/typeorm 包。Nest 使用TypeORM是因为它是 TypeScript 中最成熟的对象关系映射器( ORM )。因为它是用 TypeScript 编写的&#xff0c;所以可以很好地与 Nest 框架集成。 TypeORM 提供了对许多关系数据库的支…

问题总结笔记

1.向量旋转 问题&#xff1a; 将一个向量旋转90 方法&#xff1a;旋转矩阵 FVector FrontDir EndMousePoint - Point; FrontDir.Normalize(); FVector Left FVector(-FrontDir.Y, FrontDir.X, 0); Verties.Add(Point Left * (WallWedith / 2)); Verties.Add(FVector(Vertie…

C语言 | Leetcode C语言题解之第35题搜索插入位置

题目&#xff1a; 题解&#xff1a; int searchInsert(int* nums, int numsSize, int target) {int left 0, right numsSize - 1, ans numsSize;while (left < right) {int mid ((right - left) >> 1) left;if (target < nums[mid]) {ans mid;right mid - …

Ubuntu Server 20.04 LTS 64bit安装ftp服务

1.安装vsftpd sudo apt install vsftpd2.配置vsftpd sudo vim /etc/vsftpd.conf write_enableYES # 启用任何形式的FTP写入命令&#xff0c;即可以修改文件local_umask022 # 本地用户创建文件的 umask 值&#xff0c;默认是被注释的connect_from_port_20YES # 针对 PORT 类型…

01_Nginx

文章目录 NginxNginx的核心功能Nginx的优势Nginx常用指令Nginx配置文件Nginx的核心功能&#xff1a;反向代理 Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子…

《大话西游2》本人收集的十二个单机版游戏,有详细的视频架设教程,云盘下载

《大话西游2》是一款经典的大型多人在线角色扮演游戏&#xff0c;也是一款国风经典的游戏。 有能力的可以架设个外网&#xff0c;让大家一起玩。 《大话西游2》本人收集的十二个单机版游戏&#xff0c;有详细的视频架设教程&#xff0c;值得收藏 下载地址&#xff1a; 链接&…

色彩空间转换在AI去衣技术中的应用与探索

在人工智能&#xff08;AI&#xff09;的广阔领域中&#xff0c;图像处理和计算机视觉技术一直占据着举足轻重的地位。其中&#xff0c;AI去衣技术作为一种新兴的图像处理技术&#xff0c;近年来受到了广泛关注。在AI去衣的实现过程中&#xff0c;色彩空间转换技术发挥着至关重…

信息系统项目管理师0057:运维管理(4信息系统管理—4.2管理要点—4.2.2运维管理)

点击查看专栏目录 文章目录 4.2.2运维管理1.能力模型2.智能运维4.2.2运维管理 IT运维是组织IT服务中关键的一种类型。随着组织IT建设的不断深入和完善,信息系统运维已经成为了各行各业各组织管理者和IT团队普遍关注的问题。IT运维是指采用IT手段及方法,依据服务对象提出的服务…

visionpro_对比工具_CogPatInspectTool

CogPatInspectTool CogPatInspectTool工具使用PatMax检测缺陷(缺陷被定义为运行期间图像中超出正常预期的图像差别的任何变化)&#xff0c;缺陷可能是物体遗失&#xff08;阻塞&#xff09;或者多余&#xff08;杂乱&#xff09;, 原理是通过PMAlign工具实现,用训练图片和当前…

Github账号注册

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

轮转数组(Leedcode)的题目

题目&#xff1a;给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步…

【快速上手ESP32(基于ESP-IDFVSCode)】09-Flash存储

ESP32中的Flash 关于ESP32中的Flash&#xff0c;我们需要再回顾一下命名规则。 我用的是立创开发板设计的板子&#xff0c;芯片型号是ESP32S3R8N8&#xff0c;因此可以知道我这块板子有8MB的Flash&#xff0c;大家可以参照着命名规则看看自己有多大的Flash容量。 操作Flash …

洗地机哪个牌子质量最好?这四款公认值得买,总有一款适合你

如今&#xff0c;洗地机在我们家庭清洁中&#xff0c;已经很常见了&#xff0c;它可以让我们快速的完成地面清洁的工作&#xff0c;无需我们手动去清洗滚布&#xff0c;大大的节省了我们清洁时间&#xff0c;给我们腾出来了更多时间去享受生活。但是目前&#xff0c;可供选择的…

通过WHM面板重启服务器

看到一位用户反馈他购买了Hostease的独立服务器带cPanel面板的&#xff0c;但是该用户想要重启服务器&#xff0c;通过cPanel面板进行操做管理重启&#xff0c;但是没有找到具体位置&#xff0c;因此留言寻求帮助&#xff0c;具体的操做步骤如下&#xff1a; 1.登录到WHM面板 2…

Oracle中的 plsql语法

01-plsql 为什么要plsql 复杂的业务逻辑 可以使用 编程语言实现 sql无法实现 plsql也可以实现复杂的业务逻辑 为不直接使用编程语言 而是学习plsql plsql会比直接使用 编程语言 速度更快 基本语法&#xff1a; [declare --声明变量 变量名 变量类型 ] begin --代码逻辑 …

ai扩写软件有哪些免费的?分享4款扩写好用的!

随着人工智能技术的飞速发展&#xff0c;AI扩写软件逐渐成为了内容创作者们的得力助手。它们能够迅速将简短的文案扩写成内容丰富、结构完整的文章&#xff0c;大大提高了创作效率。本文将为您盘点几款免费的AI扩写软件&#xff0c;助您在今日头条、百家号等自媒体平台上轻松打…

【快速上手ESP32(基于ESP-IDFVSCode)】08-SPI

SPI SPI&#xff0c;全称Serial Peripheral Interface&#xff0c;即串行外设接口&#xff0c;是一种同步串行接口技术。它最初由Motorola公司推出&#xff0c;并在其MC68HCXX系列处理器上首次定义。SPI接口主要应用在EEPROM、FLASH、实时时钟、AD转换器&#xff0c;以及数字信…

【HCIP学习】重发布和路由策略

一、重发布&#xff08;路由引入&#xff09; 1、背景&#xff1a; 一个网络拓扑中存在多种不同的路由协议&#xff0c;为了使多种不同的路由协议间能相互通信&#xff0c;出现了路由引入 为啥会存在多种不同的网络&#xff1f; 例如&#xff1a;OSPF由于区域架构的限制&am…

《苍穹外卖》Day02部分知识点记录

一、属性的拷贝以及密码的加密 使用org.springframework.beans中的BeanUtils.copyProperties()方法时&#xff0c;二者的属性名必须要一致。 /*** 新增员工* param employeeDTO*/Overridepublic void save(EmployeeDTO employeeDTO) {Employee employee new Employee();// 对…