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 电流响应采样策略
方波注入后,电流响应怎么采?这是个技术活。
我记得第一次做这个实验时,采出来的电流波形乱七八糟,根本看不出规律。后来才发现是采样时刻没选对。
正确的做法是这样的:
- 采样时刻选择:在方波的每个电平稳定段中间采样
- 差分处理:用相邻两次采样的差值,而不是绝对值
- 同步采样:与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,一切正常。
下面这张图展示了脉振高频注入法的整体流程:
最后说一个我踩过的坑:位置观测器的初始值问题。如果初始位置误差超过90度,观测器可能会收敛到相反方向。我的解决办法是:先做一个开环预定位,把转子拉到已知位置,再切换到高频注入。这样能保证收敛方向正确。
实用建议:
实际调试时,我建议先用示波器观察高频电流响应波形。如果响应幅值随转子位置变化明显,说明凸极效应足够强,算法能正常工作。如果响应很弱,可能需要增大注入幅值,或者检查电机是否适合用高频注入法。
好了,脉振高频注入法的核心内容就这些。说白了就是:注入方波、差分采样、PI观测。每一步都有细节,但整体思路并不复杂。动手试试,你会发现它其实挺有意思的。