1. PMSM参数辨识与初始位置检测

任务目标

在FOC矢量控制投入运行前,需要获取电机本体的电气参数(定子电阻R、d/q轴电感Ld/Lq、永磁磁链ψf)以及转子初始电角度θ0。本案例通过向电机注入特定的电压矢量,利用电流响应完成参数辨识与初始位置检测,为后续电流环PI参数整定和坐标变换提供准确依据。

辨识原理与实施步骤

采用静止脉冲电压法,依次执行以下三个步骤:

  1. 电阻辨识:向任意方向(取α轴)注入低占空比方波电压,在电流未达到危险值前关断,采样稳态电流平均值Iavg,由R = Udc·D / Iavg计算定子电阻(D为占空比,Udc为母线电压)。
  2. 电感辨识:在α轴施加单极性脉冲电压,记录电流从0上升至阈值Ith的时间Δt,由L = Udc·Δt / Ith得到α轴电感;再在β轴重复,得到β轴电感。对于表贴式PMSM(Ld≈Lq),两者均值即为相电感;对于内置式,可结合转子锁定位置区分d/q轴电感。
  3. 磁链与初始位置检测:向α轴正方向注入宽脉冲使转子微动并对齐到α轴,记录编码器零位偏移θ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烧录。

验证步骤与通过条件:

  1. 电阻辨识:用万用表实测电机任意两相间电阻Rpp,计算Rexpected = Rpp/2。辨识结果与Rexpected误差<10%即通过。
  2. 电感辨识:使用LCR表在1kHz下测量相电感Lpp,辨识值应满足|Lid - Lpp/2| / (Lpp/2) < 15%。
  3. 磁链辨识:反拖电机至额定转速nN(由编码器测得),用示波器测量线反电动势峰值Epk,计算ψf = Epk / (√3·ωe),其中ωe = 2π·nN·p/60(p为极对数)。与辨识值误差<10%即通过。
  4. 初始位置检测:手动将转子转到已知机械角度(如0°),运行辨识程序,读取θ0,换算为机械角度后与已知值对比,误差<2°电角度即通过。

注意事项:辨识过程中电流不得超过电机额定值的50%,若检测到过流立即关断PWM;电感辨识的脉冲宽度需根据预估电感调整,确保电流在安全范围内达到阈值;磁链测量对噪声敏感,建议多次测量取平均。