4. 模型参考自适应系统无传感器控制

任务目标

基于模型参考自适应系统(MRAS)实现永磁同步电机(PMSM)无传感器控制中的转子转速与位置辨识。以电流模型为参考模型,通过自适应律调节转子位置估计值,使可调模型的电流输出逼近参考模型,从而收敛到真实转速。

实现原理

MRAS利用两个模型输出误差驱动自适应律:参考模型为PMSM在静止坐标系下的电流方程(真实电机),可调模型为包含转速估计值ω̂的同一电流方程。通过Popov超稳定性理论设计自适应律,使ω̂收敛至真实转速。转子位置由转速积分获得。

核心代码

// PMSM MRAS无传感器控制 - 核心算法实现
// 依赖: 电机参数 Rs, Ld, Lq, λf; 采样周期 Ts

typedef struct {
    float Rs;   // 定子电阻 (Ω)
    float Ld;   // d轴电感 (H)
    float Lq;   // q轴电感 (H)
    float λf;   // 永磁体磁链 (Wb)
    float Ts;   // 采样周期 (s)
} MotorParams;

typedef struct {
    float iα, iβ;       // 静止坐标系电流 (A)
    float vα, vβ;       // 静止坐标系电压 (V)
    float ω̂;            // 估计转速 (rad/s)
    float θ̂;            // 估计转子位置 (rad)
    float iα_hat, iβ_hat; // 可调模型输出电流 (A)
    float eα, eβ;       // 电流误差
    float Kp, Ki;       // PI自适应增益
    float integral;     // 自适应积分项
} MRAS_State;

// 可调模型: 基于电流方程的估计电流计算
void MRAS_UpdateModel(MRAS_State *mras, const MotorParams *p) {
    float Ld = p->Ld, Lq = p->Lq, Rs = p->Rs, λf = p->λf;
    float sinθ = sinf(mras->θ̂), cosθ = cosf(mras->θ̂);
    float ΔL = Ld - Lq;

    // 静止坐标系下的扩展反电动势模型
    float eα_ext = λf * sinθ + ΔL * (mras->iα * sinθ + mras->iβ * cosθ) * sinθ;
    float eβ_ext = -λf * cosθ + ΔL * (mras->iα * sinθ + mras->iβ * cosθ) * cosθ;

    // 可调模型电流微分 (欧拉离散)
    float diα_hat = (-Rs * mras->iα_hat + mras->vα - eα_ext) / Ld;
    float diβ_hat = (-Rs * mras->iβ_hat + mras->vβ - eβ_ext) / Ld;

    mras->iα_hat += diα_hat * p->Ts;
    mras->iβ_hat += diβ_hat * p->Ts;
}

// 自适应律: 基于电流误差的转速估计
void MRAS_AdaptiveLaw(MRAS_State *mras, const MotorParams *p) {
    // 电流误差
    mras->eα = mras->iα - mras->iα_hat;
    mras->eβ = mras->iβ - mras->iβ_hat;

    // 误差加权项 (基于反电动势方向)
    float sinθ = sinf(mras->θ̂), cosθ = cosf(mras->θ̂);
    float ε = (mras->eα * cosθ + mras->eβ * sinθ) * p->λf;

    // PI自适应律
    mras->integral += mras->Ki * ε * p->Ts;
    mras->ω̂ = mras->Kp * ε + mras->integral;

    // 限幅
    if (mras->ω̂ > 3000.0f) mras->ω̂ = 3000.0f;
    if (mras->ω̂ < -3000.0f) mras->ω̂ = -3000.0f;

    // 位置积分
    mras->θ̂ += mras->ω̂ * p->Ts;
    // 角度归一化到 [0, 2π)
    if (mras->θ̂ > 2.0f * M_PI) mras->θ̂ -= 2.0f * M_PI;
    if (mras->θ̂ < 0.0f) mras->θ̂ += 2.0f * M_PI;
}

// 主控制循环 (每个PWM周期调用一次)
void MRAS_Step(MRAS_State *mras, const MotorParams *p,
               float iα, float iβ, float vα, float vβ) {
    mras->iα = iα;
    mras->iβ = iβ;
    mras->vα = vα;
    mras->vβ = vβ;

    MRAS_UpdateModel(mras, p);
    MRAS_AdaptiveLaw(mras, p);
}

// 初始化
void MRAS_Init(MRAS_State *mras, const MotorParams *p) {
    mras->iα = mras->iβ = 0.0f;
    mras->iα_hat = mras->iβ_hat = 0.0f;
    mras->ω̂ = 0.0f;
    mras->θ̂ = 0.0f;
    mras->integral = 0.0f;
    mras->Kp = 50.0f;   // 需根据系统调试
    mras->Ki = 2000.0f; // 需根据系统调试
}

运行与验证

环境依赖:需要电机控制MCU(如STM32F4系列)或Matlab/Simulink仿真环境。代码中M_PI需包含math.h,sinf/cosf为单精度三角函数。

验证步骤:

  1. 将电机参数填入MotorParams结构体(如Rs=0.5Ω, Ld=Lq=0.4mH, λf=0.05Wb, Ts=1e-4s)
  2. 初始化MRAS状态,给定初始θ̂=0
  3. 注入已知电压信号(如vα=5V, vβ=0),并采集实际电流iα, iβ(可用电机模型仿真代替)
  4. 连续调用MRAS_Step,观察ω̂是否收敛至设定转速

通过条件:在仿真中设定电机以1000rpm(约104.7rad/s)运行时,MRAS估计转速ω̂在0.5s内收敛至±5%误差范围内,且转子位置估计误差小于0.1rad。

关键注意事项

  • 自适应增益Kp/Ki需根据电机参数调整:增益过小收敛慢,过大会引起振荡
  • 低速时反电动势信噪比低,MRAS估计精度下降,建议在额定转速10%以上运行
  • 实际应用中需配合电流PI调节器,将MRAS估计的θ̂用于坐标变换
  • 代码中ΔL项为凸极效应补偿,表贴式电机(Ld=Lq)时该项自动为0