第08章 三环控制原理

什么是三环控制

三环控制是电机控制中常见的串级控制结构,从内到外依次为:

位置环(外环)
    ↓ 目标速度
速度环(中环)
    ↓ 目标电流
电流环(内环)
    ↓ PWM 输出
电机

三环功能与特点

环输入输出采样频率控制目标带宽
电流环目标电流PWM 占空比10-50 kHz精确跟踪电流最高(最快)
速度环目标速度目标电流1-5 kHz精确跟踪速度中等
位置环目标位置目标速度100-1 kHz精确定位最低(最慢)

带宽比例:电流环 > 速度环 > 位置环(约 10:1)


为什么需要三环

单环控制的局限

图表 代码
mindmap
  root(只用电流控制)
    无法精确控制速度
    无位置反馈
    只适合转矩模式
mindmap
  root(只用电流控制)
    无法精确控制速度
    无位置反馈
    只适合转矩模式
mindmap
  root(只用电流控制)
    无法精确控制速度
    无位置反馈
    只适合转矩模式
mindmap
  root(只用电流控制)
    无法精确控制速度
    无位置反馈
    只适合转矩模式

双环控制的局限

图表 代码
mindmap
  root(电流 + 速度控制)
    速度稳定
    无位置控制
    适合速度模式
mindmap
  root(电流 + 速度控制)
    速度稳定
    无位置控制
    适合速度模式
mindmap
  root(电流 + 速度控制)
    速度稳定
    无位置控制
    适合速度模式
mindmap
  root(电流 + 速度控制)
    速度稳定
    无位置控制
    适合速度模式

三环控制的优势

图表 代码
mindmap
  root(电流 + 速度 + 位置)
    三级协同控制
    响应快且稳定
    抗干扰能力强
    适合伺服应用
mindmap
  root(电流 + 速度 + 位置)
    三级协同控制
    响应快且稳定
    抗干扰能力强
    适合伺服应用
mindmap
  root(电流 + 速度 + 位置)
    三级协同控制
    响应快且稳定
    抗干扰能力强
    适合伺服应用
mindmap
  root(电流 + 速度 + 位置)
    三级协同控制
    响应快且稳定
    抗干扰能力强
    适合伺服应用

三环控制框图

图表 代码
flowchart TD
    A[目标位置 (Pos_ref)] --> B[位置环 (PID)]
    B --> C[目标速度]
    C --> D[速度环 (PID)]
    D --> E[目标电流]
    E --> F[SVPWM/PWM 调制器]
    F --> G[PWM 输出]
    G --> H[电机]
    
    I[位置传感器] --> B
    J[速度传感器] --> D
    K[电流传感器] --> F
    
    style A fill:#e1f5fe
    style B fill:#f3e5f5
    style C fill:#e1f5fe
    style D fill:#f3e5f5
    style E fill:#e1f5fe
    style F fill:#fff3e0
    style G fill:#fce4ec
    style H fill:#e8f5e8
    style I fill:#f1f8e9
    style J fill:#f1f8e9
    style K fill:#f1f8e9
flowchart TD
    A[目标位置 (Pos_ref)] --> B[位置环 (PID)]
    B --> C[目标速度]
    C --> D[速度环 (PID)]
    D --> E[目标电流]
    E --> F[SVPWM/PWM 调制器]
    F --> G[PWM 输出]
    G --> H[电机]
    
    I[位置传感器] --> B
    J[速度传感器] --> D
    K[电流传感器] --> F
    
    style A fill:#e1f5fe
    style B fill:#f3e5f5
    style C fill:#e1f5fe
    style D fill:#f3e5f5
    style E fill:#e1f5fe
    style F fill:#fff3e0
    style G fill:#fce4ec
    style H fill:#e8f5e8
    style I fill:#f1f8e9
    style J fill:#f1f8e9
    style K fill:#f1f8e9
flowchart TD
    A[目标位置 (Pos_ref)] --> B[位置环 (PID)]
    B --> C[目标速度]
    C --> D[速度环 (PID)]
    D --> E[目标电流]
    E --> F[SVPWM/PWM 调制器]
    F --> G[PWM 输出]
    G --> H[电机]
    
    I[位置传感器] --> B
    J[速度传感器] --> D
    K[电流传感器] --> F
    
    style A fill:#e1f5fe
    style B fill:#f3e5f5
    style C fill:#e1f5fe
    style D fill:#f3e5f5
    style E fill:#e1f5fe
    style F fill:#fff3e0
    style G fill:#fce4ec
    style H fill:#e8f5e8
    style I fill:#f1f8e9
    style J fill:#f1f8e9
    style K fill:#f1f8e9
