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 信号处理流程:从电流到位置误差
嗯,这里要注意。我们拿到高频电流响应后,不能直接用。需要经过几步处理:
- 带通滤波:先把基波分量和PWM噪声滤掉,只保留注入频率附近的信号。
- 同步坐标系变换:把静止坐标系的高频电流,变换到与注入电压同步旋转的坐标系里。
- 提取负序分量:在同步坐标系里,正序分量变成直流,负序分量变成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