boost_control.c
/********************************************************************************* file boost_control.c* brief 简化 Boost 开环/闭环 PI 控制实现。*******************************************************************************/#include boost_control.hstatic float Boost_Control_Clamp(float value, float low, float high){/* 所有输出占空比都经过本函数保证不会超过 Init() 规定的安全范围。 */if (value low) return low;if (value high) return high;return value;}static uint8_t Boost_Control_IsReady(const Boost_Control_t *device){/* 每个公开接口先检查对象和 PWM 指针避免错误参数访问寄存器。 */return (uint8_t)((device ! NULL) (device-initialized ! 0U) (device-pwm ! NULL));}static Boost_Status_t Boost_Control_ApplyDuty(Boost_Control_t *device, float duty){/* 先限幅再写 PWM调用者给出 -0.1 或 0.9 都不能越过 min/max。 */if (PWM_Driver_SetDuty(device-pwm,Boost_Control_Clamp(duty, device-min_duty,device-max_duty)) ! PWM_STATUS_OK){return BOOST_STATUS_PWM_ERROR;}/* 只有底层写 CCR 成功后才更新软件中记录的“实际占空比”。 */device-duty Boost_Control_Clamp(duty, device-min_duty, device-max_duty);return BOOST_STATUS_OK;}Boost_Status_t Boost_Control_Init(Boost_Control_t *device, PWM_Driver_t *pwm,float min_duty, float max_duty,float over_voltage){/* 此处只保存参数不启动 PWMStart() 才是真正打开输出的动作。 */if ((device NULL) || (pwm NULL) || (pwm-initialized 0U) ||!(min_duty 0.0f) || !(max_duty min_duty) || !(max_duty 1.0f) ||!(over_voltage 0.0f)){return BOOST_STATUS_INVALID_ARGUMENT;}device-pwm pwm; /* 记住要控制的普通 PWM 通道。 */device-min_duty min_duty;device-max_duty max_duty;device-duty 0.0f; /* 上电软件状态从 0% 开始。 */device-target_voltage 0.0f;device-over_voltage over_voltage;device-kp 0.0f;device-ki 0.0f;device-integral 0.0f;device-measured_voltage 0.0f;device-last_update_tick HAL_GetTick();device-mode BOOST_MODE_OPEN_LOOP;/* 默认开环避免未调 PI 时自动升压。 */device-running 0U;device-initialized 1U;return BOOST_STATUS_OK;}Boost_Status_t Boost_Control_Start(Boost_Control_t *device){/* Start 只负责“允许 PWM 输出”不会跳到目标电压或之前的占空比。 */if (Boost_Control_IsReady(device) 0U) return BOOST_STATUS_NOT_INITIALIZED;/* 先把 CCR 写为 0再打开 PWM避免沿用上一次的高占空比。 */if (PWM_Driver_SetDuty(device-pwm, 0.0f) ! PWM_STATUS_OK ||PWM_Driver_Start(device-pwm) ! PWM_STATUS_OK){return BOOST_STATUS_PWM_ERROR;}device-duty 0.0f; /* 软件镜像同步为 0%。 */device-integral 0.0f;device-last_update_tick HAL_GetTick();device-running 1U;return BOOST_STATUS_OK;}Boost_Status_t Boost_Control_SetOpenLoopDuty(Boost_Control_t *device, float duty){/* 开环就是把调用者给定的固定 duty 写到 PWM不读取 ADC。 */if (Boost_Control_IsReady(device) 0U) return BOOST_STATUS_NOT_INITIALIZED;if (device-running 0U) return BOOST_STATUS_NOT_RUNNING;if (!(duty device-min_duty) || !(duty device-max_duty))return BOOST_STATUS_INVALID_ARGUMENT;device-mode BOOST_MODE_OPEN_LOOP;/* 后续 Update() 不再调节 PWM。 */device-integral 0.0f;return Boost_Control_ApplyDuty(device, duty);}Boost_Status_t Boost_Control_EnableClosedLoop(Boost_Control_t *device,float target_voltage,float kp, float ki){/* 此函数只切换模式和保存 PI 参数真正的调节从下一次 Update() 开始。 */if (Boost_Control_IsReady(device) 0U) return BOOST_STATUS_NOT_INITIALIZED;if (device-running 0U) return BOOST_STATUS_NOT_RUNNING;if (!(target_voltage 0.0f) || !(kp 0.0f) || !(ki 0.0f))return BOOST_STATUS_INVALID_ARGUMENT;device-target_voltage target_voltage;device-kp kp;device-ki ki;device-integral 0.0f; /* 丢弃开环/旧参数留下的积分量。 */device-last_update_tick HAL_GetTick();device-mode BOOST_MODE_CLOSED_LOOP;return BOOST_STATUS_OK;}Boost_Status_t Boost_Control_Update(Boost_Control_t *device, float measured_voltage){uint32_t now;float dt;float error;float new_duty;if (Boost_Control_IsReady(device) 0U) return BOOST_STATUS_NOT_INITIALIZED;if (device-running 0U) return BOOST_STATUS_NOT_RUNNING;if (!(measured_voltage 0.0f)) return BOOST_STATUS_INVALID_ARGUMENT;/* 该值必须是 Vout 的真实电压而不是 ADC 引脚或 ADC 原始码。 */device-measured_voltage measured_voltage;if ((device-over_voltage 0.0f) (measured_voltage device-over_voltage)){(void)Boost_Control_Stop(device);/* 简化版不过压锁存停止后由应用决定是否重启。 */return BOOST_STATUS_OVERVOLTAGE;}if (device-mode BOOST_MODE_OPEN_LOOP){return BOOST_STATUS_OK;}now HAL_GetTick(); /* HAL 时基单位为 ms用它得到本次积分的实际时间间隔。 */dt (float)(now - device-last_update_tick) / 1000.0f;device-last_update_tick now;if (dt 0.0f) dt 0.001f;error device-target_voltage - measured_voltage; /* 正值表示电压偏低应增加占空比。 */device-integral error * dt; /* I 项误差持续越久累计补偿越多。 */device-integral Boost_Control_Clamp(device-integral, -10.0f, 10.0f);/* 在当前占空比基础上做 PI 微调。这样从开环切到闭环时不会立刻掉到 0%。 */new_duty device-duty device-kp * error device-ki * device-integral;return Boost_Control_ApplyDuty(device, new_duty); /* 最后仍由统一限幅函数写入 PWM。 */}Boost_Status_t Boost_Control_Stop(Boost_Control_t *device){/* Stop 是普通停机不保存故障标志之后可以直接再次 Start。 */if (Boost_Control_IsReady(device) 0U) return BOOST_STATUS_NOT_INITIALIZED;device-running 0U;device-duty 0.0f;device-integral 0.0f;return (PWM_Driver_Stop(device-pwm) PWM_STATUS_OK) ?BOOST_STATUS_OK : BOOST_STATUS_PWM_ERROR;}float Boost_Control_GetDuty(const Boost_Control_t *device){return (Boost_Control_IsReady(device) ! 0U) ? device-duty : 0.0f;}float Boost_Control_GetMeasuredVoltage(const Boost_Control_t *device){return (Boost_Control_IsReady(device) ! 0U) ? device-measured_voltage : 0.0f;}

