21-2-17 PID调试——增量式PID

本文详细记录了一次针对增量式PID控制器的速度PID参数调优过程。从无到有逐步增加P和I参数,通过观察电机速度曲线的震荡和收敛情况,采用类似二分法的策略进行调整。在调整过程中,发现参数设置对系统响应速度和稳定性的影响,并注意到空载与负载条件下的不同响应。最终,总结了PID参数调整的经验和方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

21-2-17 PID调试——增量式PID

速度PID

速度PID采用增量式PI控制
源码: 内联代码片

void Motor_Speed_PI(motor_parameter_st *Motorx)
{ 
	(*Motorx).PID_speed.bias = (*Motorx).actual_speed-(*Motorx).target_speed;//计算此次偏差               
	(*Motorx).PWM-=(*Motorx).PID_speed.Kp*((*Motorx).PID_speed.bias-(*Motorx).PID_speed.last_Bias)+(*Motorx).PID_speed.Ki*(*Motorx).PID_speed.bias;			//增量式PI控制器  
	(*Motorx).PID_speed.last_Bias = (*Motorx).PID_speed.bias;//保存上一次偏差	                  
}

调参策论

PID参数调整的口诀:
参数整定找最佳,从小到大顺序查
先是比例后积分,最后再把微分加
曲线振荡很频繁,比例度盘要放大
曲线漂浮绕大湾,比例度盘往小扳
曲线偏离回复慢,积分时间往下降
曲线波动周期长,积分时间再加长
曲线振荡频率快,先把微分降下来
动差大来波动慢。微分时间应加长
理想曲线两个波,前高后低4比1
一看二调多分析,调节质量不会低
转自:https://www.cnblogs.com/agvcfy/p/9467148.html

这个策略适用的是绝对式PID,对于增量式PID来说P对应绝对式中的D,I对应绝对式中的P。

测试数据

根据先绝对式PID调整时的先P后I最后D的原则
P=0;
I=0.25;//估算得
target_speed=300;(mm/s)
可以看到虽然收敛但是反应速度不够快,尝试增大I

P=0;
I=0.4;
target_speed=300;(mm/s)
用类似二分法的思想,直接将I取到0.4,发现速度曲线震荡,无收敛趋势,(0.25+0.4)/2,将I取0.3
P=0;
I=0.3;
target_speed=300;(mm/s)
曲线收敛但还不赶快,继续增加I

P=0;
I=0.35;
target_speed=300;(mm/s)震荡大,但已经有收敛趋势

P=0.4;
I=0.35;
target_speed=300;(mm/s)
在这里插入图片描述加入P后震荡明显被抑制,但反应不够快,增加P

P=0.4;
I=0.35;
target_speed=300;(mm/s)
P设为0.8,曲线开始震荡,无收敛趋势,P超调了。同样二分法思想(0.4+0.8)/2,尝试将P设为0.6

P=0.6;
I=0.35;
target_speed=300;(mm/s)
虽然震荡幅度减小,但震荡依然存在,继续减小P

P=0.5;
I=0.35;
target_speed=300;(mm/s)
P=0.55;
I=0.35;
target_speed=300;(mm/s)在这里插入图片描述P=0.5;
I=0.3;
target_speed=300;(mm/s)P=0.5;
I=0.2;
target_speed=300;(mm/s)
P=0.5;
I=0.1;
target_speed=300;(mm/s)

P=0.55;
I=0.05;
target_speed=300;(mm/s)
在这里插入图片描述P=0.6;
I=0.05;
target_speed=300;(mm/s)
在这里插入图片描述

P=0.6;
I=0.1;
target_speed=300;(mm/s)

在这里插入图片描述
P=0.55;
I=0.1;
target_speed=300;(mm/s)在这里插入图片描述P=0.45;
I=0.1;
target_speed=300;(mm/s)
在这里插入图片描述P=0.4;
I=0.1;
target_speed=300;(mm/s)
在这里插入图片描述P=0.35;
I=0.1;
target_speed=300;(mm/s)在这里插入图片描述P=0.25;
I=0.1;
target_speed=300;(mm/s)

