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为单精度三角函数。
验证步骤:
- 将电机参数填入
MotorParams结构体(如Rs=0.5Ω, Ld=Lq=0.4mH, λf=0.05Wb, Ts=1e-4s) - 初始化MRAS状态,给定初始
θ̂=0 - 注入已知电压信号(如
vα=5V, vβ=0),并采集实际电流iα, iβ(可用电机模型仿真代替) - 连续调用
MRAS_Step,观察ω̂是否收敛至设定转速
通过条件:在仿真中设定电机以1000rpm(约104.7rad/s)运行时,MRAS估计转速ω̂在0.5s内收敛至±5%误差范围内,且转子位置估计误差小于0.1rad。
关键注意事项
- 自适应增益
Kp/Ki需根据电机参数调整:增益过小收敛慢,过大会引起振荡 - 低速时反电动势信噪比低,MRAS估计精度下降,建议在额定转速10%以上运行
- 实际应用中需配合电流PI调节器,将MRAS估计的
θ̂用于坐标变换 - 代码中
ΔL项为凸极效应补偿,表贴式电机(Ld=Lq)时该项自动为0