基于C语言的车载电机FOC控制:实现新能源汽车电驱的高效矢量控制
车载电驱FOC不是把三相正弦波直接灌进去,而是把定子电流分解到随转子同步旋转的d/q轴:d轴管磁通、q轴管转矩,PI对直流量闭环,输出再反变换回三相PWM。 新能源车PMSM电驱通常10~20kHz电流环中断里跑完一帧。
一、中断主循环骨架
PWM更新中断(或ADC转换完成中断)里按顺序执行,别在main里轮询:
void FOC_CurrentISR(void)
{
/* 1. 电流采样:双电阻方案算第三相 */
float ia = ADC_GetPhaseA(); /* 已减零点偏移 */
float ib = ADC_GetPhaseB();
float ic = -ia - ib; /* Ia+Ib+Ic=0 */
/* 2. Clarke:三相->αβ */
float ial = ia;
float ibe = (ia + 2.0f*ib)*0.57735027f; /* 1/√3 */
/* 3. Park:αβ->dq,theta为电角度 */
float c = cosf(theta), s = sinf(theta);
float id = ial*c + ibe*s;
float iq = -ial*s + ibe*c;
/* 4. 电流环PI(d轴通常给0) */
float vd = PI_Calc(&pi_d, id_ref, id);
float vq = PI_Calc(&pi_q, iq_ref, iq);
vd = clamp(vd, -VMAX, VMAX);
vq = clamp(vq, -VMAX, VMAX);
/* 5. 反Park */
float va = vd*c - vq*s;
float vb = vd*s + vq*c;
/* 6. SVPWM -> 占空比 */
SVPWM_Gen(va, vb, vbus, &ta, &tb, &tc);
PWM_Update(ta, tb, tc);
}
速度环不进这个ISR,单独1kHz左右任务跑,输出iq_ref给电流环; 电流环带宽是速度环10倍左右才稳。
二、采样时机比对更重要
FOC最容易被忽视的是ADC触发点:必须在PWM中心对齐、下桥导通时段采相电流,否则读到的是斩波毛刺。 做法是用高级定时器TRGO触发ADC,DMA搬数据,ISR里只取结果。
双电阻/三电阻低端采样:中心对齐触发
相线霍尔采样:可任意点,但要差分隔离
运放零点偏移上电标定一次,存NvM或RAM
第三相用-ia-ib推算,前提三相平衡,缺相时不信任
三、角度来源与偏移校准
theta = 机械角 × 极对数 + offset。车载主驱多用旋变(Resolver)或绝对值编码器,无感方案用滑模观测器只适合辅助/泵类。
上电做一次对齐:给d轴小电流把转子吸到已知位置,记下编码器读数作为offset,否则Park轴偏了→转矩抖动甚至反转。
四、PI限幅与抗饱和
电流环输出是电压指令,必须限幅到线性调制区(≈ vbus/√3)。PI内部加抗饱和:
float PI_Calc(pi_t*p, float ref, float fb){
float e = ref - fb;
p->i += p->ki * e * DT;
if(p->i > p->ilim) p->i = p->ilim;
if(p->i < -p->ilim) p->i = -p->ilim; /* 抗饱和 */
return p->kp*e + p->i;
}
不冻积分项,弱磁切回时积分累计会让电流冲过IGBT额定值。
五、弱磁与MTPA(基速以上)
基速内id_ref=0;超过基速反电动势吃满母线电压,要给负id弱磁:
if(speed > base_speed)
id_ref = weak_field(speed, vbus); /* 负值,按电压裕量反算 */
内嵌式PMSM还做MTPA,id/iq按Ld≠Lq分配;表贴机Ld≈Lq,直接iq出扭矩即可。
六、车载保护不能省
硬件过流:比较器直接拉PWM故障脚关输出,不走软件
死区时间:互补PWM必加200~500ns,防上下桥直通
母线过压/欠压:过压进主动回馈限制,欠压禁扭矩输出
过温降额:IGBT/SiC结温超阈值按比例砍iq_ref
失步检测:iq实际值长期跟不上参考→报故障降转矩
看门狗:FOC任务喂狗,算法卡死自动安全关断
故障态统一走安全状态机:先清零iq_ref→封PWM→拉低使能,别在中断里做复杂处理。
七、调试顺序
台架别一上来就闭环:
开环转动确认相序、转向
电流采样标定零点
只跑电流环,给固定iq_ref整定Kp/Ki
速度环接入,带宽调到电流环1/5~1/10
弱磁参数在基速以上单独标
过流/过温/失步注入测试
参数随温度漂移,电阻随温升变大,量产车要做参数辨识或在线校正。
按“PWM同步采样→Clarke/Park解耦→dq双PI→反Park→SVPWM→硬件保护”这条链写,C层代码本身不复杂,复杂的是采样对齐、角度校准、限幅抗饱和和故障降级。车规电驱和玩具电机差别就在这层容错:台架能转不算完,低速抖动、高速弱磁、过流关断、低温启动都稳才是可量产FOC。





