该模型为PMSM的无传感器器控制,在低速时采用I/F启动方式,中高速切换至滑膜观测器估算PMSM位置,进而对PMSM进行调速控制。

无传感器永磁同步电机控制这玩意儿,说难不难说简单也不简单。低速时转子位置难抓取这事儿搞过的人都懂,直接上观测器容易翻车。咱今天聊聊怎么用I/F启动和滑膜观测器打配合战,实测效果比死磕单一算法强多了。

先说说低速阶段的I/F控制,这招相当于给电机装了个"定速巡航"。来看段伪代码:

void IF_Control(float target_speed) {
    static float freq = 0;
    static float current_angle = 0;
    
    // 斜坡函数生成目标频率
    if(freq < target_speed * 0.8) {  // 0.8是加速斜率参数
        freq += 0.01; 
    }
    
    // 固定电流幅值
    float Iq_ref = 2.0;  // 典型值2-3A
    
    // 生成三相电压
    current_angle += 2 * PI * freq * Ts;
    set_voltage(Iq_ref, current_angle);
}

重点在斜坡加速和固定电流这两个操作。斜坡函数里的0.01增量要根据电机惯性调整,太大了会扯着蛋(失步),太小了启动慢。电流值2A是个经验值,实际得看电机铭牌参数,别照抄。

到了中高速段就得切换滑膜观测器了,这时候代码画风突变:

// 滑模观测器核心计算
void SMO_Update(float Ia, float Ib, float we) {
    float alpha = 0.5;  // 滑膜增益
    float L = 0.001;    // 电机电感
    
    // 反电动势估算
    emf_alpha = (Ia - hat_Ia) * alpha * L;
    emf_beta = (Ib - hat_Ib) * alpha * L;
    
    // 锁相环计算角度
    theta = atan2(-emf_beta, emf_alpha);
    
    // 自适应补偿项
    if(fabs(we) > 50) {   // 速度阈值
        alpha *= 1.2;     // 增益自动调节
    }
}

这里的滑膜增益alpha是个关键参数,调试时得拿着示波器盯着波形调。有个小技巧:当电机哼唧声变大时,适当降低alpha值。后面的自适应补偿是防止高速时观测器跟不上,类似开车时后视镜自动防眩目功能。

切换逻辑才是真考验,来看个实际项目里用到的状态机:

def control_strategy(current_speed):
    HYSTERESIS = 10  # 速度回差防止震荡
    if control_mode == 'IF':
        if current_speed > switch_speed + HYSTERESIS:
            switch_to_SMO()
    else:
        if current_speed < switch_speed - HYSTERESIS:
            switch_to_IF()

这个10rpm的回差区间很重要,没这玩意儿电机能在切换点附近抽风似的来回跳。曾经有个兄弟设成0,结果电机抖得跟筛糠似的,现场堪比迪厅灯光秀。

实测数据说话:用这套方法,在0-100rpm启动时间能控制在0.8秒内,切换时的转矩波动小于5%。不过要注意,I/F阶段的电流别设太高,否则切换瞬间会有个明显的"咯噔"感,跟手动挡换挡没踩离合似的。

最后唠叨句,电机参数不准啥算法都白搭。之前有个项目,硬件小哥把电感值标错了,观测器直接表演"太空步"。所以上电前记得做参数辨识,别头铁硬刚。

更多推荐