PID双环控制(速度环和位置环)

文章介绍了PID双环控制的实现步骤,包括位置环作为外环、速度环作为内环的设计,强调了在外环PID计算对内环目标值的影响,以及在定时器中断中进行PID计算和速度限幅的过程。通过这种方式,超调现象得以改善,控制系统性能提升。

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


请添加图片描述
位置环做为外环,速度环作为内环。
可以看到外环的输出值作为内环的目标值,外环计算一次pid,我们根据pid公式可以知道,当离位置目标越来越近时,第一个误差(外环误差)就越来越小,以至于输出的内环目标值就越来越小,所以最终达到的效果就是,离目标值越近,速度越小。(理想情况下,要调节好pid参数,不然系统也会崩溃)
注意:双环控制的时候,外环PID参数调节幅度不要太大,这对于整个曲线的影响很大

PID双环控制的前期准备

代码实现步骤

请添加图片描述
PID初始化,因为用到两个环,所以要两个环的PID参数都初始化
请添加图片描述
设定目标值,我直接在pid初始化里设置了,只要设置外环的,内环的不用设置,因为内环的目标值,就是外环的输出值。

也通过按键设置
请添加图片描述

PID双环控制
在定时器中断(1ms)里,每50ms计算一次当前编码器的总计数值,并通过这个值进行外环PID(位置环)计算,得到目标速度,要经过速度限幅(防止速度过快),然后存放到g_motor_data.motor_pwm变量(临时存放而已),根据目标速度,再进行速度环PID计算,最终得出要输出的pwm比较值,存放g_motor_data.motor_pwm变量(最终存放),然后再限制pwm比较值输出
请添加图片描述

效果图

请添加图片描述
可以发现超调明显消失,效果比位置单环pid好。

### 位置速度双环 PID 参数调整方法及技巧 对于位置速度双环 PID 的参数调整,通常采用分步调试的方式。以下是具体的调整策略: #### 方法概述 在位置速度双环控制系统中,速度环作为内环负责快速响应动态变化,而位置环作为外环用于实现精确的位置跟踪。因此,在参数整定过程中遵循 **先内环后外环** 的原则是非常重要的[^1]。 #### 调参步骤详解 ##### 1. 内环(速度环)的调节 - 首先独立测试速度环的效果,确保其能够稳定运行并达到预期性能。 - 增大速度环的比例增益 \( K_p \),直到系统开始出现轻微振荡为止。记录下临界比例增益值,并将其设置为该值的 70%-90%,以获得较好的稳定性[^4]。 - 如果发现噪声干扰较大,可以考虑加入低通滤波器来平滑信号输入。 ```python def speed_pid(Kp, Ki, Kd, error): integral += error * dt derivative = (error - last_error) / dt output = Kp * error + Ki * integral + Kd * derivative last_error = error return output ``` ##### 2. 外环(位置环)的调节 - 在完成速度环的初步优化之后,将整个闭环结构扩展至包含位置环的部分。 - 类似于速度环的操作流程,逐步增加位置环中的比例系数 \( K_p \),观察系统的阶跃响应特性是否满足设计需求。 - 接着引入积分项 \( K_i \),消除稳态误差;随后适当配置微分项 \( K_d \),提升抗扰动能力以及改善瞬态表现。 ##### 3. 整体联调 - 当内外两层回路各自基本达标以后,需重新审视全局行为特征,必要时对先前设定好的某些局部参数做细微修正以便达成更优的整体指标平衡状态。 #### 技巧总结 - 使用 Ziegler-Nichols 法或其他经典经验法则作为初始参考点,后续通过实验迭代寻找最佳组合方案。 - 利用仿真工具辅助分析复杂场景下的交互影响关系,从而加快开发周期降低实际硬件试验风险成本。 - 记录每次修改后的具体数值及其对应的表现情况形成数据库积累长期经验值供未来项目借鉴使用。 ```matlab function out = position_speed_control(desired_position, current_position, velocity_feedback) % Position loop calculation pos_error = desired_position - current_position; u_pos = pid_controller(pos_Kp, pos_Ki, pos_Kd, pos_error); % Velocity command from position controller vel_command = u_pos; % Speed loop calculation with filtered feedback filt_vel_fb = low_pass_filter(velocity_feedback); spd_error = vel_command - filt_vel_fb; u_spd = pid_controller(spd_Kp, spd_Ki, spd_Kd, spd_error); out = u_spd; % Motor control signal end ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值