BLDC(无刷直流电机)矢量控制仿真模型,在转速1500r/min运行良好,可升级为滑模控制; 也有采用霍尔的六步换相双闭环控制;

最近在折腾无刷电机控制,发现矢量控制真是个有意思的玩法。手头有个在1500转稳如老狗的仿真模型,实测波形干净得让人感动。不过玩控制的老司机都知道,传统PI调节器在动态响应上还是差点意思,这就引出了咱们今天要聊的滑模控制。

先看这个基础版矢量控制的Simulink模型,核心是坐标变换模块。关键代码长这样:

function [Iq, Id] = clark_park(Ia, Ib, Ic, theta)
% Clarke变换
I_alpha = Ia;
I_beta = (Ib - Ic)/sqrt(3);

% Park变换
Id = I_alpha*cos(theta) + I_beta*sin(theta);
Iq = -I_alpha*sin(theta) + I_beta*cos(theta);

这个变换矩阵把三相电流映射到旋转坐标系,电流环的PI控制器直接怼d轴和q轴分量。实测在突加负载时转速会抖两下,这时候就该滑模登场了。

BLDC(无刷直流电机)矢量控制仿真模型,在转速1500r/min运行良好,可升级为滑模控制; 也有采用霍尔的六步换相双闭环控制;

滑模控制的精髓在于这个切换函数:

float sliding_mode(float error, float derror) {
    float s = error + 10*derror; // 滑模面参数
    float u = 50 * sign(s);      // 切换增益
    return u;
}

注意这里的sign函数需要做平滑处理,否则输出会有高频抖动。实测加上滑模后,突加5N·m负载时转速波动从±30rpm压到了±5rpm以内,效果立竿见影。

另一个路子是霍尔传感器的六步换相方案,这个更适合低成本应用。核心逻辑是通过霍尔信号确定换相时刻:

void commutation() {
    switch(hall_state){
        case 0b101:
            setPWM(AH, BH, CL); // 相位组合1
            break;
        case 0b100:
            setPWM(AH, BL, CH); // 相位组合2
            break;
        //...其他五种状态
    }
}

双闭环控制时要注意电流采样时机,必须在PWM开通时段中间点采样。这里有个坑:很多新手直接在中断里读ADC,结果噪声大得怀疑人生。正确的做法是同步触发ADC采样:

// STM32的PWM中心对齐模式配置
TIM1->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // PWM模式1
TIM1->CR1 |= TIM_CR1_CMS_0; // Center-aligned mode
TIM1->CCER |= TIM_CCER_CC1E; // 开启比较输出

// ADC触发配置
ADC1->CR2 |= ADC_CR2_EXTSEL; // 触发源选择TIM1_TRGO
TIM1->CR2 |= TIM_CR2_MMS_1;  // TRGO输出选择更新事件

实测这套方案在电动工具上跑得飞起,成本比编码器方案低一半不止。不过要玩高频注入算法的话,还是得上矢量控制那套。

最后说下参数整定的小技巧:先调电流环,把带宽搞到1kHz以上,再调速度环。遇到震荡别急着改参数,先查查前馈补偿是不是没加。有个骚操作是把速度环输出限幅设成电流环最大值的80%,这样既防饱和又保动态。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