三环级联控制的理想采样率
根据 深入解析:用 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}$ 计算一次通常足够了。 |
实现方式:
-
设置一个最高频率的计时器(例如 $10\text{kHz}$)。
-
在这个计时器中执行力矩环。
-
使用一个计数器,每 10 次执行一次速度环。
-
每 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++; }

浙公网安备 33010602011771号