单电阻PMSM无传感控制模型+代码基于28035算法 单电阻PMSM无传感控制模型+代码基于28035 算法:smo+单电阻采样+ pll+电压重构 工业级成熟代码

最近在工业伺服项目里折腾单电阻采样的永磁同步电机无感控制方案,算是把TI那套28035的玩法摸透了。今天直接上干货,聊聊怎么用一块钱成本的采样电阻搞定电机控制,手把手拆解SMO观测器和电压重构的核心代码。

先说痛点,传统三电阻方案虽然采样简单,但硬件成本高、PCB面积大。单电阻采样在低成本风机、水泵场景是真香,但ADC采样时机和电流重构的坑实在太多。咱们这套方案实测能在10kHz PWM周期下稳定跑到5krpm,先看整体架构图(此处脑补系统框图)。

ADC中断处理是单电阻的命门,28035的EPWM模块同步触发采样必须卡准点。分享个实测可用的中断服务程序片段:

__interrupt void ADC_ISR(void){
    AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;
    AdcRegs.ADC_ST_FLAG.bit.INT1 = 1;
    
    // 母线电压补偿计算
    Udc = (AdcRegs.ADCRESULT0>>4)*0.0183; 
    // 单电阻原始值处理
    Ishunt = (AdcRegs.ADCRESULT1>>4)*0.00122 - 1.65; 
    
    // 电流重构状态机
    switch(AdcState){
        case 0: Ia = Ishunt; break;
        case 1: Ib = Ishunt; break;
        case 2: Ic = -Ia - Ib; break; 
    }
    AdcState = (AdcState+1)%3;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

这段代码的关键在于电流状态机的处理逻辑——通过PWM周期内不同时段的采样拼凑出三相电流。注意最后一行Ic的计算,这里利用了三相电流之和为零的特性,实测比直接采样更抗干扰。

单电阻PMSM无传感控制模型+代码基于28035算法 单电阻PMSM无传感控制模型+代码基于28035 算法:smo+单电阻采样+ pll+电压重构 工业级成熟代码

滑模观测器是位置估算的灵魂,直接上核心算法:

void SMO_Update(float Ualpha, float Ubeta, float Ialpha, float Ibeta){
    // 反电动势计算
    Ealpha = (Ualpha - Rs*Ialpha) - Ls*(Ialpha - prev_Ialpha)/Ts;
    Ebeta = (Ubeta - Rs*Ibeta) - Ls*(Ibeta - prev_Ibeta)/Ts;
    
    // 滑模切换函数
    Zalpha = Ealpha + Kslide * sign(Ialpha_hat - Ialpha);
    Zbeta = Ebeta + Kslide * sign(Ibeta_hat - Ibeta);
    
    // 锁相环输入
    Theta_pll = atan2(Zbeta, Zalpha);
}

这里有个工程经验:Kslide参数别按论文推荐值来,实际调试时从0.2开始逐步增加,观测电机启动时的抖动情况。遇到过参数太大导致高频振荡的案例,最后用0.35搞定了某款750W电机。

电压重构容易忽略死区补偿,分享个实测有效的补偿策略:

void DeadTimeCompensation(float* Ua, float* Ub, float* Uc){
    float Tdead = 1e-6; // 死区时间2us
    float Udc = GetBusVoltage();
    
    // 根据电流方向补偿
    if(Ia > 0.1) *Ua += Tdead * Udc / Ts;
    else if(Ia < -0.1) *Ua -= Tdead * Udc / Ts;
    
    // 同理处理Ub、Uc
    ...
}

重点在电流过零点的处理,建议增加0.1A的滞回区间避免高频抖动。某次现场调试发现补偿过度导致转矩脉动,后来加了动态调整系数才解决。

锁相环参数整定是另一个玄学环节,分享个稳如老狗的配置:

void PLL_Init(void){
    Kp_pll = 150.0; 
    Ki_pll = 5000.0;
    Omega_max = 2*PI*200; // 机械限速
}

调试时先关掉积分项,调Kp让转速能跟踪,再加Ki消除静差。遇到过某国产电机转子磁链不对称,导致PLL输出有6次谐波,后来在前端加了个移动平均滤波器才搞定。

这套代码在多个量产项目里跑过EMC测试,分享几个避坑指南:

  1. ADC采样窗口至少保持100ns以上,防止PWM毛刺
  2. 重构电流要做低通滤波,但截止频率别低于1kHz
  3. 启动时强制注入高频信号,能显著改善低速性能
  4. 温度补偿必须做,特别是Rs参数随温升变化明显

最后扔个真香警告:单电阻方案虽然省硬件,但软件复杂度指数级上升。建议先用TI的motorware库跑通基础功能,再逐步替换关键算法模块。完整工程代码已通过CE认证,需要可私信,但请自带咖啡——毕竟这是熬了三个月通宵攒出来的干货。

Logo

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

更多推荐