1.从洗澡调水温到工业控制:PID算法原理与嵌入式实现

发布时间:2026/7/17 13:11:31

1.从洗澡调水温到工业控制:PID算法原理与嵌入式实现
一、PID的核心思想三个字母控制世界PID是Proportional比例、Integral积分、Derivative微分的缩写三个部分各司其职配合起来实现精准控制P比例像“现在就调”误差越大调整幅度越大I积分像“持续调”把历史误差累加起来消除稳态偏差D微分像“提前调”根据误差变化趋势提前刹车防止超调我们用洗澡调水温的例子一步步拆解1. P比例控制——误差越大调得越多冷水开太大水温偏冷你会说“冷了多少就开大多少热水”这就是比例控制。误差乘以系数Kp就是输出简单直接但有个致命缺陷永远到不了目标温度总会差那么一点。2. I积分控制——消除最后的偏差你等了很久水温还是偏冷烦了就说“既然一直偏冷我就再开大一点热水”多次累加误差产生累积量这就是积分控制。误差乘以系数Ki随时间不断累积逼着系统消除那点偏差。3. D微分控制——提前刹车防超调积分上来之后水温升得太快马上就超过目标你会提前收小热水。变化的快慢叫微分变化越快D项越大提前踩刹车。误差的斜率乘以Kd用来抑制超调和震荡。4. 三者配合P主力、I纠偏、D阻尼三个部分配合起来就是完整的PID输出u Kp×e Ki×∫e dt Kd×de/dtP说现在有误差快调I说误差存在太久了继续调D说变化太快了慢点调二、嵌入式C语言PID实现可直接运行的代码下面是一套基于STM32 HAL库的完整PID实现包含结构体封装、初始化、计算和限幅功能可直接用于电机转速、温度、位置控制等场景。1. 头文件定义pid.h#ifndef __PID_H #define __PID_H #include stm32f1xx_hal.h // PID控制器结构体 typedef struct { // 核心参数 float Kp; // 比例系数 float Ki; // 积分系数 float Kd; // 微分系数 float Ts; // 采样周期单位s // 限幅参数 float max_integral; // 积分上限 float min_integral; // 积分下限 float max_output; // 输出上限 float min_output; // 输出下限 // 状态变量 float integral; // 积分累加值 float prev_error; // 上一次误差 float output; // 当前输出 } PID_HandleTypeDef; // 函数声明 void PID_Init(PID_HandleTypeDef *pid, float Kp, float Ki, float Kd, float Ts, float max_integral, float min_integral, float max_output, float min_output); float PID_Calc(PID_HandleTypeDef *pid, float setpoint, float feedback); void PID_Reset(PID_HandleTypeDef *pid); #endif2. 实现文件pid.c积分抗饱和Anti-windup与输出限幅Output Clamping的必要性在实际PID控制中积分项会持续累加误差当系统输出达到物理极限如电机最大转速、阀门全开而误差仍然存在时积分项会继续累积导致积分饱和。这会使系统恢复时产生严重的超调和震荡。积分抗饱和通过限制积分项的累积范围来防止这种现象。输出限幅则是将PID总输出限制在物理执行器的有效范围内防止过冲损坏设备或系统不稳定。#include pid.h #include /** brief PID控制器初始化 param pid: PID控制器指针 param Kp: 比例系数 param Ki: 积分系数 param Kd: 微分系数 param Ts: 采样周期s param max_integral: 积分上限 param min_integral: 积分下限 param max_output: 输出上限 param min_output: 输出下限 retval 无 */ void PID_Init(PID_HandleTypeDef *pid, float Kp, float Ki, float Kd, float Ts, float max_integral, float min_integral, float max_output, float min_output) { pid-Kp Kp; pid-Ki Ki; pid-Kd Kd; pid-Ts Ts; pid-max_integral max_integral; pid-min_integral min_integral; pid-max_output max_output; pid-min_output min_output; pid-integral 0.0f; // 初始化积分累加值为0 pid-prev_error 0.0f; // 初始化上一次误差为0 pid-output 0.0f; // 初始化输出为0 } /** brief PID计算函数 param pid: PID控制器指针 param setpoint: 目标设定值 param feedback: 实际反馈值 retval PID输出值 */ float PID_Calc(PID_HandleTypeDef *pid, float setpoint, float feedback) { // 1. 计算当前误差目标值减去实际值 float error setpoint - feedback; // 2. 比例项当前误差乘以比例系数Kp float P_out pid-Kp * error; // 3. 积分项带抗饱和限幅 // 积分累加将当前误差乘以采样周期加到积分器中 pid-integral error * pid-Ts; // 积分抗饱和限幅防止积分项无限累积导致饱和 if (pid-integral pid-max_integral) { pid-integral pid-max_integral; // 超过上限则钳位到上限 } else if (pid-integral pid-min_integral) { pid-integral pid-min_integral; // 低于下限则钳位到下限 } float I_out pid-Ki * pid-integral; // 积分项输出 Ki × 积分累加值 // 4. 微分项计算误差变化率抑制超调 float derivative (error - pid-prev_error) / pid-Ts; // 误差变化率 (当前误差 - 上次误差) / 采样周期 float D_out pid-Kd * derivative; // 微分项输出 Kd × 误差变化率 // 5. 总输出比例项 积分项 微分项 pid-output P_out I_out D_out; // 6. 输出限幅将总输出限制在执行器有效范围内 if (pid-output pid-max_output) { pid-output pid-max_output; // 超过输出上限则钳位到上限 } else if (pid-output pid-min_output) { pid-output pid-min_output; // 低于输出下限则钳位到下限 } // 更新上一次误差用于下一次微分计算 pid-prev_error error; return pid-output; // 返回经过限幅的PID输出值 } /** brief 重置PID控制器状态 param pid: PID控制器指针 retval 无 */ void PID_Reset(PID_HandleTypeDef *pid) { pid-integral 0.0f; // 清零积分累加值 pid-prev_error 0.0f; // 清零上一次误差 pid-output 0.0f; // 清零输出值 }3. 使用示例电机转速控制#include pid.h // 定义PID控制器实例 PID_HandleTypeDef speed_pid; // 电机转速控制初始化 void MotorSpeed_Init(void) { // 初始化PID参数Kp2.0, Ki0.1, Kd0.5, 采样周期10ms PID_Init(speed_pid, 2.0f, 0.1f, 0.5f, 0.01f, 100.0f, -100.0f, // 积分限幅 1000.0f, 0.0f); // 输出限幅PWM占空比0~1000 } // 电机转速控制循环在定时器中断中调用10ms一次 void MotorSpeed_Control_Loop(void) { float target_speed 1000.0f; // 目标转速1000RPM float actual_speed Get_Encoder_Speed(); // 读取编码器实际转速 // 计算PID输出 float pwm_output PID_Calc(speed_pid, target_speed, actual_speed); // 设置PWM占空比 Set_PWM_Duty(pwm_output); }三、PID的应用场景三个字母控制世界PID算法诞生于1911年至今仍是控制领域的王者几乎无处不在无人机悬停姿态PID控制热水器恒温温度PID控制汽车定速巡航速度PID控制3D打印机位置PID控制工业机器人关节位置PID控制下期我们将深入讲解纯比例控制P的能做和不能做的事以及PID参数整定的实用技巧。代码说明该实现采用位置式PID适合大多数嵌入式控制场景包含积分抗饱和和输出限幅功能防止积分饱和和输出过冲采样周期Ts需要根据实际控制频率设置例如10ms中断则Ts0.01参数整定是PID应用的关键需要根据具体系统进行调试

