补充02PID_Control
[PID控制算法以及代码实现]
作者
[机智流硬件] [冷小莫]
日期
[2024-12]
摘要
•
PID控制算法是工业自动化中最常用的控制算法之一。
•
PID通过计算当前输出与期望输出之间的误差,并根据该误差的比例(P)、积分(I)和微分(D)来调整控制输入,从而实现对系统的精确控制。
工作原理
PID控制器通过以下三个基本组件来计算控制输入:
•
比例(P):直接对误差进行比例放大,可以迅速减少误差,但可能导致系统不稳定。
•
积分(I):对误差进行积分,可以消除系统的静态误差,但可能导致系统响应变慢。
•
微分(D):对误差的导数进行预测,可以预测误差的变化趋势,从而提前进行调整,提高系统的响应速度和稳定性。
•
e(t) 是当前误差,即期望输出与实际输出之间的差值。
•
K_p 是比例系数。
•
K_i 是积分系数。
•
K_d 是微分系数。
•
实现步骤
•
计算误差:计算当前输出与期望输出之间的误差。
比例项:根据比例系数和误差计算比例项。
积分项:对误差进行积分,并根据积分系数计算积分项。
微分项:计算误差的导数,并根据微分系数计算微分项。
计算控制输入:将比例项、积分项和微分项相加,得到控制输入。
应用控制输入:将控制输入应用于被控系统。
整体公式:

示例代码(Python)
以下是一个简单的PID控制算法的Python实现示例:
详细描述你的研究方法、实验设计、数据收集和分析过程。确保方法部分清晰、准确,以便其他研究人员能够重现你的实验结果。
(此处使用的是位置PID,增量式PID等可以根据实际情况进行修改,下面会进行详细说明)
代码块
Plain Text
class PID:
# pid的初始化赋值
def __init__(self, Kp, Ki, Kd, setpoint=0, sample_time=0.01):
self.Kp = Kp
self.Ki = Ki
self.Kd = Kd
self.setpoint = setpoint
self.sample_time = sample_time
self.prev_error = 0
self.integral = 0
# pid的cal_process
def update(self, measured_value):
error = self.setpoint - measured_value # 计算误差
示例代码(C语言)
代码块
Plain Text
void pid_init(pid_type_def *pid,uint8_t mode,float max_output,float max_iout,const float PID[3])
经验分享
•
一般情况下,我们是通过波形图的稳定以及响应来判定PID算法的效果的。
•
一般情况下,我们可以先设置一个较大的比例系数,然后逐渐减小比例系数,直到系统的响应变得平滑。
•
积分项的作用是消除系统的静态误差,但是积分项的引入会使系统的响应变慢。
•
微分项的作用是预测误差的变化趋势,从而提前进行调整,提高系统的响应速度和稳定性。
举例分析(MatLab-Simulink)
•
这是当P是10,I是0.001,D是0.01的时候matlab的simulink仿真图以及他的效果图,采样周期T是200.
•
说明存在稳态误差,这个时候要增加i,使得不存在稳态误差
•
增加I的数值以后,发现超调,准备增加D
•
最好的效果如下
优化以及其他情况的PID计算
有一个口诀分享给大家
代码块
Plain Text
参数整定找最佳, 从小到大顺序查。
先是比例后积分, 最后再把微分加。
曲线振荡很频繁, 比例度盘要放大。
曲线漂浮绕大弯, 比例度盘往小扳。
曲线偏离回复慢, 积分时间往下降。
附加
•
一般来说,位置PID控制算法可以稳定大部分的控制,但是根据不同的应用情景,也有不同的优化算法
•
1. 积分分离PID
•
2. 变速积分的PID控制
•
3. 不完全微分PID控制