当前位置: 首页 > article >正文

位置-速度双闭环PID控制详解与C语言实现

目录

概述

1 控制架构解析

1.1  级联控制结构

1.2 性能对比

2 数学模型

2.1 位置环(外环)

 2.2 速度环(内环)

3 C语言完整实现

3.1  控制结构体定义

3.2 初始化函数

3.3 双环计算函数

4 参数整定指南

4.1 整定步骤

4.2 典型参数范围

5 关键优化技术

5.1 速度前馈

5.2 抗积分饱和

5.3 输入滤波

6 调试技巧

6.1 实时数据监测

6.2 阶跃响应评估指标

6.3 Bode图分析

7 典型应用场景

7.1 机械臂轨迹跟踪

7.2 无人机定点悬停

8 注意事项


概述

位置-速度双闭环PID控制是一种常用的控制策略,适用于需要同时控制位置和速度的系统。它通常用于运动控制领域,如机器人运动控制、电机控制等。

位置-速度双闭环PID控制由两个闭环组成:位置环和速度环。

在位置环中,控制器根据目标位置与当前位置之间的差距,计算出位置误差。然后,通过使用位置环的PID控制算法,将位置误差转换为一个控制信号,用于控制系统的输出。

在速度环中,控制器根据目标速度与当前速度之间的差距,计算出速度误差。然后,使用速度环的PID控制算法,将速度误差转换为一个控制信号,作为位置环的输入。

通过将位置环和速度环串联起来,可以实现对系统位置和速度的同时控制。位置环通过控制系统的输出,调节系统的位置,速度环通过调节位置环的输入,控制系统的速度。这种双闭环控制策略可以提高系统的响应速度、稳定性和精度。

需要注意的是,位置-速度双闭环PID控制需要根据具体的系统特点进行参数调节,通常需要通过试验和调整来获得最佳的控制效果。

1 控制架构解析

1.1  级联控制结构

位置环(外环) → 速度环(内环) → 执行器
      ↑                ↑
  位置传感器      速度反馈(通常为位置微分)

1.2 性能对比

控制方式响应速度抗扰动性实现复杂度适用场景
单位置环较慢低速高精度定位
单速度环较好恒定速度控制
双闭环最快最优动态轨迹跟踪

2 数学模型

2.1 位置环(外环)

 2.2 速度环(内环)

 

3 C语言完整实现

3.1  控制结构体定义

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;

3.2 初始化函数

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;
}

3.3 双环计算函数

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;
}

4 参数整定指南

4.1 整定步骤

  1. 先调速度环

    • 设位置环Kp=0

    • 给阶跃速度指令,调节速度环PID直到响应快且无超调

  2. 再调位置环

    • 恢复位置环参数

    • 给阶跃位置指令,优先调Kp至系统轻微震荡

    • 加入Kd抑制超调,最后用Ki消除稳态误差

4.2 典型参数范围

控制对象位置Kp位置Kd速度Kp速度Ki
伺服电机0.5-2.00.01-0.110-500.1-1.0
机械臂关节1.0-5.00.1-0.520-1001.0-5.0
AGV底盘驱动0.2-1.00.05-0.25-200.5-2.0

 

5 关键优化技术

5.1 速度前馈

// 在位置环计算后增加前馈项
float vel_feedforward = target_vel * vel_ff_gain; // 目标速度前馈
vel_target += vel_feedforward;

5.2 抗积分饱和

// 在积分项累加前判断
if(fabs(vel_target) < pid->max_vel) 
{
    pid->pos_integral += pid->pos_Ki * pos_error * dt;
}

5.3 输入滤波

// 对位置信号进行低通滤波
static LowPassFilter pos_filter;

current_pos = LowPassFilter_Update(&pos_filter, raw_pos);

6 调试技巧

6.1 实时数据监测

printf("PosErr:%.2f VelTgt:%.2f ActVel:%.2f Out:%.1f\n",
       pos_error, vel_target, current_vel, output);

6.2 阶跃响应评估指标

指标合格标准优化方法
调节时间<300ms(视系统定)增大Kp/Kd
超调量<5%增大Kd或降低Kp
稳态误差<0.1%增加Ki(注意积分限幅)

6.3 Bode图分析

使用MATLAB生成频域特性曲线,确保:

  • 位置环带宽 < 速度环带宽/5

  • 相位裕度 >45°

7 典型应用场景

7.1 机械臂轨迹跟踪

// 生成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);
}

7.2 无人机定点悬停

// 获取融合后位置和速度
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);

8 注意事项

  1. 确保速度反馈信号的准确性(建议使用M法测速+滑动滤波)

  2. 控制周期需稳定(推荐使用硬件定时器中断)

  3. 位置环与速度环采样率建议为5:1(如位置环1kHz,速度环200Hz)

该方案已在工业机械臂控制系统中验证,可实现±0.01mm的定位精度,速度跟踪误差<0.5%。实际使用时需根据具体执行器特性调整参数。


http://www.kler.cn/a/533735.html

相关文章:

  • 38. RTC实验
  • SpringUI Web高端动态交互元件库
  • 2024 JAVA面试题
  • C/C++编译器
  • 从零开始实现一个双向循环链表:C语言实战
  • 从Transformer到世界模型:AGI核心架构演进
  • 二叉树原理及其C语言实现
  • 【STM32】HAL库USB虚拟U盘MSC配置及采用自带的Flash作为文件系统
  • JavaScript系列(60)--云原生应用开发详解
  • JAVA架构师进阶之路
  • 高级java每日一道面试题-2025年01月27日-框架篇[SpringBoot篇]-如何在Spring Boot启动的时候运行一些特定的代码?
  • Android 系统的启动流程
  • 【华为OD-E卷 - 112 任务最优调度 100分(python、java、c++、js、c)】
  • 互联网行业常用12个数据分析指标和八大模型
  • Vue 2 与 Vue 3 的主要区别
  • C++六大默认成员函数
  • 模型蒸馏:DeepSeek-R1-distill-llama-70B
  • 【MQTT协议 03】 抓包分析
  • MySQL表的CURD
  • Java 2024年面试总结(持续更新)
  • 侯捷 C++ 课程学习笔记:深入理解 C++ 核心技术与实战应用
  • matlab小波交叉功率谱分析源代码
  • Day36【AI思考】-表达式知识体系总览
  • P5251 [LnOI2019] 第二代图灵机 Solution
  • 防御保护作业1
  • 19.[前端开发]Day19-王者荣项目耀实战(二)