相关新闻

终极指南:如何让Adobe Flash在2021年后继续运行 - FlashPatch完整教程

终极指南:如何让Adobe Flash在2021年后继续运行 - FlashPatch完整教程

2026/7/17 13:01:30

终极指南:如何让Adobe Flash在2021年后继续运行 - FlashPatch完整教程 【免费下载链接】FlashPatch FlashPatch! Play Adobe Flash Player games in the browser after January 12th, 2021. 项目地址: https://gitcode.com/gh_mirrors/fl/FlashPatch FlashPa…

12个实用技巧:彻底解决磁盘空间不足问题的完整文件管理指南

12个实用技巧:彻底解决磁盘空间不足问题的完整文件管理指南

2026/7/17 13:01:30

12个实用技巧:彻底解决磁盘空间不足问题的完整文件管理指南 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka 你是否经常面对磁盘空间不足…

如何调试Bluetooth-jammer-esp32:串口监控与故障排除指南

如何调试Bluetooth-jammer-esp32:串口监控与故障排除指南

2026/7/17 13:01:30

如何调试Bluetooth-jammer-esp32:串口监控与故障排除指南 【免费下载链接】Bluetooth-jammer-esp32 Bluetooth jamming esp32 with nrf24l01 项目地址: https://gitcode.com/gh_mirrors/bl/Bluetooth-jammer-esp32 调试Bluetooth-jammer-esp32设备是确保蓝牙…

