PID控制器整理分享

article/2025/9/17 12:10:35

概述

日常开发中,常常需要对速度、温度等物理量进行稳态控制,而在目前的自动化控制原理中,使用最为广泛的方法就是PID控制算法。本文简要整理分享PID控制器的使用。

正文

PID控制器,即比例-积分-微分控制器。它是一个不依赖系统模型,仅依赖系统输出即可进行控制的负反馈控制器。PID控制器通过直观地观测当前误差(比例作用)过去的误差(积分作用)误差的变化趋势(微分作用) 来进行系统控制。

PID控制器的数学公式可以写成: u = K p ∗ e + K i ∗ ∫ e d t + K d ∗ d e d t u=K_p*e+K_i*\int{e}dt+K_d*\frac{de}{dt} u=Kpe+Kiedt+Kddtde

其中:

e e e是当前误差

K p K_p Kp是比例增益系数

K i K_i Ki是积分增益系数

K d K_d Kd是微分增益系数

所以,从上述公式可以看出,PID控制器对系统的控制作用是比例项、积分项、微分项的加权和。

其次,衡量一个系统的状态,可以从稳定性、准确性、快速性来衡量。其中,

P和I降低系统稳定性,D提高系统稳定性

P和I减小静态误差,D无作用

P和D提高响应速度,I降低响应速度

PID调参方法

(1)整定比例项

方法:先将积分、微分作用去除,设置目标值为系统最大控制量的70%。然后,逐渐加大比例作用,直到系统发生震荡。观察控制量波形,若波形的波峰由大变小,且最终稳定在某个值,且第一个波峰与第二个波峰之间数值比约为4:1。那么可以把当前 K p K_p Kp固定。

(2)整定积分项

方法:逐渐减小积分时间,使得积分项作用增强,观察控制量波形。若控制量静差为0,则可以把当前 T i T_i Ti固定下来。

(3)整定微分项

方法:逐渐增加微分时间,使得微分项作用增强,观察控制量波形。若控制量波形震荡减小至基本无震荡,则可以把当前 T d T_d Td固定下来。

(4)微调参数

方法:若发现粗调后,系统稳定性不足(震荡多),则稍稍加大 T d T_d Td;若准确性不足,则稍稍减小 T i T_i Ti;循环往复观察对比,调整 T i T_i Ti T d T_d Td,直到满足系统要求为止。

对于联级PID的调参方法与单环PID调参方法一样,只是联级PID调参时,需要先整定内环,再整定外环(即先将外环作用去除)

使用matlab simulink简单测试调参方法

参数及效果如下:
在这里插入图片描述
在这里插入图片描述

代码实现

PID控制器分为位置式PID增量式PID

位置式PID公式: u ( k ) = K p ∗ e ( k ) + K p ∗ T T i ∗ ∑ i = 1 k e ( i ) + K p ∗ T d T ∗ [ e ( k ) − e ( k − 1 ) ] u(k)=K_p*e(k)+\frac{K_p*T}{T_i}*{\sum_{i=1}^{k}e(i)}+\frac{K_p*T_d}{T}*\left[e(k)-e(k-1)\right] u(k)=Kpe(k)+TiKpTi=1ke(i)+TKpTd[e(k)e(k1)]

由于基于误差的微分方程存在微分冲击的缺陷,所以微分项可以改进为: − K p ∗ T d T [ P v ( k ) − P v ( k − 1 ) ] -\frac{K_p*T_d}{T}\left[Pv(k)-Pv(k-1)\right] TKpTd[Pv(k)Pv(k1)]

所以C代码如下:

void pid_calc(pid_t *pid)
{float DelPv;float ti,ki;float td;float kd;float out;pid->Ek = pid->Sv - pid->Pv;   		//得到当前偏差值pid->Pout = pid->Kp * pid->Ek; 		//比例输出//抗积分饱和if(pid->OUT >= pid->pwmcycle){if(pid->Ek < 0)pid->SEk += pid->Ek;}else if(pid-OUT <= pid->OUT0){if(pid->Ek > 0)pid->SEk += pid->Ek;}elsepid->SEk += pid->Ek;
// 	pid->SEk += pid->Ek;        		//历史偏差总和ti = pid->T / pid->Ti;ki = ti * pid->Kp;pid->Iout = ki * pid->SEk;  	//积分输出DelPv = pid->Pv - pid->Pv_1;td = pid->Td / pid->T;kd = pid->Kp * td;pid->Dout = kd * DelPv;    			//微分输出out = pid->Pout + pid->Iout - pid->Dout;//输出限幅if(out > pid->pwmcycle){pid->OUT = pid->pwmcycle;}else if(out < 0){pid->OUT = pid->OUT0; }else {pid->OUT = out;}pid->Pv_1 = pid->Pv;
}

