news 2026/7/28 10:49:14

PID算法总调不好?从原理、源码到手把手调参思路一次性讲清

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PID算法总调不好?从原理、源码到手把手调参思路一次性讲清

一、简介

1) 应用领域

PID控制器广泛应用于各种工业过程控制中,比如:温度控制、流量控制、压力控制、飞行器的姿态、汽车控制、机械臂的位置控制等多个领域。

2) 概念

PID控制器是一种广泛应用于过程控制的自动控制器,分别代表比例(proportional)、积分(integral)、微分(derivative),主要用于调节系统的输出,使反馈值与目标值更接近。

​​​​

其中:

  • Kp​ 是比例系数,用于放大偏差信号。
  • Ki​ 是积分系数,用于消除稳态误差。
  • Kd​ 是微分系数,用于预测偏差的变化趋势,提前进行控制。‌

二、位置式PID

PID初始化

void PID_Init(PID *pid, float Kp , float Ki , float Kd , float Limit_value) { pid->Kp= Kp; pid->Ki= Ki; pid->Kd= Kd; pid->PrevError =pid->LastError = pid->Error =pid->SumError= pid->output = 0; pid->Integralmax = pid->outputmax = Limit_value; }

PID参数定义及控制输出

typedef struct PID { float Kp; // Proportional Const P系数 float Ki; // Integral Const I系数 float Kd; // Derivative Const D系数 float PrevError ; // Error[-2] float LastError; // Error[-1] float Error; // Error[0 ] float DError; //pid->Error - pid->LastError float SumError; // Sums of Errors float output; float Integralmax; //积分项的最大值 float outputmax; //输出项的最大值 } PID; //为了防止积分项过度累积,引入积分项的限幅是一种常见的做法。 //限制积分项的幅值可以防止积分项过度增加,从而限制了系统的累积误差。这样可以避免系统过度响应或者不稳定。 float abs_limit(float value, float ABS_MAX) //积分限幅,设置最大值。 { if(value > ABS_MAX) value = ABS_MAX; if(value< -ABS_MAX) value = -ABS_MAX; return value; } //函数里传入指针,修改时会修改指针里的值。 float PID_Position_Calc(PID *pid, float Target_val, float Actual_val) //位置式PID { pid->Error = Target_val - Actual_val; //与pid P系数相乘。比例误差值 当前差值=目标值-实际值 pid->SumError += pid->Error; //与pid I系数相乘。稳态误差值 误差相加作为误差总和,给积分项 pid->DError = pid->Error - pid->LastError; //与pid D系数相乘。 微分项-消除震荡 pid->output = pid->Kp* pid->Error + abs_limit( pid->Ki* pid->SumError, pid->Integralmax ) + pid->Kd* pid->DError ; pid->LastError = pid->Error; //更新误差 //限制输出最大值,防止出现突发意外。输出outputmax的最大值 if(pid->output > pid->outputmax ) pid->output = pid->outputmax; if(pid->output < - pid->outputmax ) pid->output = -pid->outputmax; return pid->output ; //输出为pwm值 }

三、调参

Kp、Ki、Kd的作用。

P:增加快速性,过大会引起震荡和超调,P单独作用会一直有静态误差。
I:减少静态误差,过大会引起震荡。
D:减小超调,过大会使响应速度变慢。

(1)纯Kp调节(比例)
假设有一个高为10m的水桶需要灌满水,这里我们假设Kp=0.2(每次灌水量为剩余灌水量的0.2倍)。
第一次灌水:10×0.2, 剩余8(10-10×0.2)。
第二次灌水: 8×0.2, 剩余6.4(8-8×0.2)。
第三次灌水:6.4×0.2 ,剩余5.12。

这里我们发现当我们设置Kp后,一直会慢慢接近目标值,但是永远不会到达目标值,这也就是会一直有静态误差。当Kp设置过小时,消耗的时间也就会更多。这里我们可以适当的调大Kp,使得更快的接近目标值。但是当Kp大于某个定值时,就会出现抖动,如下,假设Kp=1.5。
则第一次灌水:10×1.5,剩余 -5。
第二次灌水:-5×1.5,剩余2.5(-5 - (-5×1.5))。
第三次灌水:2.5×1.5,剩余 -1.25。

所以,要根据实际适当调整p值,不要使得Kp过大,而出现抖动。

(2)Ki调节(积分)
作用:积分时间用于解决系统的稳态误差问题,即系统无法完全到达期望值的情况。当存在稳态误差时,积分项会不断积累偏差,并且在一段时间内持续作用于控制器的输出,直到系统到达期望状态为止。
水桶例子:假设你在使用一个PID控制系统来控制一个水桶的水位。如果水桶的出水口略微大于水龙头的流量,那么水位就会慢慢下降,形成一个稳态偏差。积分时间就像是一个将稳态偏差中的水慢慢积累起来,直到水桶完全满了。如果积分时间设置得太大,可能会导致水桶溢出,而设置得太小则可能导致水桶永远无法完全填满。

(3)Kd调节(微分)
作用:微分时间用于减小系统的超调和提高系统的稳定性。它通过监测偏差的变化速率来预测系统未来的行为,并相应地调整控制器的输出,以减少振荡和过冲现象。
水桶例子:继续以水桶控制系统为例,微分时间就像是观察水流速度的变化。如果你突然关闭水龙头,但是水桶的水位仍然在上升,那么微分项会告诉你要逐渐减小输出,以避免水位超过期望值。如果微分时间设置得太大,可能会导致系统对外部干扰过于敏感,反而引起不稳定性;而设置得太小,则可能无法有效地抑制超调和振荡。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/28 10:48:44

嵌入式C语言取余与取模:ARM开发中的核心原理与实战优化

1. 项目概述 在嵌入式C语言开发&#xff0c;尤其是ARM架构的底层编程中&#xff0c;我们经常需要处理数据的循环、边界判断和状态切换。比如&#xff0c;一个定时器中断每1ms触发一次&#xff0c;我们需要一个每1000ms翻转一次的LED灯&#xff1b;或者一个环形缓冲区的读写指针…

作者头像 李华
网站建设 2026/7/28 10:48:30

物联网安全芯片SE050与TM4C129XKCZAD的协同设计实践

1. 物联网安全现状与硬件安全芯片的必要性在当今万物互联的时代&#xff0c;物联网设备数量呈现指数级增长。根据行业统计&#xff0c;2023年全球活跃物联网设备数量已超过150亿台&#xff0c;预计到2025年将突破270亿台。然而&#xff0c;随之而来的安全威胁也日益严峻&#x…

作者头像 李华
网站建设 2026/7/28 10:48:12

从零搭建ResNet50+Milvus以图搜图系统实战

1. 项目概述&#xff1a;以图识图系统的核心价值 在数字图像爆炸式增长的时代&#xff0c;如何快速从海量图片中精准找到目标内容成为刚需。传统基于文本标签的检索方式存在标注成本高、主观性强等缺陷&#xff0c;而以图搜图技术通过提取图像视觉特征实现"用图找图"…

作者头像 李华
网站建设 2026/7/28 10:48:10

飞牛影视PC版终极指南:硬解播放、弹幕支持、智能跳过全掌握

飞牛影视PC版终极指南&#xff1a;硬解播放、弹幕支持、智能跳过全掌握 【免费下载链接】fntv-electron 飞牛影视PC版 项目地址: https://gitcode.com/gh_mirrors/fn/fntv-electron 你是不是厌倦了在浏览器里看视频的卡顿体验&#xff1f;想要一个真正专业级的本地影视播…

作者头像 李华
网站建设 2026/7/28 10:47:11

物联网设备安全芯片SE050的应用与优化实践

1. 为什么物联网设备需要专用安全芯片&#xff1f;在智能家居和工业物联网项目中&#xff0c;开发者常面临一个两难选择&#xff1a;使用主控芯片内置的安全功能&#xff08;如AES加密引擎&#xff09;看似节省成本&#xff0c;但实际部署后往往发现这些通用方案存在致命缺陷。…

作者头像 李华
网站建设 2026/7/28 10:47:04

p5.js创意编程入门:从零基础到动态交互艺术

1. 项目概述&#xff1a;为什么选择p5.js作为编程的“第一支画笔”&#xff1f;如果你对编程世界充满好奇&#xff0c;却又被那些枯燥的语法、复杂的开发环境吓得望而却步&#xff0c;那么&#xff0c;p5.js可能就是为你量身定做的“魔法棒”。它不是一个冰冷的代码编辑器&…

作者头像 李华