flowchart TD
    A[目标位置 (Pos_ref)] --> B[位置环 (PID)]
    B --> C[目标速度]
    C --> D[速度环 (PID)]
    D --> E[目标电流]
    E --> F[SVPWM/PWM 调制器]
    F --> G[PWM 输出]
    G --> H[电机]
    
    I[位置传感器] --> B
    J[速度传感器] --> D
    K[电流传感器] --> F
    
    style A fill:#e1f5fe
    style B fill:#f3e5f5
    style C fill:#e1f5fe
    style D fill:#f3e5f5
    style E fill:#e1f5fe
    style F fill:#fff3e0
    style G fill:#fce4ec
    style H fill:#e8f5e8
    style I fill:#f1f8e9
    style J fill:#f1f8e9
    style K fill:#f1f8e9

电流环(内环)

功能

精确控制电机相电流,实现期望的转矩。

为什么电流环最重要?

  1. 直接控制转矩:τ = k_t × i_q
  2. 响应最快:决定系统动态性能
  3. 限制电流:保护电机和驱动器
  4. 基础稳定:外环依赖电流环

电流环控制框图

i_ref ───→[PI 控制器]───→ u_ref ──→[SVPWM]───→ PWM
                                              ↓
                                          ┌─────────┐
                                          │三相逆变器│
                                          └─────────┘
                                              ↓
                                          电机
                                              ↓
                                          i_measured ──→
                                              ↑
                                          ┌─────────┤
                                          │电流采样  │
                                          └─────────┘

电流环设计要点

  1. 采样频率高:≥20kHz(电流变化快)
  2. PI 参数整定:
    • Kp:决定带宽
    • Ki:消除稳态误差
  3. 带宽最大化:响应越快越好
  4. 电流限幅:保护硬件

速度环(中环)

功能

控制电机转速,达到期望的速度。

为什么需要速度环?

  1. 速度控制需求:许多应用需要精确速度
  2. 减少负载影响:自动调整应对负载变化
  3. 位置环基础:为位置环提供速度指令

速度环控制框图

ω_ref ───→[PID 控制器]───→ i_q_ref ──→[电流环]
                                          ↓
                                       ω_measured ──→
                                              ↑
                                        ┌─────────┤
                                        │速度估计  │
                                        └─────────┘

速度环设计要点

  1. 采样频率中:1-5kHz
  2. PID 整定:
    • Kp:响应速度
    • Ki:消除稳态误差
    • Kd:减少超调(可选)
  3. 速度估计:
    • 编码器差分
    • 低通滤波
  4. 积分抗饱和:防止积分累积

位置环(外环)

功能

控制电机转子位置,实现精确的角位移。

为什么需要位置环?

  1. 精确定位:机器人、CNC 等需要
  2. 轨迹跟踪:实现复杂运动轨迹
  3. 伺服控制:快速响应位置指令

位置环控制框图

θ_ref ───→[PID 控制器]───→ ω_ref ──→[速度环]
                                          ↓
                                       θ_measured ──→
                                              ↑
                                        ┌─────────┤
                                        │位置传感器 │
                                        └─────────┘

位置环设计要点

  1. 采样频率低:100-1kHz(位置变化慢)
  2. PID 整定:
    • Kp:响应速度(主要)
    • Ki:消除稳态误差(小)
    • Kd:预测控制(常用)
  3. 轨迹规划:平滑的位置指令
  4. 前馈控制:提高响应速度

三环整定顺序

原则:从内到外,先快后慢

1. 电流环整定(最重要)
   └── 断开外环,直接给电流指令
   └── 观察电流响应,调整 PI 参数
   └── 目标:快速、无超调、无振荡

2. 速度环整定
   └── 电流环工作正常
   └── 给速度阶跃,调整 PID 参数
   └── 目标:快速跟踪,无明显超调

3. 位置环整定
   └── 速度环工作正常
   └── 给位置阶跃,调整 PID 参数
   └── 目标:精确定位,无振荡

