基于Matlab Simulink的TMS320F28335主控芯片DSP模型及其永磁同步电机...
把模型里的观测端口勾选上,生成的代码会保留变量观测功能。自动生成代码这招确实省事,但生成的代码得能跑在28335上才行。模型里那几个标着PI控制器的黄框框,生成代码时会变成实实在在的PID调节算法。主控芯片dsp tms320f28335,基于Matlab Simulink开发的嵌入式模型,模型可自动生成ccs工程代码,生成的代码可直接运行在主控芯片中。这段代码控制着PWM波形的生死,要是算错了数
主控芯片dsp tms320f28335,基于Matlab Simulink开发的嵌入式模型,模型可自动生成ccs工程代码,生成的代码可直接运行在主控芯片中。 该模型利用id=0的矢量控制,实现了永磁同步电机的电流控制。
在工业控制领域搞电机驱动,DSP芯片TMS320F28335算是老熟人了。这哥们儿自带浮点运算单元,对付永磁同步电机的矢量控制正合适。咱们今天聊聊怎么用Matlab Simulink整活——从建模到生成可烧录代码的全流程。
先看个Simulink模型的局部截图(假装有图)。模型里藏着三个闭环:电流环、速度环、位置环。重点看电流环部分,毕竟id=0控制的核心就在这。模型里那几个标着PI控制器的黄框框,生成代码时会变成实实在在的PID调节算法。
自动生成代码这招确实省事,但生成的代码得能跑在28335上才行。右键点击模型选Embedded Coder,配置好芯片型号和编译器路径,重点检查下PWM模块的配置对不对。比如EPWM1的时基周期设置,直接关系到PWM频率:
EPwm1Regs.TBPRD = SYSTEM_FREQ / (2 * PWM_FREQ); //计算周期值
EPwm1Regs.TBPHS.half.TBPHS = 0; //相位归零
这段代码控制着PWM波形的生死,要是算错了数值,电机要么纹波感人要么直接啸叫抗议。
说到id=0控制,核心思想就是把d轴电流压到零。模型里的Park变换模块生成代码后会变成这样:
void Park_Transform(float alpha, float beta, float theta, float *d, float *q)
{
float cos_theta = cosf(theta);
float sin_theta = sinf(theta);
*d = alpha * cos_theta + beta * sin_theta;
*q = beta * cos_theta - alpha * sin_theta;
}
注意看这里的三角函数用的float类型,实测在28335上跑单精度浮点比硬上定点数省事得多。不过记得在CCS工程设置里打开FPU支持选项,不然计算速度能让你怀疑人生。
自动生成的ADC中断服务函数最有意思。模型里采样时刻配置得好,生成的代码会精准卡在PWM波形的谷底采样,避开开关噪声:
interrupt void ADC_ISR(void)
{
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //清中断标志
current_a = AdcResult.ADCRESULT0 * 0.00024414f; //12位ADC转换
current_b = AdcResult.ADCRESULT1 * 0.00024414f;
RUN_CLA_TASK(1); //触发CLA做Clarke变换
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
这里0.00024414的系数是3.3V参考电压下12位ADC的分辨率,实测中发现PCB布局要是没做好,这个值能飘得亲妈都不认识。
最后说说调试小技巧。把模型里的观测端口勾选上,生成的代码会保留变量观测功能。在CCS里接上XDS100仿真器,电机转起来时能实时看到q轴电流波形,比用示波器抓方便多了。不过要小心观测变量太多会把CLA累趴下,毕竟这哥们儿还要实时算控制算法呢。
整完这一套,从Simulink模型到实际电机转动,基本上一天就能走完开发流程。比起传统手写代码,最大的好处是修改控制参数不用重新编译整个工程,直接在线调参美滋滋。当然,要是遇到PWM死区时间设置这种硬件相关参数,还是得老老实实改模型重新生成代码。

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)