QQ截图独立版深度评测:为什么这款免登录工具能替代你的系统截图

QQ截图独立版深度评测:为什么这款免登录工具能替代你的系统截图

2026/7/17 14:41:36

QQ截图独立版深度评测:为什么这款免登录工具能替代你的系统截图 【免费下载链接】QQScreenShot 电脑QQ截图工具提取版,支持文字提取、图片识别、截长图、qq录屏。默认截图文件名为ScreenShot日期 项目地址: https://gitcode.com/gh_mirrors/qq/QQScreenShot …

NGA论坛优化插件终极指南:让你的浏览体验提升300%

NGA论坛优化插件终极指南:让你的浏览体验提升300%

2026/7/17 14:41:36

NGA论坛优化插件终极指南:让你的浏览体验提升300% 【免费下载链接】NGA-BBS-Script NGA论坛增强脚本,给你完全不一样的浏览体验 项目地址: https://gitcode.com/gh_mirrors/ng/NGA-BBS-Script 你是否厌倦了NGA论坛杂乱无章的界面?是否…

怎样3分钟搞定Figma中文界面:设计师必备的终极汉化方案

怎样3分钟搞定Figma中文界面:设计师必备的终极汉化方案

2026/7/17 14:41:36

怎样3分钟搞定Figma中文界面:设计师必备的终极汉化方案 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的英文界面而烦恼吗?每次设计时都要在英文菜单…

如何用AML模组管理器彻底解决XCOM 2模组冲突问题:5步终极指南

如何用AML模组管理器彻底解决XCOM 2模组冲突问题:5步终极指南

2026/7/17 14:41:36

如何用AML模组管理器彻底解决XCOM 2模组冲突问题:5步终极指南 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mi…

3步修复:VisualCppRedist AIO一键解决Windows运行库缺失问题

3步修复:VisualCppRedist AIO一键解决Windows运行库缺失问题

2026/7/17 14:41:36

3步修复:VisualCppRedist AIO一键解决Windows运行库缺失问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否遇到过这些令人烦恼的情况&#x…

如何高效使用Windows系统监控工具:WMI Explorer实战指南与故障排查技巧

如何高效使用Windows系统监控工具:WMI Explorer实战指南与故障排查技巧

2026/7/17 14:31:35

如何高效使用Windows系统监控工具:WMI Explorer实战指南与故障排查技巧 【免费下载链接】wmie2 项目地址: https://gitcode.com/gh_mirrors/wm/wmie2 WMI Explorer是一款功能强大的Windows系统监控工具,专门用于浏览和查询Windows Management In…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/17 10:50:47

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/16 14:29:31

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/16 14:18:17

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

Cursor终端插件生态避坑指南:23个实测低效插件黑名单,附3个自研轻量替代方案

Cursor终端插件生态避坑指南:23个实测低效插件黑名单,附3个自研轻量替代方案

2026/7/17 0:00:57

更多请点击: https://intelliparadigm.com 第一章:Cursor终端插件生态避坑指南概览 Cursor 作为基于 VS Code 内核构建的 AI 原生编辑器,其终端插件生态虽活跃,但存在兼容性断层、权限策略突变与调试链路断裂等典型风险。开发者常…

ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表)

ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表)

2026/7/17 0:00:57

更多请点击: https://codechina.net 第一章:ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表) 提示词工程已从经验试错迈入变量驱动的科学阶段。实证研究表明,影响…

DeepSeek V4替换Codex底座模型的实践与优化

DeepSeek V4替换Codex底座模型的实践与优化

2026/7/17 0:00:57

1. 为什么选择用DeepSeek V4替换Codex的底座模型去年我在开发一个智能代码补全工具时,发现Codex的默认底座模型在复杂业务逻辑场景下表现不尽如人意。经过多次测试对比,DeepSeek V4在以下几个关键指标上展现出明显优势:代码补全准确率&#x…