三相开绕组永磁同步电机容错控制。

最近在搞三相开绕组永磁同步电机项目,发现这货虽然性能强悍,但绕组开路时真能让人抓狂。传统控制策略一旦遇到绕组故障,整个系统直接躺平给你看。今天就聊聊怎么让电机在断线、短路等突发状况下还能接着干活。

先说说绕组短路这个最要命的故障。我在DSP里加了段实时电流监测代码:
c
void Fault_Check(float Ia, float Ib, float Ic) {
static uint8_t error_count = 0;
if(fabs(Ia) > 1.2*I_rated || fabs(Ib) > 1.2*I_rated || fabs(Ic) > 1.2*I_rated) {
error_count++;
if(error_count > 5) { // 持续5个控制周期
GPIO_WritePin(FAULT_LED, HIGH);
PWM_Disable(); // 紧急关闭PWM
System_FaultHandler(PHASE_OVERLOAD);
}
} else {
error_count = 0;
}
}
这段代码实现的是动态电流阈值判断,注意这里用了1.2倍额定电流作为触发门槛。实际调试中发现,单纯依靠固定阈值容易误触发,后来改成了根据转速自适应的动态阈值。比如高速时允许短时过流,低速时则要更严格。

遇到绕组开路的情况,传统矢量控制直接崩盘。这时候得重构控制算法,玩过电机控制的都知道Clarke变换吧?正常情况是:
matlab
% 传统Clark变换
I_alpha = Ia - 0.5*Ib - 0.5*Ic;
I_beta = (sqrt(3)/2)*Ib - (sqrt(3)/2)*Ic;
当C相开路时,得改成:
matlab
% 容错Clark变换
if phase_fault == 3 % C相故障
I_alpha = (2/sqrt(3))*(Ia*cos(theta) + Ib*cos(theta - 2*pi/3))
I_beta = (2/sqrt(3))*(Ia*sin(theta) + Ib*sin(theta - 2*pi/3))
end
这个改进版的关键在于补偿系数的动态调整。实测发现补偿系数随负载变化需要微调,后来在DSP里做了个在线参数修正模块,用梯度下降法实时优化系数。

三相开绕组永磁同步电机容错控制。

硬件层面也有讲究,我在驱动板上加了双路冗余设计。比如每个桥臂的驱动信号走两路光耦隔离,一路异常立即切换备用通道。PCB布局时特意把故障检测电路放在功率回路旁边,缩短信号路径。有次实验室炸管就是因为检测信号延迟了2us,教训惨痛。

最后说说测试结果,在突卸50%负载时,容错系统能在3ms内完成故障识别和模式切换。不过转矩脉动会从正常的5%飙到15%,这时候需要加入谐波注入补偿。贴段实际在用的谐波注入代码:
c
void Harmonic_Injection(float *Ud, float *Uq) {
if(fault_flag) {
float theta_3rd = 3 * Get_ElcAngle();
*Ud += 0.15 * sin(theta_3rd); // 三次谐波注入
*Uq += 0.1 * cos(theta_3rd);
}
}
这个谐波分量不是随便加的,得根据剩余绕组的空间分布来算。有次手贱把系数调大了一倍,电机直接变按摩器,振得实验台都在抖... 所以说容错控制就是在走钢丝,稍有不慎就翻车。
搞了半年容错控制,最大的感受是:没有完美的容错方案,只有针对特定故障模式的妥协方案。下次准备试试结合神经网络做故障预测,说不定能抢在故障发生前就做好预案。