2. 电机参数辨识与识别结果分析

任务目标

本案例使用TI InstaSPIN-FOC方案内置的电机参数辨识功能,在无外部负载条件下对一台永磁同步电机(PMSM)进行在线辨识,获取定子电阻Rs、d/q轴电感Ld/Lq、转子磁链λm等参数,并通过对比辨识结果与电机铭牌/制造商数据表参数,分析辨识值的准确性及误差来源。

环境与依赖

  • 硬件:TI LaunchPad(如LAUNCHXL-F28069M)+ BOOSTXL-DRV8301电机驱动板,或TI InstaSPIN兼容的任意MCU+驱动组合
  • 电机:一台PMSM(本案例以某款额定参数已知的电机为例,实际参数见下文输入数据)
  • 软件:CCS(Code Composer Studio)或UniFlash,MotorWare或C2000Ware中的InstaSPIN例程工程
  • 关键文件:user.h(电机参数宏定义)、proj_lab10.c(辨识例程主文件)

实现原理与步骤

InstaSPIN-FOC的辨识流程分为两个阶段:静态辨识(向电机注入直流电压,通过电流响应计算Rs)和动态辨识(向电机注入高频旋转电压矢量,通过电流幅值/相位响应计算Ld、Lq和λm)。辨识完成后,结果写入motorParams结构体,供后续FOC运行使用。

  1. 在user.h中配置电机额定参数(作为辨识初值)和辨识使能位
  2. 编译并烧录proj_lab10例程
  3. 通过CCS的Expression窗口或波形观测motorParams结构体中的辨识结果
  4. 记录辨识值,与制造商数据表对比,计算误差百分比

关键完整代码

以下为user.h中与本案例直接相关的电机参数配置代码(以某款额定参数已知的PMSM为例):

// user.h - 电机参数辨识相关配置
#define USER_MOTOR_TYPE           MOTOR_Type_PM
#define USER_MOTOR_Rs             (0.36f)    // 制造商标称定子电阻 (Ohm)
#define USER_MOTOR_Ls_d           (0.00035f) // 制造商标称d轴电感 (H)
#define USER_MOTOR_Ls_q           (0.00035f) // 制造商标称q轴电感 (H)
#define USER_MOTOR_RATED_FLUX     (0.0315f)  // 制造商标称转子磁链 (V/Hz)
#define USER_MOTOR_POLE_PAIRS     (4)        // 极对数
#define USER_MOTOR_MAX_CURRENT    (8.0f)     // 峰值相电流 (A)
#define USER_MOTOR_MAX_SPEED      (6000.0f)  // 最大电转速 (RPM)
#define USER_MOTOR_FLUX_EST_FREQ_Hz (10.0f)  // 辨识注入频率

// 辨识使能 - 置1启用辨识,置0跳过辨识直接使用上述参数
#define USER_MOTOR_IDENTIFICATION  (1)

以下为proj_lab10.c中启动辨识并读取结果的核心代码片段:

// proj_lab10.c - 辨识主流程(节选)
#include "main.h"

// 全局辨识结果结构体
volatile MOTOR_Params_t motorParams;

void main(void)
{
    // ... 初始化外设、ADC、PWM等(由例程框架提供) ...

    // 启动辨识流程
    EST_runIdentification(&estHandle, USER_MOTOR_IDENTIFICATION);

    // 等待辨识完成(由状态机自动切换,此处轮询标志位)
    while (EST_isMotorIdentified(&estHandle) == false)
    {
        // 辨识期间需保持电机无外部负载,且母线电压稳定
    }

    // 辨识完成后读取参数
    motorParams.Rs = EST_getRs_Ohm(&estHandle);
    motorParams.Ls_d = EST_getLs_d_H(&estHandle);
    motorParams.Ls_q = EST_getLs_q_H(&estHandle);
    motorParams.Flux = EST_getFlux_VpHz(&estHandle);

    // 将辨识结果写入FOC控制器参数
    CTRL_setMotorParams(&ctrlHandle, &motorParams);

    // 主循环:正常运行FOC
    for (;;)
    {
        // ... FOC控制主循环 ...
    }
}

运行与验证方法

  1. 接线与准备:将电机三相线接入DRV8301输出端,确保母线电容已放电,电机轴可自由旋转(不连接任何负载或联轴器)。
  2. 编译烧录:在CCS中导入proj_lab10工程,确认USER_MOTOR_IDENTIFICATION为1,编译并烧录至MCU。
  3. 启动辨识:给驱动板上电,通过CCS的Resume按钮运行程序。辨识过程约需5~15秒,期间电机会发出轻微高频啸叫并缓慢转动,属正常现象。
  4. 读取结果:在CCS的Expression窗口中添加motorParams.Rs、motorParams.Ls_d、motorParams.Ls_q、motorParams.Flux,辨识完成后记录数值。
  5. 准确性判定:将辨识值与制造商数据表参数对比,计算相对误差。判定标准:Rs误差≤10%,Ld/Lq误差≤15%,λm误差≤10%为通过。若误差超限,检查母线电压是否稳定、电机是否完全无载、辨识期间是否触碰电机轴。

预期输出示例

以下为基于上述制造商标称值,在理想无载条件下辨识后应得到的典型结果范围(非实测数据,仅作参考):

motorParams.Rs   ≈ 0.33 ~ 0.39 Ohm   (标称0.36)
motorParams.Ls_d ≈ 0.32 ~ 0.38 mH    (标称0.35 mH)
motorParams.Ls_q ≈ 0.32 ~ 0.38 mH    (标称0.35 mH)
motorParams.Flux ≈ 0.029 ~ 0.034 V/Hz(标称0.0315)

误差来源与注意事项

  • 温度影响:辨识时绕组温度不同会导致Rs偏差,铜线电阻温度系数约0.4%/°C,若电机刚从高负载状态冷却,需等待热平衡后再辨识。
  • 饱和效应:辨识注入电流幅值由USER_MOTOR_MAX_CURRENT决定,若电流过小,电感辨识值偏大(未进入饱和区);若电流过大,磁链辨识值偏小(饱和削弱)。建议注入电流为额定电流的20%~50%。
  • 逆变器非线性:死区时间和管压降会导致低速小电流时辨识误差增大,InstaSPIN内部有补偿算法,但极端情况下仍可能影响结果。
  • 极对数错误:若USER_MOTOR_POLE_PAIRS配置错误,辨识结果将完全不可用,务必先确认电机极对数。