增量式PID公式: Δ u = K p ∗ [ e ( k ) − e ( k − 1 ) ] + K p ∗ T T i ∗ e ( k ) + K p ∗ T d T ∗ [ e ( k ) − 2 ∗ e ( k − 1 ) + e ( k − 2 ) ] \Delta{u}=K_p*\left[e(k)-e(k-1)\right]+\frac{K_p*T}{T_i}*e(k)+\frac{K_p*T_d}{T}*\left[e(k)-2*e(k-1)+e(k-2)\right] Δu=Kp[e(k)e(k1)]+TiKpTe(k)+TKpTd[e(k)2e(k1)+e(k2)]

同样的,可以改进式子以消除微分冲击:

− K p ∗ T d T [ P v ( k ) − 2 ∗ P v ( k − 1 ) + P v ( k − 2 ) ] -\frac{K_p*T_d}{T}\left[Pv(k)-2*Pv(k-1)+Pv(k-2)\right] TKpTd[Pv(k)2Pv(k1)+Pv(k2)]

所以C代码如下:

void incremental_pid_calc(pid_t *pid)
{float DelPv;float ti,ki;float td,kd;float beta;float out;pid->Ek = pid->Sv - pid->Pv;	//当前误差//积分分离if(fabs(pid->Ek) <= 100) 	//偏差较大时,不加入积分作用beta = 1;elsebeta = 0;//比例项输出pid->Pout = pid->Kp * (pid->Ek - pid->Ek_1);//积分项输出ti = pid->T / pid->Ti;ki = ti * pid->Kp;pid->Iout = beta * ki * pid->Ek;//微分项输出DelPv = pid->Pv - (2 * pid->Pv_1 ) + pid->Pv_2;//抗微分冲击td = pid->Td / pid->T;kd = td * pid->Kp;pid->Dout = kd * DelPv;out = pid->Pout + pid->Iout - pid->Dout;//输出限幅if(out > pid->pwmcycle)pid->OUT = pid->pwmcycle;else if(out < 0)pid->OUT = pid->OUT0; else pid->OUT = out;//死区限定if(fabs(pid->Ek) <= 10)pid->OUT = pid->OUT0; pid->Ek_1 = pid->Ek;pid->Pv_2 = pid->Pv_1;pid->Pv_1 = pid->Pv;
}

总结

这样就可以移植和使用PID控制了。实际开发中,经典PID控制器基本不适用,所以常常需要对PID控制器进行一下改进,如加入积分分离、微分先行、死区控制等方式优化。所以,虽然PID控制原理很简单,但是调参及优化才是比较花时间的地方。熟能生巧,用多了,自然就会了。关于PID的整理分享就到这儿,说得不好的地方请大佬们指教。


http://chatgpt.dhexx.cn/article/N7V1bm9c.shtml

相关文章

PID算法详解

文章目录 什么是pid比例&#xff08;p&#xff09;控制积分&#xff08;I&#xff09;控制微分&#xff08;D&#xff09;控制PID使用增量式PIDC语言实现pid算法 什么是pid PID算法是一种具有预见性的控制算法&#xff0c;其核心思想是&#xff1a; 1>. PID算法不但考虑控制…

《PID》一篇文章带你搞懂使用PID

节选自本人博客&#xff1a;https://www.blog.zeeland.cn/archives/pid-learning 本文为笔者参考了网上众多大神的解析之后加上自己的理解整合起来的&#xff0c;因此在内容上部分参考了其他作者&#xff0c;目的仅用作参考以便更好地学习&#xff0c;如有侵犯&#xff0c;可联…

PID几种公式总结

模拟式PID 其中&#xff0c;t为采样时间 位置式PID 其中&#xff0c;为采样间隔 增量式PID 增量式PID和位置式PID都是数字式PID&#xff08;模拟式PID的离散化&#xff09;的不同表达形式&#xff0c;因为计算机只能处理离散数据&#xff0c;将连续信号变为离散信号&#xff…

PID控制及公式讲解

