2. 电流环设计:PI控制器参数整定、电流采样与滤波、死区补偿策略
电流环是FOC控制的最内环,也是整个系统的基础。说白了,位置环和速度环调得再好,如果电流环响应慢或者有震荡,那上层控制全是白搭。我个人习惯把电流环比作电机的“肌肉反应”——它必须快、准、稳。
这一章我们重点解决三个问题:PI参数怎么调、电流怎么采得准、死区怎么补。嗯,咱们一个一个来。
2.1 PI控制器参数整定——从理论到实战
电流环的PI控制器,传递函数其实很简单:
G(s) = Kp + Ki/s
但参数怎么给?我见过很多新手直接套公式,结果电机嗡嗡响。为什么?因为实际系统有延迟、有采样误差、有死区,纯理论算出来的值往往偏大。
2.1.1 带宽法整定(推荐)
我个人最常用的方法是带宽法。先确定你想要的电流环带宽,比如1kHz,然后反推PI参数。
| 参数 | 公式 | 说明 |
|---|---|---|
| Kp | L × ωc | L为电机相电感,ωc为目标带宽角频率 |
| Ki | R × ωc | R为电机相电阻,ωc = 2π × fc |
举个例子,电机电感L=0.5mH,电阻R=0.1Ω,目标带宽fc=800Hz:
ωc = 2 × 3.14 × 800 = 5026 rad/s
Kp = 0.0005 × 5026 = 2.513
Ki = 0.1 × 5026 = 502.6
注意,这个算出来的是连续域的值。离散化的时候,我习惯用后向差分法:
Ki_discrete = Ki × Ts
其中Ts是电流环控制周期。如果Ts=100μs,那Ki_discrete = 502.6 × 0.0001 = 0.05026。
2.1.2 手动调试步骤
如果你没有电机参数,或者参数不准,那就手动调。我总结了一套“三步法”:
- 先调Kp: Ki设为0,慢慢增大Kp,直到电流响应出现轻微震荡。记下这个值,然后取60%~70%。
- 再加Ki: 保持Kp不变,慢慢增加Ki,直到稳态误差消失。注意,Ki太大会导致超调。
- 微调: 同时微调Kp和Ki,观察阶跃响应。我一般要求上升时间在1~2个控制周期内,超调不超过5%。
2.2 电流采样与滤波——信号链的命门
电流采样不准,PI调得再好也没用。你想想看,控制器拿到的反馈都是错的,输出怎么可能对?
2.2.1 采样方式对比
| 采样方式 | 精度 | 成本 | 适用场景 |
|---|---|---|---|
| 单电阻采样 | 低 | 低 | 低成本、低性能 |
| 双电阻采样 | 中 | 中 | 通用FOC,最常用 |
| 三电阻采样 | 高 | 高 | 高性能、伺服驱动 |
| 霍尔/磁通门 | 最高 | 很高 | 隔离要求高的场合 |
我个人最常用双电阻采样。成本适中,精度够用。但要注意采样时刻——必须在PWM的中间点采样,避开开关噪声。
2.2.2 采样时刻与同步
STM32的定时器可以触发ADC采样。我习惯这样配置:
// 配置TIM1的TRGO事件触发ADC
TIM1->CR2 |= TIM_CR2_MMS_1; // 更新事件作为TRGO
// ADC配置为外部触发
ADC1->CR2 |= ADC_CR2_EXTSEL_3 | ADC_CR2_EXTTRIG;
// 采样时间设置在PWM中心对齐模式的计数器上溢/下溢点
为什么要在中心点采样?因为此时相电流刚好稳定,开关管导通状态已经建立,噪声最小。
2.2.3 滤波策略
采样回来的电流,一定要滤波。但滤波会引入延迟,所以要在“干净”和“快速”之间找平衡。
我常用的三种滤波方式:
- 一阶低通滤波: 最简单,y[n] = α × x[n] + (1-α) × y[n-1]。α取0.1~0.3,延迟约1~3个采样周期。
- 中值滤波: 连续采3~5次,取中间值。抗脉冲干扰效果好,但计算量大一点。
- 卡尔曼滤波: 效果最好,但实现复杂。我只有在高精度伺服项目里才用。
嗯,这里要注意:滤波器的截止频率要远高于电流环带宽。比如电流环带宽1kHz,滤波器截止频率至少10kHz,否则相位滞后会搞乱你的PI控制。
2.3 死区补偿策略——别让死区吃掉你的性能
死区是防止上下桥臂直通的必要手段,但它会带来电流畸变和转矩脉动。我见过一个项目,死区设了3μs,结果电机低速运行时电流波形像锯齿一样,怎么调PI都没用。
2.3.1 死区效应分析
死区导致的实际输出电压与理想电压之间存在误差。这个误差与电流方向有关:
- 电流流入电机(正方向):实际电压比理想值低
- 电流流出电机(负方向):实际电压比理想值高
说白了,死区相当于在电流过零点附近引入了一个“死区电压”,导致电流波形出现平顶和畸变。
2.3.2 补偿方法
我常用的死区补偿方法有两种:
| 方法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 电压前馈补偿 | 根据电流方向,在电压指令上叠加一个补偿量 | 实现简单,计算量小 | 对电流方向检测精度敏感 |
| 脉冲宽度补偿 | 直接调整PWM占空比,抵消死区影响 | 补偿精度高 | 需要精确的死区时间参数 |
我个人偏爱电压前馈补偿法。代码实现大概是这样:
// 死区补偿函数
float deadtime_compensation(float v_ref, float i_phase, float t_dead, float v_bus) {
float v_comp = 0.0f;
float v_dead = (t_dead / T_pwm) * v_bus; // 死区等效电压
if (i_phase > I_THRESHOLD) {
v_comp = v_dead; // 电流正方向,补偿正电压
} else if (i_phase < -I_THRESHOLD) {
v_comp = -v_dead; // 电流负方向,补偿负电压
} else {
// 电流过零区域,线性过渡
v_comp = (i_phase / I_THRESHOLD) * v_dead;
}
return v_ref + v_comp;
}
2.4 本章知识结构
下面这张图总结了电流环设计的核心逻辑,从参数整定到采样滤波再到死区补偿,环环相扣: