1. PMSM参数辨识与初始位置检测
任务目标
在FOC矢量控制投入运行前,需要获取电机本体的电气参数(定子电阻R、d/q轴电感Ld/Lq、永磁磁链ψf)以及转子初始电角度θ0。本案例通过向电机注入特定的电压矢量,利用电流响应完成参数辨识与初始位置检测,为后续电流环PI参数整定和坐标变换提供准确依据。
辨识原理与实施步骤
采用静止脉冲电压法,依次执行以下三个步骤:
- 电阻辨识:向任意方向(取α轴)注入低占空比方波电压,在电流未达到危险值前关断,采样稳态电流平均值Iavg,由R = Udc·D / Iavg计算定子电阻(D为占空比,Udc为母线电压)。
- 电感辨识:在α轴施加单极性脉冲电压,记录电流从0上升至阈值Ith的时间Δt,由L = Udc·Δt / Ith得到α轴电感;再在β轴重复,得到β轴电感。对于表贴式PMSM(Ld≈Lq),两者均值即为相电感;对于内置式,可结合转子锁定位置区分d/q轴电感。
- 磁链与初始位置检测:向α轴正方向注入宽脉冲使转子微动并对齐到α轴,记录编码器零位偏移θoffset;随后向β轴注入脉冲使转子对齐β轴,再次记录偏移。两次偏移之差的理论值为90°电角度,实际检测值用于校正安装偏差。磁链通过短脉冲法获取反电动势系数:在转子静止时施加电压脉冲使电流达到Ip,关断后测量续流阶段的反电动势积分,由ψf = ∫e·dt / Δθ计算(Δθ为转子微动角度,由编码器读取)。
关键完整代码(STM32 HAL库实现)
// 参数辨识主流程(假设ADC、定时器、编码器接口已初始化)
typedef struct {
float R; // 定子电阻 (Ω)
float Ld; // d轴电感 (H)
float Lq; // q轴电感 (H)
float flux; // 永磁磁链 (Wb)
float theta0; // 初始电角度 (rad)
} PMSM_Params;
PMSM_Params params;
float Udc = 24.0f; // 母线电压,需实际采样
// 步骤1:电阻辨识(α轴注入占空比D=0.1的方波,频率1kHz)
float measure_resistance(void) {
float D = 0.1f;
float I_sum = 0;
const int N = 10;
for (int i = 0; i < N; i++) {
HAL_GPIO_WritePin(AH_GPIO_Port, AH_Pin, GPIO_PIN_SET); // 上桥臂导通
HAL_GPIO_WritePin(AL_GPIO_Port, AL_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(BH_GPIO_Port, BH_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(BL_GPIO_Port, BL_Pin, GPIO_PIN_SET); // 下桥臂续流
HAL_Delay(0.5); // 等待电流稳定
I_sum += read_phase_current(); // ADC采样相电流
// 关断PWM,续流
HAL_GPIO_WritePin(AH_GPIO_Port, AH_Pin, GPIO_PIN_RESET);
HAL_Delay(0.5);
}
float I_avg = I_sum / N;
return Udc * D / I_avg;
}
// 步骤2:电感辨识(单脉冲法)
float measure_inductance(uint8_t axis) {
float I_th = 1.0f; // 电流阈值(A)
float L;
// 配置定时器为单脉冲模式,PWM输出到指定轴
if (axis == 0) { // α轴
start_single_pulse(TIM1, CH1, Udc, 0.5f); // 0.5ms最大脉宽限制
} else { // β轴
start_single_pulse(TIM1, CH2, Udc, 0.5f);
}
// 等待电流达到阈值,记录时间(使用定时器捕获或DAC比较中断)
uint32_t t_start = DWT->CYCCNT;
while (read_phase_current() < I_th && (DWT->CYCCNT - t_start) < 500000);
uint32_t t_end = DWT->CYCCNT;
float dt = (t_end - t_start) / (float)HAL_RCC_GetHCLKFreq();
L = Udc * dt / I_th;
// 关断PWM,等待电流衰减
disable_pwm();
HAL_Delay(10);
return L;
}
// 步骤3:磁链与初始位置检测
void detect_flux_and_position(void) {
// 3.1 转子对齐到α轴
apply_voltage_vector(0, 0.3f, 200); // α轴正方向,30%占空比,200ms
params.theta0 = get_encoder_angle(); // 读取编码器电角度
disable_pwm();
HAL_Delay(50);
// 3.2 转子对齐到β轴(验证90°偏移)
apply_voltage_vector(1, 0.3f, 200); // β轴正方向
float theta_beta = get_encoder_angle();
disable_pwm();
float delta = theta_beta - params.theta0;
if (delta < 0) delta += 2*M_PI;
// delta 应接近 π/2,偏差即为安装误差补偿值
// 3.3 磁链测量(短脉冲法)
float I_p = 2.0f; // 脉冲电流幅值
float flux_sum = 0;
apply_voltage_vector(0, 0.5f, 1); // 短脉冲使电流达到I_p
// 关断后测量续流反电动势(通过ADC采样相电压差分)
for (int i = 0; i < 100; i++) {
float e = read_back_emf(); // 采样反电动势
flux_sum += e * 0.0001f; // 100μs采样周期
HAL_Delay(0.1);
}
float theta_move = get_encoder_angle() - params.theta0;
params.flux = flux_sum / theta_move;
}
// 主调用
void PMSM_Parameter_Identification(void) {
params.R = measure_resistance();
float L_alpha = measure_inductance(0);
float L_beta = measure_inductance(1);
params.Ld = params.Lq = (L_alpha + L_beta) / 2.0f; // 表贴式近似
detect_flux_and_position();
// 辨识结果存入全局params供FOC使用
}
运行与验证方法
硬件连接:PMSM电机(建议额定电压24V、额定电流2A以内)、STM32F407控制板、三相逆变桥(IR2104+MOSFET)、电流传感器(ACS712或采样电阻+运放)、增量式编码器(2500线)、24V直流电源。
编译与烧录:使用STM32CubeIDE创建工程,将上述代码加入main.c,初始化ADC(采样相电流)、定时器(生成PWM)、编码器接口(TIM编码器模式)、DWT(用于精确计时)。编译后通过ST-Link烧录。
验证步骤与通过条件:
- 电阻辨识:用万用表实测电机任意两相间电阻Rpp,计算Rexpected = Rpp/2。辨识结果与Rexpected误差<10%即通过。
- 电感辨识:使用LCR表在1kHz下测量相电感Lpp,辨识值应满足|Lid - Lpp/2| / (Lpp/2) < 15%。
- 磁链辨识:反拖电机至额定转速nN(由编码器测得),用示波器测量线反电动势峰值Epk,计算ψf = Epk / (√3·ωe),其中ωe = 2π·nN·p/60(p为极对数)。与辨识值误差<10%即通过。
- 初始位置检测:手动将转子转到已知机械角度(如0°),运行辨识程序,读取θ0,换算为机械角度后与已知值对比,误差<2°电角度即通过。
注意事项:辨识过程中电流不得超过电机额定值的50%,若检测到过流立即关断PWM;电感辨识的脉冲宽度需根据预估电感调整,确保电流在安全范围内达到阈值;磁链测量对噪声敏感,建议多次测量取平均。