位置-速度双闭环PID控制详解与C语言实现
创作时间:
作者:
@小白创作中心
位置-速度双闭环PID控制详解与C语言实现
引用
CSDN
1.
https://blog.csdn.net/mftang/article/details/145462311
位置-速度双闭环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%。实际使用时需根据具体执行器特性调整参数。
热门推荐
社区卫生服务助力产后妈妈盆底康复
ChatGPT能否拥有自我意识?从技术到哲学的深度思考
《燕云十六声》射覆玩法揭秘:白起篇
如何达到C语言进阶
从1.44亿大奖得主看购彩心态:理性投注,享受过程
从“舞动奇迹”到“舞动星辰”:如何为舞蹈博主取一个吸引人的名字?
平等、契合、利益平衡:构建和谐人际关系的三大法则
20首富有层次感和感染力的经典情歌对唱(歌单推荐)
阿米巴经营模式特点以及优劣势对比分析
昨日A股市场焦点深度解析:板块轮动、解禁冲击与减持新规影响几何?
自媒体运营实战攻略:从平台选择到变现的完整指南
显卡选购指南:如何避免买到矿卡?
写意花鸟画的困境与突破
周末穿搭指南:T恤+牛仔裤+衬衫,轻松变美!
EST观点:福岛核废水入海对全球环境可持续性的影响
本周星座运势:你的正缘长啥样?
2025年再看P30 Pro:是否已跟不上时代步伐?
巴基斯坦盐矿的秘密:喜马拉雅盐灯真的能治愈心灵吗?
科学认识伴侣选择:从性格匹配到自我提升
张明敏爱国之路:春晚走红到为亚运卖房捐款,他的人生不止一首歌
清朝历史上的伟大贡献:灭亡前的辉煌
听这些歌,瞬间好心情!Post Malone & Joji 音乐特辑
神将三国:最强阵容揭秘!
高一期末考试攻略:从学习方法到应试技巧全解析
《蓝精灵之歌》:一首被误认为翻译的中国原创
运用奇门遁甲找回宠物:方向、时辰与吉凶详解
师范不是土木工程,可能比土木还麻烦,你们来说说看!
一文搞定Ollama跨域难题!
王者荣耀单挑人机,快速上分秘籍
提升表达能力:结构性思维表达三要素