4、脉振高频注入法:脉振方波注入原理、电流响应采样策略、位置观测器设计

各位做电机控制的朋友,咱们今天聊聊脉振高频注入法。说实话,这是我在无感FOC项目里用得最多的方法之一。它不像旋转高频注入那么复杂,实现起来相对直接,但坑也不少。

我个人习惯把脉振高频注入法分成三个部分来理解:注入什么信号、怎么采响应、如何解位置。咱们一个一个说。

4.1 脉振方波注入原理

先问个问题:为什么要用方波,而不是正弦波?

你想想看,方波的好处很明显——它只有两个电平状态,正和负。这意味着你可以在一个PWM周期内完成注入和采样,不需要像正弦波那样等一个完整的周期。说白了,就是快。

我在项目中遇到过一个问题:用正弦波注入时,为了滤除高频分量,低通滤波器的截止频率必须设得很低,结果带宽受限,动态响应跟不上。换成方波后,这个问题迎刃而解。

脉振方波注入的原理是这样的:

  • 在估计的d轴上注入高频方波电压
  • 方波频率通常为PWM频率的一半或1/4
  • 幅值一般取5%~15%的母线电压
  • 注入方向:只在估计d轴,q轴不注入

核心公式:

注入电压:Vdh = Vinj · sign(sin(ωht))

其中Vinj是注入幅值,ωh是注入角频率

嗯,这里要注意:方波注入的频率不能太高,否则电流环响应不过来。我一般取500Hz~2kHz之间,具体看你的PWM频率和电流环带宽。

4.2 电流响应采样策略

方波注入后,电流响应怎么采?这是个技术活。

我记得第一次做这个实验时,采出来的电流波形乱七八糟,根本看不出规律。后来才发现是采样时刻没选对。

正确的做法是这样的:

  1. 采样时刻选择:在方波的每个电平稳定段中间采样
  2. 差分处理:用相邻两次采样的差值,而不是绝对值
  3. 同步采样:与PWM载波同步,避免开关噪声

具体来说,我习惯在每个PWM周期的中心点采样一次电流。这样刚好避开开关管的开通和关断瞬间,噪声最小。

我的经验:

采样窗口宽度建议控制在2~3μs以内。太宽了容易采到开关噪声,太窄了ADC建立时间不够。我曾经因为采样窗口设得太窄,导致ADC采样值不稳定,折腾了两天才找到原因。

电流响应的处理流程:

// 伪代码示例:电流响应采样与处理
void HFI_CurrentSample(void)
{
    // 1. 等待PWM中心点触发
    while(!PWM_CenterFlag);
    
    // 2. 采样三相电流
    i_a = ADC_GetValue(CH_A);
    i_b = ADC_GetValue(CH_B);
    i_c = ADC_GetValue(CH_C);
    
    // 3. Clarke变换到αβ轴
    i_alpha = i_a;
    i_beta = (i_a + 2*i_b) / sqrt(3);
    
    // 4. 变换到估计dq轴
    i_d_est = i_alpha*cos(theta_est) + i_beta*sin(theta_est);
    i_q_est = -i_alpha*sin(theta_est) + i_beta*cos(theta_est);
    
    // 5. 提取高频响应(差分处理)
    delta_i_d = i_d_est - i_d_prev;
    i_d_prev = i_d_est;
}

避坑指南:

我曾经犯过一个错误:直接用采到的电流值做位置解算,结果发现位置估计一直在漂。后来才意识到,电流里包含基波分量和高频分量,必须把基波滤掉。差分处理本质上就是一个高通滤波器,能有效去除基波分量。

4.3 位置观测器设计

好了,现在我们有高频电流响应了。怎么从中提取转子位置?

这里要用到一个关键概念:凸极效应。说白了,就是电机d轴和q轴的阻抗不一样。对于内置式永磁同步电机(IPMSM),d轴电感小于q轴电感。这个差异就是我们提取位置的依据。

位置观测器的核心逻辑:

  • 当估计d轴与实际d轴重合时,高频电流响应最小
  • 当估计d轴偏离实际d轴时,高频电流响应增大
  • 偏离方向不同,响应符号也不同

我常用的位置观测器结构是这样的:

// 位置观测器实现
typedef struct {
    float Kp;           // 比例增益
    float Ki;           // 积分增益
    float theta_est;    // 估计位置
    float omega_est;    // 估计速度
    float integral;     // 积分项
} PositionObserver;

void PositionObserver_Update(PositionObserver *obs, float delta_i_d)
{
    // 1. 误差信号:高频电流响应乘以注入方波的符号
    float error = delta_i_d * sign(inj_signal);
    
    // 2. PI调节器
    obs->integral += obs->Ki * error * dt;
    float output = obs->Kp * error + obs->integral;
    
    // 3. 更新速度和位置
    obs->omega_est = output;
    obs->theta_est += obs->omega_est * dt;
    
    // 4. 角度归一化到0~2π
    if(obs->theta_est > 2*PI) obs->theta_est -= 2*PI;
    if(obs->theta_est < 0) obs->theta_est += 2*PI;
}

关键参数整定:

参数 作用 整定方法
Kp 决定收敛速度 先设小,逐步增大直到出现振荡
Ki 消除稳态误差 Kp的1/10~1/5作为初始值
注入幅值 影响信噪比 从5%开始,不够再加
注入频率 影响带宽 PWM频率的1/8~1/4

我个人的经验是:Kp不要设太大,否则位置估计会抖动。有一次我把Kp设成了0.5,结果电机在低速时位置估计来回跳,差点以为算法有问题。后来降到0.05,一切正常。

下面这张图展示了脉振高频注入法的整体流程:

脉振高频注入法整体流程图 方波电压生成 Vdh = Vinj · sign(sin(ωh·t)) 注入到估计d轴 Vd_est = Vdc + Vdh 电机电流响应 包含高频分量 电流采样与变换 ABC → αβ → dq 差分提取高频响应 Δid = id_est - id_prev 位置观测器 误差 = Δid · sign(注入信号) PI调节 → 速度 → 位置 位置/速度输出 θ_est, ω_est 反馈到坐标变换

最后说一个我踩过的坑:位置观测器的初始值问题。如果初始位置误差超过90度,观测器可能会收敛到相反方向。我的解决办法是:先做一个开环预定位,把转子拉到已知位置,再切换到高频注入。这样能保证收敛方向正确。

实用建议:

实际调试时,我建议先用示波器观察高频电流响应波形。如果响应幅值随转子位置变化明显,说明凸极效应足够强,算法能正常工作。如果响应很弱,可能需要增大注入幅值,或者检查电机是否适合用高频注入法。

好了,脉振高频注入法的核心内容就这些。说白了就是:注入方波、差分采样、PI观测。每一步都有细节,但整体思路并不复杂。动手试试,你会发现它其实挺有意思的。


专注资料整理