4、电流环(内环)原理

电流环,说白了就是FOC三环控制中最里面那一圈。我刚开始接触FOC时,总觉得位置环才是老大,电流环不过是跑腿的。后来被现实狠狠教育了一顿——电流环要是没调好,外面两环全是空中楼阁。

你想想看,电机输出的扭矩跟什么直接相关?就是电流。位置环和速度环最终都要靠电流环去执行。所以电流环的响应速度、稳态精度,直接决定了整个系统的性能天花板。

电流环到底在干什么?

电流环的任务其实很单纯:让电机绕组中的实际电流,快速准确地跟踪我们给定的目标电流。

在FOC框架下,我们不是在控制三相电流的绝对值,而是控制Id和Iq这两个旋转坐标系下的分量。Id负责励磁,Iq负责扭矩。电流环要做的,就是让实际的Id、Iq紧紧咬住目标值。

核心要点:电流环的带宽通常要设计到速度环的5~10倍以上。我见过不少新手把电流环调得慢吞吞,结果速度环一加速就震荡,还以为是速度环参数有问题——其实根子在电流环。

PI控制器在电流环中的应用

电流环最常用的控制器就是PI(比例-积分)。为什么不用PID?因为微分项对高频噪声太敏感了,而电流采样本身就有不少毛刺。我在一个伺服项目里试过加D项,结果系统抖得跟筛糠似的,最后还是老老实实用了PI。

PI控制器的表达式很简单:

u(t) = Kp * e(t) + Ki * ∫ e(t) dt

但在数字实现时,我们用的是离散形式:

// 位置式PI
error = target - actual;
integral += error * dt;
output = Kp * error + Ki * integral;

// 限幅
if(output > max_output) output = max_output;
if(output < -max_output) output = -max_output;

这里有个坑——积分饱和。当输出被限幅后,积分项还在继续累加,等误差反向时,积分值需要很长时间才能退回来,导致系统超调严重。

我曾经踩过的坑:在一个48V的BLDC项目里,没做积分分离,结果启动时电流超调直接干到2倍,MOS管差点炸了。后来加了抗积分饱和处理,世界清净了。

常用的抗积分饱和方法有两种:

  • 积分分离法:误差超过阈值时,停止积分累加
  • 反计算法:输出限幅时,把超出部分从积分项中减去

我个人习惯用反计算法,实现简单,效果也够用:

output = Kp * error + integral;
output_saturated = saturate(output, -max, max);
integral += Ki * error * dt + Kc * (output_saturated - output);

电流采样与调理电路

PI控制器再牛,也得有准确的反馈信号才行。电流采样是整个电流环的基石,这里出问题,后面全是白搭。

常见的电流采样方式有三种:

采样方式 原理 优点 缺点
采样电阻(Shunt) 在母线上串小电阻测压降 成本低、精度高 有损耗、不隔离
霍尔电流传感器 利用霍尔效应测磁场 隔离、带宽高 成本高、温漂大
电流互感器(CT) 电磁感应原理 隔离、无损耗 低频响应差、体积大

在低压FOC驱动中,采样电阻用得最多。我一般选毫欧级的锰铜电阻,配合差分运放做信号调理。

信号调理电路的关键点

从采样电阻上得到的信号,是几十毫伏级别的微弱信号,而且叠加了很高的共模电压。直接送给ADC?不行的,必须经过调理。

典型的调理电路包含这几步:

  1. 差分放大:用仪表放大器或差分运放,把微弱差模信号放大,同时抑制共模干扰
  2. 电平偏移:因为电流是双向的(正转/反转),信号有正有负。而单片机的ADC只能采0~3.3V,所以要把信号抬升到1.65V中点
  3. 低通滤波:用RC滤波器或二阶有源滤波器,滤掉PWM开关噪声
  4. 钳位保护:加肖特基二极管钳位到电源轨,防止过压烧ADC

一个小技巧:滤波器的截止频率要跟PWM频率和电流环带宽匹配。我一般取PWM频率的1/10到1/20。比如20kHz的PWM,滤波器截止频率设在1~2kHz。太低了会引入相位延迟,影响电流环带宽。

采样时序的讲究

电流采样不是随便什么时候都能采的。在PWM驱动的系统中,MOS管开关瞬间会产生巨大的尖峰干扰。如果正好在那个时刻采样,读回来的数据全是噪声。

正确的做法是:在PWM周期的中间时刻采样。这时候所有开关管都处于稳定导通或关断状态,母线电流最干净。

// 伪代码示例:PWM中点采样
void PWM_ISR() {
    // 等待PWM计数器到达中点
    if(PWM_CNT == PWM_PERIOD/2) {
        // 触发ADC采样
        ADC_StartConversion();
    }
}

void ADC_Complete_ISR() {
    current_raw = ADC_GetValue();
    // 进行偏移校准和增益校准
    current_actual = (current_raw - offset) * gain;
    // 进入电流环PI计算
    CurrentLoop_Calculate();
}

嗯,这里要注意:采样时刻的抖动。如果中断响应不及时,采样点偏移了,电流反馈就会有误差。我习惯用硬件触发ADC,而不是软件触发,这样时序更精准。

电流环的整体结构

把上面这些串起来,电流环的完整流程就是:

  1. ADC采样两相电流(Ia、Ib),第三相通过Ic = -(Ia + Ib)算出
  2. Clarke变换:把三相静止坐标系转到两相静止坐标系(αβ)
  3. Park变换:把αβ坐标系转到旋转坐标系(dq),得到Id_fb、Iq_fb
  4. 分别对Id和Iq做PI控制,得到Vd_ref、Vq_ref
  5. 反Park变换:把Vd、Vq转回αβ坐标系
  6. SVPWM调制:生成六路PWM波驱动MOS管

这一整套流程,必须在几十微秒内跑完。我见过有人用STM32F103跑电流环,10kHz的速率,CPU占用率直接飙到80%。后来换了F4系列,才轻松一些。

电流环完整信号流图 电流采样 Clarke变换 Park变换 PI控制器 反Park变换 SVPWM MOS驱动 电机绕组 Id/Iq反馈 关键说明 虚线为反馈路径:实际电流 → Clarke/Park变换 → 与目标值比较 → PI调节 实线为前向路径:PI输出 → 反Park变换 → SVPWM → MOS管 → 电机

电流环参数整定的一点心得

PI参数的整定,我试过很多方法。理论计算当然有,但实际中往往需要微调。

我的习惯做法是:

  • 先把Ki设成0,只调Kp。从小到大加,直到电流响应开始出现震荡,然后退回80%
  • 再加入Ki,从0开始慢慢加,直到稳态误差消除,但不要引入明显的超调
  • 最后做阶跃响应测试,看上升时间和超调量是否满足要求

对了,电流环的采样频率也很关键。我一般用PWM频率作为电流环的执行频率,比如10kHz的PWM,电流环就跑10kHz。再高的话,CPU扛不住,而且ADC采样也需要时间。

一个实用建议:在调试阶段,把电流环的输出值通过DAC或者串口打印出来,用上位机画成波形。肉眼看到的效果,比看一堆数字直观得多。我习惯用虚拟示波器软件,实时观察Id和Iq的跟踪情况。

电流环是整个FOC系统的基石。这块要是没吃透,后面速度环和位置环调得再好也是白搭。我见过太多人一上来就调速度环,结果怎么调都调不好,最后发现是电流环的反馈信号就有问题——采样电阻焊错了,或者运放供电不对,这种低级错误其实挺常见的。

嗯,电流环的内容就聊到这儿。记住一句话:电流环调好了,FOC就成功了一半。