主控芯片dsp tms320f28335,基于Matlab Simulink开发的嵌入式模型,模型可自动生成ccs工程代码,生成的代码可直接运行在主控芯片中。 该模型利用六步换向算法,控制直流无刷电机旋转。

在玩转直流无刷电机控制时,TMS320F28335这颗DSP芯片绝对是老司机的首选。今天咱们聊聊怎么用Matlab Simulink的骚操作,把算法模型直接变成能在28335上撒欢跑的代码。

六步换向这玩意儿本质上就是跟着霍尔信号跳舞。在Simulink里搭建模型时,我习惯先做个状态机模块,把六个换向状态用Truth Table写得明明白白:

function phase = six_step(hall)
    switch hall
        case 0b101
            phase = [1 0 0]; % AB相导通
        case 0b001
            phase = [1 1 0]; % AC相导通
        case 0b011
            phase = [0 1 0]; % BC相导通
        case 0b010
            phase = [0 1 1]; % BA相导通
        case 0b110
            phase = [0 0 1]; % CA相导通
        case 0b100
            phase = [1 0 1]; % CB相导通
        otherwise
            phase = [0 0 0]; % 异常状态刹车
    end
end

生成C代码时会自动展开成switch-case结构,看着比手写的还整洁。重点要检查生成的PWM模块配置,Simulink里EPWM模块的参数设置必须和DSP的时钟树对齐。有次我忘了把TBPRD寄存器设成2500(对应20kHz PWM),结果电机直接鬼畜式震动,教训深刻。

自动生成的GPIO中断服务函数特别有意思,系统把霍尔信号变化处理打包得严严实实。看这段由Embedded Coder吐出来的代码:

void hall_isr(void) {
    ECAP_CLEAR_FLAG(ECAP1_BASE); // 清中断标志
    uint16_t hall_val = (GpioDataRegs.GPBDAT.bit.GPIO34 << 2) | 
                       (GpioDataRegs.GPBDAT.bit.GPIO33 << 1) | 
                        GpioDataRegs.GPBDAT.bit.GPIO32;
    six_step_controller(hall_val); // 换向状态更新
    EPwm1Regs.CMPA.half.CMPA = duty_cycle; // 更新占空比
    EPwm1Regs.CMPB = 0; // 另一路互补输出
}

代码生成器会自动处理寄存器位操作,但得注意GPIO端口号是否和硬件板子对应。有次自动生成的GPIO32其实是原理图上的GPIO12,烧录后电机死活不转,拿着万用表查了俩小时才揪出这个坑。

实战中发现,自动生成的代码在CCS工程里会带着"ert_"前缀的注释块,这些其实是代码生成器的标记。建议在模型里提前配置好硬件抽象层,比如把PWM输出直接映射到EPWM1A这样的具体引脚,能避免后期手动改代码的麻烦。

测试环节最带劲的是看示波器上的相电流波形。当六步换向节奏正确时,电流应该呈现规整的梯形波。如果出现锯齿状抖动,八成是霍尔信号消抖没做好,这时候得回Simulink模型里给霍尔输入加个数字滤波器模块,重新生成代码再战。

这种模型开发方式最爽的是改参数不用重新编译。比如想调整换向死区时间,直接在Simulink里改个数值,刷刷几下就能生成新代码下载测试,比传统开发方式至少省三杯咖啡的时间。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