FOC ACIM 无感 磁链观测器 代码 电机控制 观测器滤波角度幅值实时补偿 电流模型计算转差率 转子时间常数在线辩识 交流异步感应电机(ACIM)无感控制方案
在玩转ACIM无感控制的路上,磁链观测器绝对是个让人又爱又恨的角色。今天咱们就来唠唠怎么用电压模型和电流模型搞点事情,顺带手把手撸几段真实项目里能跑的代码。先抛个硬核问题:当电机转速掉到5Hz以下时,电压积分模型为什么突然就拉胯了?这个痛点搞不定,低速稳定性全是空谈。
先看电压模型的C语言实现,这里用了改进的欧拉法做积分抗漂:
void FluxObserver_Update(FluxObserver* obs, float u_alpha, float u_beta, float i_alpha, float i_beta, float Ts) { // 反电动势计算 float e_alpha = u_alpha - RS * i_alpha; float e_beta = u_beta - RS * i_beta; // 带截止频率的积分器 obs->psi_alpha += (e_alpha - obs->wc * obs->psi_alpha) * Ts; obs->psi_beta += (e_beta - obs->wc * obs->psi_beta) * Ts; // 幅值补偿 float psi_mag = sqrtf(obs->psi_alpha*obs->psi_alpha + obs->psi_beta*obs->psi_beta); if(psi_mag > PSI_NOMINAL*1.2f) { obs->psi_alpha *= PSI_NOMINAL / psi_mag; obs->psi_beta *= PSI_NOMINAL / psi_mag; } }这段代码里的wc可不是随便设的,它直接决定了观测器的动态响应。实际调试时有个骚操作:把wc设成与转速相关,当转速低于2Hz时自动增大wc值,相当于给积分器加了动态阻尼。注意第12行的幅值箝位,这是对付直流偏置的土办法,比纯软件滤波来得直接。
转差率计算才是电流模型的精髓所在,看这段神操作:
float CalculateSlip(FluxObserver* obs, float i_q) { float Lr = LM + LRS; // 转子漏感 float Tr = Lr / RR; // 转子时间常数 float isq = i_q * LM / Lr; return isq / (Tr * obs->psi_mag + 1e-6f); // 防除零 }注意最后那个1e-6f的小尾巴,实战中这能避免电机空载时程序崩掉。但这里藏了个坑:当psimag估计不准时,转差率会跟着抽风。所以需要在前端加个磁链观测质量检测,当psimag低于额定值30%时直接冻结转差率计算。
转子时间常数在线辨识才是真功夫,递推最小二乘法走起:
void RLS_Update(RLS_Params* rls, float slip, float i_q, float psi) { float phi = slip * psi; float K = rls->P * phi / (FORGET_FACTOR + phi * rls->P * phi); rls->Tr_hat += K * (i_q - phi * rls->Tr_hat); rls->P = (rls->P - K * phi * rls->P) / FORGET_FACTOR; // 限制辨识范围 if(rls->Tr_hat < TR_MIN) rls->Tr_hat = TR_MIN; if(rls->Tr_hat > TR_MAX) rls->Tr_hat = TR_MAX; }这个遗忘因子FORGET_FACTOR调到0.95-0.99之间效果最佳。注意第9行的参数限幅,实测中转子时间常数变化超过±30%基本就是观测器出问题了,这时候需要触发参数冻结机制。
角度补偿方面有个邪道玩法——在观测角度后边挂个二阶锁相环:
void PLL_Update(PLL* pll, float theta_est, float Ts) { float delta = theta_est - pll->theta_comp; pll->integrator += (pll->Kp * delta + pll->Ki * pll->error_sum) * Ts; pll->theta_comp += (pll->integrator + pll->Kp * delta) * Ts; pll->error_sum += delta * Ts; // 抗积分饱和 if(pll->theta_comp > PI) pll->theta_comp -= 2*PI; if(pll->theta_comp < -PI) pll->theta_comp += 2*PI; }这个锁相环的带宽要设得比转速变化率低一个数量级,否则会引入额外噪声。遇到过有个坑爹案例:调试时忘记限制error_sum的积分量,结果电机反转时角度补偿直接崩了。
最后说下怎么把这些模块串起来。实测中发现磁链观测器输出要经过一个移动平均滤波器再送给角度计算,虽然会增加5ms左右的延迟,但能有效抑制高频抖动。还有个骚操作是把电压模型和电流模型的输出做加权融合,低速时主要用电流模型,高速时切到电压模型,这个切换逻辑要用滞回比较防止震荡。
这套方案在风机水泵上实测效果不错,零速满载启动时转速估计误差能压在±2rpm以内。但要特别注意,当电机温度变化超过50℃时,记得重新标定一次转子电阻参数,否则时间常数辨识会跑偏。毕竟算法不是万能的,物理规律才是永远的老大。