位置-速度双闭环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%。实际使用时需根据具体执行器特性调整参数。
热门推荐
夏季新能源汽车充电安全指南:7大预防+5大应急要点
生姜食用指南:功效、搭配与禁忌全解析
生姜食用指南:去皮与否有讲究,烂姜不能吃
中国创新力全球排名再创新高,26个科技创新集群居世界第一
HTTP有哪些失败原因?怎么处理?
如果API调用失败,我应该如何排查问题?
赣州五大特色美食:本地人大赞外地人纷纷慕名而来
香蕉草莓苹果:助力孩子健康成长的水果搭档
苹果、香蕉、橙子:助力孩子健康成长的三大水果
育儿神器:香蕉,妹妹最爱的水果
《再别康桥》背后:徐志摩在剑桥的诗意岁月
徐志摩《再别康桥》:现代诗中的剑桥记忆
双十一买钙片别盲目追求进口,这些关键指标才最重要
萘普生止痛有讲究:5类人禁用,10种替代方案可选
专家提醒:正确服用萘普生,这些禁忌和注意事项要知道
萘普生使用指南:剂量、禁忌与常见误区
世界上最古老的东西贸易通道:丝绸之路
真社恐还是假社恐?关键看这三点……
社交恐惧症的全方位解决方案:从心理疏导到行为治疗
如何摆脱人际关系焦虑?——给焦虑人群的心理指南
二极管点亮未来:LED技术的秘密武器
二极管如何改变汽车制造业?
自制米粉,让你秒变美食达人!
桂林米粉的食品安全秘密大揭秘
米粉:从传统主食到健康饮食新宠
南城县:麻姑米种植与米粉加工的完美融合
魏晋南北朝时期的社会经济文化背景
秦汉时期六大战役,为千余年中国封建军事制度的发展历程奠定基础
研究证实:测试比重复更有效,5种方法提升学习效率
一万人中,能有多少人活到80岁?多少岁才算长寿?越长寿越好