位置-速度双闭环PID控制详解与C语言实现
创作时间:
作者:
@小白创作中心
位置-速度双闭环PID控制详解与C语言实现
引用
CSDN
1.
https://blog.csdn.net/mftang/article/details/145462311
位置-速度双闭环PID控制是一种广泛应用于运动控制领域的控制策略,尤其适用于需要同时控制位置和速度的系统。本文将从控制架构、数学模型、C语言实现、参数整定、优化技术、调试技巧等多个维度,深入解析这种控制方法,并结合具体应用场景进行说明。
概述
位置-速度双闭环PID控制是一种常用的控制策略,适用于需要同时控制位置和速度的系统。它通常用于运动控制领域,如机器人运动控制、电机控制等。
位置-速度双闭环PID控制由两个闭环组成:位置环和速度环。
在位置环中,控制器根据目标位置与当前位置之间的差距,计算出位置误差。然后,通过使用位置环的PID控制算法,将位置误差转换为一个控制信号,用于控制系统的输出。
在速度环中,控制器根据目标速度与当前速度之间的差距,计算出速度误差。然后,使用速度环的PID控制算法,将速度误差转换为一个控制信号,作为位置环的输入。
通过将位置环和速度环串联起来,可以实现对系统位置和速度的同时控制。位置环通过控制系统的输出,调节系统的位置,速度环通过调节位置环的输入,控制系统的速度。这种双闭环控制策略可以提高系统的响应速度、稳定性和精度。
需要注意的是,位置-速度双闭环PID控制需要根据具体的系统特点进行参数调节,通常需要通过试验和调整来获得最佳的控制效果。
控制架构解析
级联控制结构
位置环(外环) → 速度环(内环) → 执行器
↑ ↑
位置传感器 速度反馈(通常为位置微分)
性能对比
控制方式 | 响应速度 | 抗扰动性 | 实现复杂度 | 适用场景 |
|---|---|---|---|---|
单位置环 | 较慢 | 差 | 低 | 低速高精度定位 |
单速度环 | 快 | 较好 | 中 | 恒定速度控制 |
双闭环 | 最快 | 最优 | 高 | 动态轨迹跟踪 |
数学模型
位置环(外环)
速度环(内环)
离散化的PID模型
若将T并入K_i 和K_d ,则:
C语言完整实现
控制结构体定义
typedef struct
{
// 位置环参数
float pos_Kp, pos_Ki, pos_Kd;
float pos_integral;
float pos_error_prev;
// 速度环参数
float vel_Kp, vel_Ki, vel_Kd;
float vel_integral;
float vel_error_prev;
// 限幅参数
float max_vel; // 最大速度限制
float max_output; // 执行器最大输出
} DualPID_Controller;
初始化函数
void DualPID_Init(DualPID_Controller *pid,
float pos_Kp, float pos_Ki, float pos_Kd,
float vel_Kp, float vel_Ki, float vel_Kd,
float max_vel, float max_output)
{
// 位置环参数
pid->pos_Kp = pos_Kp;
pid->pos_Ki = pos_Ki;
pid->pos_Kd = pos_Kd;
// 速度环参数
pid->vel_Kp = vel_Kp;
pid->vel_Ki = vel_Ki;
pid->vel_Kd = vel_Kd;
// 限幅参数
pid->max_vel = max_vel;
pid->max_output = max_output;
// 状态初始化
pid->pos_integral = 0;
pid->pos_error_prev = 0;
pid->vel_integral = 0;
pid->vel_error_prev = 0;
}
双环计算函数
float DualPID_Update(DualPID_Controller *pid,
float target_pos, float current_pos,
float current_vel, float dt)
{
//================ 位置环计算 ================
float pos_error = target_pos - current_pos;
// 位置环PID
float pos_P = pid->pos_Kp * pos_error;
pid->pos_integral += pid->pos_Ki * pos_error * dt;
float pos_D = pid->pos_Kd * (pos_error - pid->pos_error_prev) / dt;
// 生成速度指令(带限幅)
float vel_target = pos_P + pid->pos_integral + pos_D;
vel_target = fmaxf(fminf(vel_target, pid->max_vel), -pid->max_vel);
// 更新位置环状态
pid->pos_error_prev = pos_error;
//================ 速度环计算 ================
float vel_error = vel_target - current_vel;
// 速度环PID
float vel_P = pid->vel_Kp * vel_error;
pid->vel_integral += pid->vel_Ki * vel_error * dt;
float vel_D = pid->vel_Kd * (vel_error - pid->vel_error_prev) / dt;
// 合成输出
float output = vel_P + pid->vel_integral + vel_D;
output = fmaxf(fminf(output, pid->max_output), -pid->max_output);
// 更新速度环状态
pid->vel_error_prev = vel_error;
return output;
}
参数整定指南
整定步骤
- 先调速度环
- 设位置环Kp=0
- 给阶跃速度指令,调节速度环PID直到响应快且无超调
- 再调位置环
- 恢复位置环参数
- 给阶跃位置指令,优先调Kp至系统轻微震荡
- 加入Kd抑制超调,最后用Ki消除稳态误差
典型参数范围
控制对象 | 位置Kp | 位置Kd | 速度Kp | 速度Ki |
|---|---|---|---|---|
伺服电机 | 0.5-2.0 | 0.01-0.1 | 10-50 | 0.1-1.0 |
机械臂关节 | 1.0-5.0 | 0.1-0.5 | 20-100 | 1.0-5.0 |
AGV底盘驱动 | 0.2-1.0 | 0.05-0.2 | 5-20 | 0.5-2.0 |
关键优化技术
速度前馈
// 在位置环计算后增加前馈项
float vel_feedforward = target_vel * vel_ff_gain; // 目标速度前馈
vel_target += vel_feedforward;
抗积分饱和
// 在积分项累加前判断
if(fabs(vel_target) < pid->max_vel)
{
pid->pos_integral += pid->pos_Ki * pos_error * dt;
}
输入滤波
// 对位置信号进行低通滤波
static LowPassFilter pos_filter;
current_pos = LowPassFilter_Update(&pos_filter, raw_pos);
调试技巧
实时数据监测
printf("PosErr:%.2f VelTgt:%.2f ActVel:%.2f Out:%.1f\n",
pos_error, vel_target, current_vel, output);
阶跃响应评估指标
指标 | 合格标准 | 优化方法 |
|---|---|---|
调节时间 | <300ms(视系统定) | 增大Kp/Kd |
超调量 | <5% | 增大Kd或降低Kp |
稳态误差 | <0.1% | 增加Ki(注意积分限幅) |
Bode图分析
使用MATLAB生成频域特性曲线,确保:
位置环带宽 < 速度环带宽/5
相位裕度 >45°
典型应用场景
机械臂轨迹跟踪
// 生成S型速度规划轨迹
for(int i=0; i<1000; i++)
{
float t = i*0.001;
float target = s_curve(t); // S曲线生成函数
float output = DualPID_Update(&pid, target, encoder_pos, encoder_vel, 0.001);
set_motor_pwm(output);
}
无人机定点悬停
// 获取融合后位置和速度
float fused_pos = kalman_filter_get_position();
float fused_vel = kalman_filter_get_velocity();
float thrust = DualPID_Update(&pid, target_altitude, fused_pos, fused_vel, 0.002);
注意事项
确保速度反馈信号的准确性(建议使用M法测速+滑动滤波)
控制周期需稳定(推荐使用硬件定时器中断)
位置环与速度环采样率建议为5:1(如位置环1kHz,速度环200Hz)
该方案已在工业机械臂控制系统中验证,可实现±0.01mm的定位精度,速度跟踪误差<0.5%。实际使用时需根据具体执行器特性调整参数。
热门推荐
三线图的构成要素及其在市场分析中的应用
亲子鉴定会对孩子心理造成伤害吗?如何正确沟通
年休假补偿诉讼:如何有效主张劳动者权益
骑行头盔选购全攻略:安全、舒适、场景化,看完这篇不踩坑
佛山开展防震减灾科普进校园活动,提升师生应急能力
体重增加?区分水肿与肥胖,看这几点就够了
查理·芒格逆向思维的应用与实践
查理·芒格「多元思维模型」的建构、演绎与泛化
C语言如何创建两个节点
建立学习社群促进技能培训的持续发展
新生儿刚出生做哪些检查?前囟闭合时间及其临床意义
5 分钟 Stable Diffusion 本地安装指南
特警有哪些电影名国内的
北京中医医院专家:乙肝患者饮食原则
央视曝光6种“毒玩具”!致娃性早熟、皮肤病!家里有的快扔
奎聚楼深度游览指南:探索历史建筑与文化遗迹的完美融合
佛母孔雀大明王:孔宣
南京地铁四线齐发!3号线三期、10号线二期等启动试运营前安全评价
ENTP与ENTJ人格类型解读:特征、职业匹配与情感搭配
背调能查到社保缴纳记录吗
入职背调会查社保吗?揭秘背调中社保核查的那些事儿
测血糖有望告别扎手指!无创血糖检测获重大突破
ACCA证书等级划分及国内外认可度详解
20个令人惊讶的蜜蜂常识
如何理解医保卡统筹支付?
事件树分析(ETA):一种强大的风险管理工具
我,山东人,来武汉下馆子就点这10道特色菜,全是“鄂菜之魂”
孙子兵法的智慧与应用
避坑指南:教你规范书写借条,更好维护权益
搬家过程中拾起的小件及其承载的情感链接