1、PID引入 2、PID代码 /*******************************************************************位置式pid********************************************************************/ double PID(double Actual,double SET){ static double E_sum,Error_last; //上一…

一文读懂PID控制算法(抛弃公式,从原理上真正理解PID控制)

一文读懂PID控制算法&#xff08;抛弃公式&#xff0c;从原理上真正理解PID控制&#xff09; PID控制应该算是应用非常广泛的控制算法了。小到控制一个元件的温度&#xff0c;大到控制无人机的飞行姿态和飞行速度等等&#xff0c;都可以使用PID控制。这里我们从原理上来理解PI…

PID公式的推导过程及实现代码

一、PID框图&#xff1a; n0(t)是要稳定的值 n(t)是当前输出值 e(t) n0(t) - n(t) 一、模拟PID控制原理 这个公式网络上很好找&#xff1a; 二、数字PID控制 由于模拟的微积分运算对应计算机来说是不太好写代码的&#xff0c;所以要利用采样将数据离散化 于是公式就可以转换…

经典的pid公式,好脑子不如烂笔头。

这个算法涉及昨天&#xff0c;今天&#xff0c;明天。 思路就是以史为鉴&#xff0c;预测明天&#xff0c;改革当前。

PID公式通俗理解

PID调节是有方法、有规律可循的&#xff0c;不过在此之前先深入理解其公式。 别怕&#xff0c;先看认真看PID本体&#xff1a; 其中&#xff1a; u(t) -------------输出曲线&#xff0c;pid输出值随时间的变化曲线 Kp --------------比例系数 e(t)------------- 偏差曲线&…

PID公式

位置型PID&#xff1a; 增量式PID&#xff1a; 增量式PID和位置式PID的优缺点&#xff1a; 位置式PID&#xff1a; u&#xff08;k&#xff09;的值和执行机构的位置&#xff08;如阀门开度&#xff09;是一一对应的&#xff0c;因此通常称该公式为位置式PID控制算法 缺点&…

PID控制算法01

PID控制算法 PID控制算法公式原理参数作用 PID算法及改进两个基本类型位置型PID控制增量型PID控制 积分环节改进的PID控制积分分离的PID控制变速积分的PID控制抗积分饱和的PID控制 微分环节改进的PID控制不完全微分PID控制微分先行PID控制 PID控制算法公式 原理 PID控制是一种…

PID控制(个人学习)

title:控制策略 date:2020-3-22 author:Page categories: -控制策略 tages&#xff1a; -控制 比例积分微分控制&#xff0c;简称PID控制 因为以下优点被人们广泛使用于各个领域 a. 技术成熟 b. 易被人们熟悉和掌握 c. 不需要建立数学模型 d. 控制效果好 e. 鲁棒性 通常依据控…

PID控制

一、PID&#xff1a; 1.基本公式 P:Proportion(比例)&#xff1a;就是输入偏差乘以一个常数。 I&#xff1a;Integral(积分)&#xff0c;就是对输入偏差进行积分运算。 D&#xff1a;Derivative(微分)&#xff0c;对输入偏差进行微分运算。 注&#xff1a;输入偏差读出的被…

控制算法学习 二、PID控制算法

控制算法学习 二、PID控制 前言PID算法比例环节P积分环节I微分环节D 离散PID位置式PID增量式PID 前言 PID应该是应用最广泛的控制算法&#xff08;没有之一&#xff09;。无人机中的飞控就是基于PID的。 PID算法 PID——Proportional, Integral, Derivate&#xff0c;就是比…

PID算法的原理和公式

PID算法的原理和公式 (PID) PID算法原理 P&#xff1a;即Proportion&#xff0c;输入偏差乘以比例常数I&#xff1a;即Integral&#xff0c;对输入偏差进行积分运算D&#xff1a;即Derivative&#xff0c;对输入偏差进行微分运算 输入偏差读取值与设定值&#xff08;理想值&…

【 PID 算法 】PID 算法基础

前言&#xff1a; 这两天打算找个实习&#xff0c;奈何感觉自己有点菜&#xff0c;所以&#xff0c;就补习了一下知识&#xff0c;说一下&#xff0c;这个PID算法吧。 一、简介 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&#…

org.springframework.data.mapping.PropertyReferenceException: No property item found for type BItem!

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property item found for type BItem! 后来发现在Service层 PageRequest.of里排序的参数必须是 实体类字段 希望能帮助到您

5G NR PDSCH、PUSCH资源分配

通信就是把数据承载在特定的时间和频率上&#xff0c;传输到数据接收方&#xff0c;数据接收方在在相应的时间和频率上把数据接收下来。其实&#xff0c;把数据承载在哪个时间和频率上&#xff0c;对应的就是资源分配的过程。我们今天主要讨论5G NR中的资源分配过程。 目录 1…

电动汽车充电桩中的漏电保护应用分析 RCD的分类和选型

一、漏电流的产生分类 一般漏电流分为四种&#xff0c;分别为&#xff1a;半导体元件漏电流、电源漏电流、电容漏电流和滤波器漏电流 1、半导体原件漏电流 PN结在截止时流过的很微小的电流。D-S正向偏置&#xff0c;G-S反向偏置&#xff0c;导电沟道打开后&#xff0c;D到S才…

RuntimeError: expected scalar type Double but found Float

最近在使用 sequitur库 快速搭建自编码器时遇到 RuntimeError: expected scalar type Double but found Float 涉及代码 import torch from sequitur.models import LINEAR_AEmodel LINEAR_AE(input_dim300,encoding_dim20,h_dims[120, 60],h_activNone,out_activNone )mode…