高频注入代码 增强滑膜esmo代码 HFI方波高频注入,提 高频注入代码 增强滑膜esmo代码 HFI方波高频注入,提供HFI和esmo详细开发文档。
高频注入这玩意儿在无感电机控制里算是老熟人了,尤其是方波注入方案,实测抗噪声能力比正弦波方案强不少。最近给某款无刷电机做无感控制时,发现传统滑模观测器(ESMO)在超低速时抖得亲妈都不认识,于是试着把HFI和ESMO揉在一起搞了个增强版。
先甩一段HFI注入的核心代码片段:
// 高频方波生成 void HFI_Injection(float* v_alpha, float* v_beta) { static uint8_t hfi_step = 0; const float hfi_amp = 12.0; // 注入幅值 const float phase_shift = PI/6; // 避免与基波同相位 switch(hfi_step % 6) { case 0: *v_alpha += hfi_amp * arm_sin_f32(phase_shift); break; case 1: *v_beta += hfi_amp; break; case 2: *v_alpha -= hfi_amp * arm_sin_f32(phase_shift); break; // ...其他相位注入 } hfi_step++; }这段代码的关键在于交替注入alpha-beta轴的方波信号,实测发现相位偏移设个π/6能有效避开基波分量打架。有个坑要注意:PWM载波频率得是注入频率的整数倍,否则高频响应会糊成一团。
接着看增强型ESMO怎么玩。传统滑模观测器的速度估算容易受高频噪声污染,这里用HFI信号当"探针"来修正观测误差:
// 改进后的滑模观测器 void Enhanced_ESMO(float i_alpha, float i_beta) { static float z_alpha, z_beta; // 滑模面 float k = 50.0; // 滑模增益 float hfi_component = get_HFI_Feedback(); // 获取当前高频响应分量 z_alpha += ( -k * sign(z_alpha - i_alpha) + hfi_component ) * Ts; z_beta += ( -k * sign(z_beta - i_beta) + hfi_component ) * Ts; // 角度计算 est_angle = atan2f(z_beta, z_alpha); }重点在hfi_component这个量,它实际是电流响应里的高频成分。通过带通滤波器提取后(比如用IIR二阶滤波器,中心频率设在注入频率),作为修正项怼进滑模面方程里。实测发现这招能让转速估算的毛刺减少40%左右。
开发文档里有个细节容易被忽略:HFI和ESMO的参数耦合问题。建议先单独调HFI,用频谱仪观察电流响应,确保注入信号的信噪比足够(至少20dB)。然后再调ESMO时,记得把滑模增益k设为自适应形式:
// 自适应滑模增益 if(fabsf(est_speed) < 0.2) { // 低速区 k = 80.0 + 30 * fabsf(est_speed); } else { k = 50.0; // 基速区 }这种分段处理能有效抑制零速附近的抖振。最后提醒,ADC采样时机必须和HFI注入同步,否则会引入相位偏差。用定时器的触发采样模式可以完美解决,具体操作是在PWM中点触发ADC,配合DMA搬运能省下不少CPU开销。
实际测试时拿个吹风机对着电机线猛吹,观测器角度输出还能稳如老狗,这方案就算成了。完整代码里还有磁极初始定位、高频信号解调这些模块,不过那又是另一个故事了。