三环级联控制的理想采样率

根据 深入解析:用 C 语言实现三级级联 PID 控制器 - 阿坦 - 博客园 这篇博客说说理想采样率

三环采样率分配及原因:

控制环 系统带宽 (物理响应) 推荐的 PID 调整频率 (CPU计算) 原因
电流环 $1000 \sim 2000 \text{Hz}$ $10\text{kHz} \sim 20\text{kHz}$ 电气响应极快,电流瞬间就能冲上去,CPU必须每 $50 \sim 100 \mu s$ 就计算一次,否则根本拉不住。
速度环 $100 \sim 500 \text{Hz}$ $2\text{kHz} \sim 5\text{kHz}$ 机械有惯性,比电流慢,所以计算频率可以稍低一点。
位置环 $10 \sim 100 \text{Hz}$ $1\text{kHz}$ 机械运动相对较慢,$1\text{ms}$ 计算一次通常足够了。


实现方式:

  1. 设置一个最高频率的计时器(例如 $10\text{kHz}$)。

  2. 在这个计时器中执行力矩环。

  3. 使用一个计数器,每 10 次执行一次速度环。

  4. 每 100 次执行一次位置环。

三轴多速率级联控制代码实现示例(伪代码)

volatile int g_counter = 0; // 全局计数器

// Timer_0_1ms_ISR: 每 0.1ms 触发一次
void Timer_0_1ms_ISR() {
    // 1. 所有轴的电流环(力矩环)- 必须每周期执行
    // 0.1ms 的电流环是最重要的,且计算量相对较小
    Torque_Update(AXIS1);
    Torque_Update(AXIS2);
    Torque_Update(AXIS3);

    // 2. 速度环调度 - 每 1ms 执行一次
    if (g_counter % 10 == 0) { 
        Velocity_Update(AXIS1);
        Velocity_Update(AXIS2);
        Velocity_Update(AXIS3);
    }
    
    // 3. 位置环调度 - 每 10ms 执行一次
    if (g_counter % 100 == 0) { 
        Position_Update(AXIS1);
        Position_Update(AXIS2);
        Position_Update(AXIS3);
        
        // 当达到最大周期时,重置计数器
        g_counter = 0; 
    }
    
    // 计数器递增
    g_counter++;
}

 

posted @ 2025-12-03 13:52  阿坦  阅读(16)  评论(0)    收藏  举报