DSP2833x基于模型的电机控制设计 Simulik自动生成代码 DSP2833x基于模型的电机控制设计 MATLAb Simulik自动生成代码 基于dsp2833x 底层驱动库的自动代码生成 MATLAB Simulink仿真及代码生成技术入门教程 内容为Simulink在嵌入式领域的应用,具体是Simulink在DSP28335这块开发版上的应用模型:包括直流电机、PMSM、步进电机控制模型,还有常见的LED、串口、CAN等通讯相关Simulink模型,模型都有相关解释文件。

最近在捣鼓DSP28335开发板,发现用Simulink玩电机控制简直像开外挂。直接拖几个模块就能生成C代码烧录到芯片里,连手写寄存器的功夫都省了。今天就跟大伙唠唠怎么用这套工具链搞事情。

先看这张直流电机双闭环控制的Simulink模型(此处假装有截图)。最骚的操作是PWM模块直接绑定了DSP的ePWM寄存器,配置页面选个计数器模式就能自动生成死区时间补偿代码。比如咱们在模型里设置的载波频率20kHz,生成代码后翻到epwm.c文件能看到:

EPwm1Regs.TBPRD = SYSTEM_FREQ / (2 * 20000); 
EPwm1Regs.CMPA.half.CMPA = dutyCycle * EPwm1Regs.TBPRD;

这个自动换算时钟分频的操作属实贴心,比手动查数据手册香多了。不过要注意PWM占空比模块的输出范围得限定在0-1之间,否则生成的代码会直接给寄存器塞超限值。

再来说说永磁同步电机(PMSM)的FOC实现。模型里那个Clarke变换模块看着高大上,实际生成的代码就是个矩阵运算:

I_alpha = Ia;
I_beta = (Ib + 2*Ic)/sqrt(3); 

这里有个坑——自动生成的IQmath库函数需要手动在工程里添加头文件路径。有次编译报错"qmath undefined"折腾了我半小时,后来发现得在CCS工程属性里添加C2000ware的lib路径。

通讯模块更有意思。串口收发模型配置好波特率后,生成的初始化代码竟然会自动计算BRR寄存器值:

SCI_setBaudRate(SCIA_BASE, DEVICE_LSPCLK_FREQ, 115200);

不过实测发现用Simulink的UART Receive模块接收长数据时容易丢包,后来在模型里加了个FIFO缓冲区才解决。CAN通讯模块更刺激,配置报文ID时要注意别跟DSP底层驱动自带的CAN初始化冲突,有次我在模型里设了ID=0x12,结果烧录后板子直接进bus-off状态,最后发现是底层库默认开了过滤器导致的。

DSP2833x基于模型的电机控制设计 Simulik自动生成代码 DSP2833x基于模型的电机控制设计 MATLAb Simulik自动生成代码 基于dsp2833x 底层驱动库的自动代码生成 MATLAB Simulink仿真及代码生成技术入门教程 内容为Simulink在嵌入式领域的应用,具体是Simulink在DSP28335这块开发版上的应用模型:包括直流电机、PMSM、步进电机控制模型,还有常见的LED、串口、CAN等通讯相关Simulink模型,模型都有相关解释文件。

步进电机控制有个骚操作——用GPIO模拟步进脉冲时,直接把PWM模块的TRIP信号接到GPIO复用功能上。模型里配置的脉冲方向信号生成代码,居然自动处理了信号消抖:

GpioDataRegs.GPBCLEAR.bit.GPIO42 = 1; //方向信号下降沿延时5us
DELAY_US(5);

不过要注意GPIO模块的时钟使位必须提前在配置向导里勾选,有次忘记勾选直接导致电机原地抽搐。

玩自动代码生成最大的心得是:模型里每个采样时刻必须对应实际的中断周期。有次作死用0.1ms的PID控制周期,结果生成代码后发现ADC采样时间不够,直接寄存器溢出。后来在硬件中断配置里勾选了自动调整任务优先级才搞定。

最后安利个神技——用External Mode实时调参。在模型里拖个Dashboard旋钮,烧录后直接扭动控件就能在线修改PID参数,看着电机转速实时变化,这比传统debug方式不知道高到哪里去了。不过要注意关闭代码优化选项,否则实时数据会抽风。

总的来说,这套基于模型的设计方案让电机控制开发从硬核模式切换到了简单难度。虽然偶尔要和生成的代码斗智斗勇,但比起传统开发方式,效率至少提升三倍。下次准备试试用这个框架搞多电机同步控制,有翻车经历再来分享。

Logo

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

更多推荐