整定方法

电流环:极点配置法

时间常数:τ = L / R
极点频率:ω_p = 1 / τ
目标带宽:ω_c = 2π × f_c(f_c 为期望截止频率)

Kp = L × ω_c
Ki = R × ω_c

速度环:Ziegler-Nichols 法

1. 设 Ki = 0, Kd = 0
2. 增加 Kp 直到等幅振荡
3. 记录临界 Kp_u 和振荡周期 T_u
4. 计算 PID 参数:
   Kp = 0.6 × Kp_u
   Ki = 1.2 × Kp_u / T_u
   Kd = 0.075 × Kp_u × T_u

位置环:试错法

1. 小 Kp,观察响应
2. 逐渐增大 Kp 到超调
3. 添加 Kd 减少超调
4. 小 Ki 消除稳态误差

三环代码框架 (C++)

// PI 控制器
class PIController {
private:
    float kp, ki, output_min, output_max;
    float integrator;

public:
    PIController(float kp, float ki, float min, float max)
        : kp(kp), ki(ki), output_min(min), output_max(max), integrator(0) {}

    float update(float error, float dt) {
        integrator += error * dt;

        // 抗饱和
        float output = kp * error + ki * integrator;
        if (output > output_max) {
            output = output_max;
            integrator -= error * dt;  // 防止积分饱和
        } else if (output < output_min) {
            output = output_min;
            integrator -= error * dt;
        }

        return output;
    }
};

// PID 控制器
class PIDController {
private:
    float kp, ki, kd, output_min, output_max;
    float integrator, last_error;

public:
    PIDController(float kp, float ki, float kd, float min, float max)
        : kp(kp), ki(ki), kd(kd), output_min(min), output_max(max),
          integrator(0), last_error(0) {}

    float update(float error, float dt) {
        integrator += error * dt;
        float derivative = (error - last_error) / dt;
        last_error = error;

        float output = kp * error + ki * integrator + kd * derivative;

        // 抗饱和
        if (output > output_max) {
            output = output_max;
            integrator -= error * dt;
        } else if (output < output_min) {
            output = output_min;
            integrator -= error * dt;
        }

        return output;
    }
};

// 三环控制器
class ThreeLoopController {
private:
    PIController current_loop;
    PIController speed_loop;
    PIDController position_loop;

    float position_ref, speed_ref, current_ref;
    float position_measured, speed_measured, current_measured;

public:
    ThreeLoopController()
        : current_loop(1.0f, 100.0f, -10.0f, 10.0f),
          speed_loop(0.5f, 10.0f, -5.0f, 5.0f),
          position_loop(2.0f, 0.01f, 0.1f, -3.0f, 3.0f) {}

    // 外环:位置控制
    void update_position(float dt) {
        float position_error = position_ref - position_measured;
        speed_ref = position_loop.update(position_error, dt);
    }

    // 中环:速度控制
    void update_speed(float dt) {
        float speed_error = speed_ref - speed_measured;
        current_ref = speed_loop.update(speed_error, dt);
    }

    // 内环:电流控制
    float update_current(float dt) {
        float current_error = current_ref - current_measured;
        return current_loop.update(current_error, dt);
    }

    // 完整更新(三环)
    float update(float dt) {
        update_position(dt);      // 外环
        update_speed(dt);        // 中环
        return update_current(dt); // 内环
    }
};

常见问题

Q1: 为什么电流环带宽要最高?

答:

  1. 电流变化最快(电感时间常数小)
  2. 内环响应越快,外环控制越稳定
  3. 电流环决定系统最大动态性能

Q2: 积分饱和怎么处理?

答:两种方法

  1. 条件积分:限幅时不积分
  2. 回减法:超限时将积分减去

Q3: 速度环用 PI 还是 PID?

答:

  • PI:常用,速度变化慢,D 不需要
  • PID:需要快速响应时使用 D
  • 推荐先 PI,有需求再加 D

Q4: 位置环的 Kd 有什么作用?

答:

  1. 预测控制:根据误差变化率调整
  2. 减少超调:提前制动
  3. 提高阻尼:类似于弹簧-阻尼系统

参考资源


相关内容

如果这篇文章对你有帮助,欢迎请我喝杯咖啡 ☕
Cygnus Yang 支付宝支付宝
Cygnus Yang 微信微信