在这里插入图片描述P=0.3;
I=0.1;
target_speed=300;(mm/s)
在这里插入图片描述P=0.27;
I=0.1;
target_speed=300;(mm/s)
在这里插入图片描述P=0.27;
I=0.11;
target_speed=300;(mm/s)
在这里插入图片描述P=0.27;
I=0.09;
target_speed=300;(mm/s)
在这里插入图片描述
P=0.25;
I=0.09;
target_speed=300;(mm/s)在这里插入图片描述P=0.25;
I=0.1;
target_speed=300;(mm/s)

在这里插入图片描述
P=0.25;
I=0.1;
target_speed=500;(mm/s)

在这里插入图片描述快测试完才发现测试的时候电机是空转的,电机在空载和负载情况下的相应曲线并不相同。
所以一切重新再来。。

### 增量式PID控制器参数调整 增量式PID控制器因其特性适合于多种应用场景,在Python中实现该类控制器并对其进行参数调整是一个重要的技能。下面将介绍一种基于误差反馈机制的增量式PID控制器的设计思路以及如何利用Python代码进行参数微调。 #### 控制器设计原则 为了确保系统的稳定性和响应速度,通常会依据具体应用环境下的动态行为特征来设定比例系数\(K_p\)、积分时间常数\(T_i\)(或其倒数——积分增益\(K_i= \frac{K_p}{T_i}\))、微分提前角频率\(\omega_d=\sqrt{\left|\ln(0.5)\right|}/T_s\)(其中Ts为采样周期),进而决定微分增益\(K_d=T_s*\omega_d*K_p\) [^2]。 #### 参数调节方法 对于增量式PID控制系统而言,可以通过观察阶跃响应曲线来进行初步整定: - 如果超调过大,则适当减小\(K_p\); - 若存在稳态误差,则增加\(K_i\)直到消除静差为止; - 当振荡较为明显时,可以尝试增大\(K_d\)以抑制波动; 此外,还可以借助Ziegler-Nichols法则或其他先进的自适应算法来自动生成最优参数组合[^4]。 #### Python示例代码 以下是使用Python编写的一个简单版本的增量式PID控制器及其参数调整逻辑: ```python class Incremental_PID: def __init__(self, P=0.2, I=0.0, D=0.0): self.Kp = P self.Ki = I self.Kd = D self.P_error_last = 0 self.I_error = 0 self.D_error = 0 def update(self,current_value,set_point): error = set_point - current_value P_out = self.Kp * (error-self.P_error_last) self.I_error += error I_out = self.Ki * self.I_error self.D_error = error - self.P_error_last D_out = self.Kd * self.D_error output = P_out + I_out + D_out self.P_error_last = error return output def adjust_pid_params(pid_controller, response_curve): """根据给定的响应曲线调整PID参数""" overshoot_threshold = 0.1 # 设置允许的最大超调百分比 steady_state_error_tolerance = 0.01 # 定义可接受范围内的静态误差 while True: max_overshoot = max(response_curve)-response_curve[-1] final_steady_state_error = abs(setpoint-response_curve[-1]) if max_overshoot > overshoot_threshold*setpoint or \ final_steady_state_error >= steady_state_error_tolerance: pid_controller.Kp *= 0.9 # 减少P值 if final_steady_state_error != 0 and\ all(abs(e)<steady_state_error_tolerance for e in response_curve[-int(len(response_curve)*0.1):]): pid_controller.Ki *= 1.1 # 提高I值 elif any(abs(diff)>oscillation_limit for diff in np.diff(response_curve)): pid_controller.Kd *= 1.1 # 加大D值 else: break # 达到理想效果后退出循环 ``` 此段程序定义了一个名为`Incremental_PID` 的类用于创建增量型PID对象,并提供了一种基本框架去迭代优化这些参数直至满足性能指标的要求。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值