4. 旋转高频注入法:在静止坐标系注入旋转高频电压,提取位置误差信号

好,咱们接着聊转子初始位置检测。前面讲了脉冲注入法,那个方法在静止状态下能测出大致位置。但说实话,精度上差点意思。今天要聊的旋转高频注入法,是我个人在项目中用得最多的一种方法。它精度高,动态响应也不错。

说白了,这个方法的核心思路就是:给电机定子绕组注入一个旋转的高频电压信号,然后从电流响应里把位置信息“挖”出来。你想想看,电机转子是个凸极结构,d轴和q轴的阻抗不一样。这个差异,就是我们的突破口。

4.1 基本原理:为什么旋转高频能提取位置?

咱们先理清一个概念。静止坐标系,就是αβ坐标系。我们在αβ坐标系里注入一个旋转的高频电压矢量:

Uα = V_inj * cos(ω_inj * t)
Uβ = V_inj * sin(ω_inj * t)

这个电压矢量在空间里以ω_inj的角速度旋转。电机转子如果静止不动,那么由于凸极效应,高频电流的响应会包含位置信息。

我在项目中遇到过一个问题:一开始我选的注入频率太高,结果电流采样跟不上,信号全乱了。后来我总结出一个经验——注入频率一般选在500Hz到1kHz之间,具体要看你的PWM开关频率和电流环带宽。

核心公式:

高频电流响应可以分解为:

i_αβ = I_p * e^(j(ω_inj * t)) + I_n * e^(j(-ω_inj * t + 2θ_e))

其中,I_p是正序分量,I_n是负序分量。负序分量里藏着转子位置θ_e。

为什么会这样?因为正序分量只跟平均电感有关,而负序分量跟d轴和q轴的电感差值有关。这个差值,就是凸极效应的体现。

4.2 信号处理流程:从电流到位置误差

嗯,这里要注意。我们拿到高频电流响应后,不能直接用。需要经过几步处理:

  1. 带通滤波:先把基波分量和PWM噪声滤掉,只保留注入频率附近的信号。
  2. 同步坐标系变换:把静止坐标系的高频电流,变换到与注入电压同步旋转的坐标系里。
  3. 提取负序分量:在同步坐标系里,正序分量变成直流,负序分量变成2倍频信号。
  4. 解调位置误差:用外差法把位置误差信号解调出来。

我建议你画个流程图,这样思路更清晰。下面是我自己整理的:

旋转高频注入法信号处理流程 注入旋转高频电压 Uαβ = V_inj * e^(jω_inj*t) 采样高频电流 iα, iβ 带通滤波 中心频率 = ω_inj 同步坐标变换 旋转到 ω_inj 坐标系 提取负序分量 + 解调 得到位置误差信号 ε = sin(2(θ̂ - θ)) 位置误差送入锁相环

4.3 位置误差信号的提取方法

提取位置误差信号,最常用的方法是外差法。我直接给你看代码实现:

// 旋转高频注入法 - 位置误差提取
// 输入:i_alpha, i_beta (经过带通滤波后的高频电流)
// 输入:theta_inj = omega_inj * t (注入角度)
// 输出:epsilon (位置误差信号)

float extract_position_error(float i_alpha, float i_beta, float theta_inj) {
    // 1. 变换到同步旋转坐标系
    float i_d_inj = i_alpha * cos(theta_inj) + i_beta * sin(theta_inj);
    float i_q_inj = -i_alpha * sin(theta_inj) + i_beta * cos(theta_inj);
    
    // 2. 低通滤波,提取负序分量(正序变成直流被滤掉)
    static float i_d_inj_lpf = 0, i_q_inj_lpf = 0;
    float alpha = 0.01f;  // 滤波系数,根据采样频率调整
    i_d_inj_lpf += alpha * (i_d_inj - i_d_inj_lpf);
    i_q_inj_lpf += alpha * (i_q_inj - i_q_inj_lpf);
    
    // 3. 外差法解调位置误差
    // 假设估计位置为 theta_hat
    float epsilon = i_q_inj_lpf * cos(2 * theta_hat) - i_d_inj_lpf * sin(2 * theta_hat);
    
    return epsilon;
}

个人经验:

滤波系数alpha的选择很关键。我一般取0.005到0.02之间。太小了响应慢,太大了噪声多。你可以在调试时先设成0.01,然后根据波形微调。

4.4 锁相环跟踪:让误差收敛到零

得到位置误差信号ε之后,我们需要用锁相环(PLL)来跟踪这个误差,让它收敛到零。PLL的结构很简单:

// 锁相环实现
typedef struct {
    float kp;           // 比例系数
    float ki;           // 积分系数
    float integral;     // 积分项
    float theta_hat;    // 估计位置
    float omega_hat;    // 估计速度
} PLL_TypeDef;

void PLL_Update(PLL_TypeDef *pll, float epsilon) {
    // PI调节器
    pll->omega_hat = pll->kp * epsilon + pll->integral;
    pll->integral += pll->ki * epsilon * dt;
    
    // 积分得到位置
    pll->theta_hat += pll->omega_hat * dt;
    
    // 角度归一化到 [0, 2*pi)
    if (pll->theta_hat > 2 * M_PI) pll->theta_hat -= 2 * M_PI;
    if (pll->theta_hat < 0) pll->theta_hat += 2 * M_PI;
}

当PLL收敛后,θ_hat就是转子初始位置。注意,这里得到的是电角度,如果要换算成机械角度,需要除以极对数。

避坑指南:

我曾经在调试时发现,PLL收敛后位置总是差90度。后来查了半天,发现是坐标变换的符号搞反了。你一定要注意:dq轴的定义方向,不同厂家可能不一样。建议先用仿真验证一下坐标变换的正确性。

4.5 实际应用中的注意事项

旋转高频注入法虽然好用,但有几个坑你得小心:

  • 注入幅值不能太大:太大会产生明显的转矩脉动,甚至让转子动起来。我一般控制在额定电压的5%~10%。
  • 注入频率避开谐振点:每个电机都有机械谐振频率,注入频率要避开它。你可以扫频测试一下。
  • 死区补偿要做好:逆变器的死区效应会产生低频谐波,干扰位置提取。建议加上死区补偿算法。
  • 采样同步:高频电流采样最好跟PWM载波同步,不然会有较大的采样噪声。
参数 推荐范围 我的经验值
注入电压幅值 5% ~ 15% 额定电压 8%
注入频率 500Hz ~ 1.5kHz 800Hz
PLL比例系数 10 ~ 100 50
PLL积分系数 100 ~ 1000 500
带通滤波器Q值 5 ~ 20 10

说实话,旋转高频注入法是我最推荐的一种初始位置检测方法。它不需要额外的硬件,算法也不复杂,精度能做到1度以内。你只要把滤波和PLL的参数调好了,效果非常稳定。

嗯,今天就先聊到这儿。这个方法你可以在仿真里先跑一遍,看看波形对不对。有问题随时找我。


公众号:蓝海资料掘金营,微信deep3321