相关新闻

FPGA矩阵乘法器设计:从Verilog实现到架构优化

FPGA矩阵乘法器设计:从Verilog实现到架构优化

1. 项目概述:为什么要在FPGA上实现矩阵乘法?如果你接触过数字信号处理、图像处理或者机器学习加速,那“矩阵乘法”这个词对你来说肯定不陌生。它是这些领域的核心运算,计算量巨大。在通用处理器(CPU)上跑大…

2026/8/4 11:45:56 阅读更多 →
Java 数据源类型清单

Java 数据源类型清单

在 Java 开发中,“数据源”(DataSource)通常指 JDBC 数据源,用于管理数据库连接池。但随着微服务和云原生的发展,数据源的概念已扩展到响应式数据源和多模型数据源。以下是按使用场景分类的完整清单及选型建议&#xf…

2026/8/4 11:45:45 阅读更多 →
GD32F450Z NAND FLASH驱动开发:从EXMC时序配置到ECC校验实战

GD32F450Z NAND FLASH驱动开发:从EXMC时序配置到ECC校验实战

1. 项目概述:为什么GD32F450Z的NAND FLASH调试是个技术活?拿到一块搭载GD32F450Z系列MCU的开发板,看到板载的那颗NAND FLASH芯片,很多工程师的第一反应可能是既熟悉又头疼。熟悉是因为NAND FLASH作为大容量存储介质太常见了&#…

