在电机控制领域,无传感器FOC(Field Oriented Control)技术一直是工程师们追求的目标。传统FOC方案依赖编码器获取转子位置,而高频注入法通过向电机注入特定信号,实现了真正的无感控制。这次基于STM32F405的实战项目,完美实现了零速带载启动和低速稳定运行,实测500W电机在1N·m负载下启动时间<0.5秒,最低可稳定运行在0.5rpm。
这套方案的核心价值在于:
提示:高频注入方案特别适合需要低速大扭矩的场景,如AGV驱动、工业机械臂等应用,但需要注意电机参数匹配性。
高频注入法的本质是利用电机凸极效应(Saliency Effect)。当向电机定子注入高频电压信号时,由于转子磁路不对称性,会在电流响应中产生包含位置信息的特征分量。具体实现时,我们在α-β坐标系上叠加旋转高频电压:
c复制// 高频注入参数配置(实际工程中的推荐值)
#define HF_INJ_FREQ 5000 // 5kHz注入频率
#define HF_INJ_AMP 0.15f // 电压幅值(标幺值)
void HF_Injection(float *alpha, float *beta) {
static float theta_hfi = 0.0f;
theta_hfi += _2PI * HF_INJ_FREQ * Ts; // Ts为控制周期
*alpha += HF_INJ_AMP * arm_sin_f32(theta_hfi);
*beta += HF_INJ_AMP * arm_cos_f32(theta_hfi);
}
关键参数选择依据:
通过带通滤波器提取电流响应中的高频分量后,采用锁相环(PLL)或观测器算法解算转子位置。工程中常用的是同步解调法:
c复制// 位置估算伪代码
void Get_EstimateAngle(void) {
// 1. 电流采样与变换
Iabc = Get_PhaseCurrents();
Clarke_Transform(Iabc, &Ialpha, &Ibeta);
// 2. 带通滤波
FIR_BandPass(&hfi_alpha, Ialpha);
FIR_BandPass(&hfi_beta, Ibeta);
// 3. 同步解调
Park_Transform(hfi_alpha, hfi_beta, est_angle, &Id_hf, &Iq_hf);
// 4. 角度跟踪
angle_error = atan2f(Iq_hf, Id_hf);
est_angle += PI_Controller(&hfi_pi, angle_error);
}
启动初期,电机处于静止状态,传统观测器无法工作。此时需要:
c复制// 收敛判断实现
#define CONVERGE_THRESH 0.05f // 弧度阈值
#define CONVERGE_COUNT 20 // 连续稳定周期数
uint8_t Check_Convergence(void) {
static float last_angle = 0.0f;
static uint8_t stable_cnt = 0;
float delta = fabsf(est_angle - last_angle);
last_angle = est_angle;
if(delta < CONVERGE_THRESH) {
if(++stable_cnt >= CONVERGE_COUNT) {
return 1;
}
} else {
stable_cnt = 0;
}
return 0;
}
角度收敛后需确定磁极极性(N/S极),采用脉冲电压法:
c复制// 磁极检测实现
#define IPOLAR_THRESHOLD 1000.0f // A/s阈值
void Pole_Detection(void) {
// 正方向施加短脉冲
SVM_Output(0.5f, 0); // 50%占空比
delay_us(200);
SVM_Output(0, 0); // 停止输出
// 检测电流变化率(硬件ADC需支持高速采样)
float Ialpha_rate = (Ialpha_now - Ialpha_prev) / (Ts * 1e-6);
if(Ialpha_rate > IPOLAR_THRESHOLD) {
pole_flag = 1; // N极在前
} else {
pole_flag = -1; // S极在前
}
}
完成前两阶段后进入闭环运行:
c复制// 主控制循环关键代码
while(1) {
// 1. 位置速度估算
if(speed_rpm < HFI_TRANS_SPEED) {
Get_EstimateAngle_HFI(); // 高频注入模式
} else {
Get_EstimateAngle_SMO(); // 滑模观测器模式
}
Speed_Calc();
// 2. 电流环控制
Park_Transform(Id, Iq, est_angle);
PID_Regulate(&pid_id, Id_ref - Id);
PID_Regulate(&pid_iq, Iq_ref - Iq);
Inverse_Park(...);
// 3. 动态注入
if(speed_rpm < HFI_TRANS_SPEED) {
float inj_ratio = 1.0f - speed_rpm/HFI_TRANS_SPEED;
HF_Injection_Adaptive(inj_ratio); // 幅值随速度渐变
}
// 4. SVM输出
SVM_Output(Ualpha, Ubeta);
}
高频注入方案对电流采样要求极高:
典型电路参数:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 采样电阻 | 5mΩ/2W | 功率余量3倍以上 |
| 运放增益 | 20-50倍 | 根据ADC量程调整 |
| 滤波截止频率 | 100kHz-300kHz | 避免相位延迟过大 |
| ADC采样率 | 2MHz以上 | 确保能捕捉高频分量 |
注意:曾因采样电阻走线过长导致系统不稳定,改版后将采样电阻直接焊接在MOSFET源极引脚上,问题立即解决。
根据不同工况动态调整注入参数:
c复制// 自适应注入实现
void HF_Injection_Adaptive(float ratio) {
float amp = HF_INJ_AMP * ratio;
if(amp < 0.05f) amp = 0.05f; // 保持最小注入
*alpha += amp * sinf(theta_hfi);
*beta += amp * cosf(theta_hfi);
}
结合多种判据提高可靠性:
c复制// 堵转检测实现
uint8_t Check_Stall(void) {
static float angle_var = 0.0f;
// 更新角度方差(滑动窗口)
angle_var = 0.9f * angle_var + 0.1f * fabsf(angle_error);
return (Iq > IQ_STALL_THRESH) &&
(angle_var > ANGLE_VAR_THRESH) &&
(fabsf(speed_cmd - speed_fbk) > SPEED_ERR_THRESH);
}
工程中附带的PID自整定脚本原理:
python复制# 自整定脚本核心逻辑(简化版)
def auto_tune():
for Kp in [0.5, 1.0, 2.0]:
set_pid(Kp, 0, 0)
response = get_step_response()
if check_stability(response):
Ku = Kp
Tu = get_oscillation_period(response)
break
# Z-N法计算PID参数
Kp = 0.6 * Ku
Ki = 1.2 * Ku / Tu
Kd = 0.075 * Ku * Tu
return Kp, Ki, Kd
测试条件:500W伺服电机,1N·m负载
| 启动方式 | 成功率 | 时间(s) | 冲击电流(A) |
|---|---|---|---|
| 传统三段式启动 | 85% | 1.2 | 8.7 |
| 高频注入方案 | 99% | 0.45 | 5.2 |
速度阶跃响应测试:
问题:低速时角度抖动明显
问题:磁极识别误判
问题:切换观测器时抖动
凸极率>1.2的电机效果最佳
需测量关键参数:
参数调整优先级:
硬件抽象层适配:
hal_conf.h中的ADC/PWM配置void PWM_Output(float Ualpha, float Ubeta)void Get_PhaseCurrents(float *Iabc)控制器参数调整:
c复制// 用户需修改的参数(在foc_config.h中)
#define MOTOR_Rs 0.5f // 相电阻(Ω)
#define MOTOR_Ld 1.2e-3 // d轴电感(H)
#define MOTOR_Lq 1.8e-3 // q轴电感(H)
#define MOTOR_POLE_PAIRS 4 // 极对数
性能优化方向:
这套方案在多个项目中验证过稳定性,包括医疗设备精密传动和自动化生产线输送系统。对于初次接触高频注入的开发者,建议先用开发板配套的示例电机练手,熟悉各环节信号特征后再移植到实际项目。