2026/8/4 11:46:16 阅读更多 →

最新新闻

Shader代码的“觉醒之旅“:从解析完成到GPU执行的全过程

Shader代码的“觉醒之旅“:从解析完成到GPU执行的全过程

引子:一个让人"细思极恐"的问题 想象你已经走过了Shader的前半段旅程。 你知道: **你写的Shader文件——被ShaderImporter读进内存ShaderLab被解析、HLSL被提取、include被展开代码被ShaderCompiler翻译成中间格式最终打包成游戏里的一份数据 …

2026/8/5 20:46:11 阅读更多 →
Shader文件的“奇幻旅程“:从磁盘到GPU的完整加载之路

Shader文件的“奇幻旅程“:从磁盘到GPU的完整加载之路

引子:一个让新手"想都没想过"的问题 想象你是一个刚学Unity一段时间的开发者。 你写了一个漂亮的Shader——在Inspector里拖上贴图、调好参数——运行游戏——屏幕上瞬间出现绚丽的画面——你满意地点头:“完美!” **但如果这时——…

2026/8/5 20:46:11 阅读更多 →
Queue与RenderType:Unity渲染世界的“交通指挥官“与“身份识别码“

Queue与RenderType:Unity渲染世界的“交通指挥官“与“身份识别码“

引子:一场"混乱的十字路口"到"井然有序"的变革 想象你是一座繁华都市的交通指挥官。 **这座城市里——每天有数十万辆车穿行——公交车、私家车、出租车、救护车、消防车、垃圾清运车……——每一辆车都想开到自己的目的地。 问题来了&#xff…

2026/8/5 20:46:11 阅读更多 →
IPATool:如何用命令行工具安全高效地获取iOS应用包文件?

IPATool:如何用命令行工具安全高效地获取iOS应用包文件?

IPATool:如何用命令行工具安全高效地获取iOS应用包文件? 【免费下载链接】ipatool Command-line tool that allows searching and downloading app packages (known as ipa files) from the iOS App Store 项目地址: https://gitcode.com/GitHub_Trend…

2026/8/5 20:46:11 阅读更多 →
Unity Input System实现3D模型手势交互:旋转与缩放功能开发指南

Unity Input System实现3D模型手势交互:旋转与缩放功能开发指南

1. 项目概述:为什么需要手势交互?在移动端和触屏设备上浏览3D模型,手势操作几乎是唯一自然且高效的交互方式。想象一下,你打开一个产品展示应用,想看看新款手机的3D模型,如果只能用屏幕上的虚拟按钮来旋转、…

2026/8/5 20:46:11 阅读更多 →
nlohmann/json 深度解析:让 C++ 解析 JSON 像喝水一样简单

nlohmann/json 深度解析:让 C++ 解析 JSON 像喝水一样简单

一、nlohmann/json 是什么? 一句话:nlohmann/json(官方名 JSON for Modern C)是 C 生态里最"亲民"的开源 JSON 解析库,由德国开发者 Niels Lohmann 维护,GitHub 上 star 数接近 5 万&#xff0c…

2026/8/5 20:45:11 阅读更多 →

日新闻

Java缓存框架:JetCache

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架,为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能,同时你也可以通过代码直接操作 Cach…

2026/8/5 0:00:43 阅读更多 →
AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求:通孔焊盘 十字花;过孔 Via 实心直连;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑:全部统一十字,导致接地过孔阻抗高、大电流发热! 一、快捷键打开规则 PCB 界面按下:D R 展开…

2026/8/5 0:00:43 阅读更多 →
AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

更多请点击: https://kaifayun.com 第一章:AI生成素描效果 AI生成素描效果是计算机视觉与风格迁移技术融合的典型应用,其核心在于将彩色照片或RGB图像转换为具有手绘质感、明暗对比强烈、边缘清晰的单色素描图像。该过程通常依赖于深度学习模…

2026/8/5 0:00:43 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →