基于Matlab Simulink的TMS320F28335 DSP芯片嵌入式模型:实现直流有...
主控芯片dsp tms320f28335,基于Matlab Simulink开发的嵌入式模型,模型可自动生成ccs工程代码,生成的代码可直接运行在主控芯片中。 该模型利用PID控制算法,实现了直流有刷电机的速度电流双闭环控制。
在玩转直流有刷电机控制时,咱们用TMS320F28335这块DSP搞了个有意思的方案。这货自带浮点运算单元,12位ADC采样只要60ns,对付实时控制妥妥的。最爽的是整个开发流程——直接在Matlab Simulink里搭模型,自动生成CCS工程代码,烧录到板子上就能跑。
先看模型架构,双闭环可不是简单的两个PID摞起来。外环速度环给内环电流环当指挥,内环负责快速响应。Simulink里搭建时要注意采样时间配合——速度环用1ms,电流环得做到100μs才跟得上PWM频率。这里有个坑:自动生成的PWM初始化代码需要手动改死区时间,官方例程给的3μs在我们板子上差点把MOS管送走,后来实测1.2μs才安全。
贴段关键代码:
// 生成的速度环PID计算代码
void Speed_PID_Calc(void) {
speed_err = speed_ref - actual_speed;
speed_integral += Ki_speed * speed_err;
if(speed_integral > 30000) speed_integral = 30000; // 抗积分饱和
current_ref = Kp_speed * speed_err + speed_integral;
}
这个自动生成的积分环节得手动加个限幅,不然启动时积分项能把电流给定顶到姥姥家。有意思的是Simulink的PID模块默认用single数据类型,生成到28335上会自动转为Q15格式,用IQmpy做定点数乘法,这点在模型里得提前考虑量程缩放。
电流环的ADC采样触发要和PWM中断严格同步,这里用EPWM1的CTR=0事件触发ADC。模型里配置ADC模块时,如果直接拖官方模块生成代码,采样窗口可能对不上,得在Simulink的ADC配置里把acqps参数从默认的14改成9,对应实际采样保持时间=9*12.5ns=112.5ns,刚好匹配我们板子的电流传感器响应时间。
代码生成后得检查连接文件。有一次生成的CMD文件把程序区分配到BLOCK H0,结果28335的FLASH分页机制导致程序跑飞。后来在CCS工程里右键点击Build Settings,在C2000 Linker里强制指定程序段到PAGE0才解决。这个细节在自动生成的链接脚本里经常出幺蛾子。
实测效果:空载时速度超调控制在5%以内,突加负载转速跌落不超过50RPM。用CCS的Data Monitor功能抓取实时波形,发现电流环响应时间在2个PWM周期内完成调节。不过生成的代码体积有点膨胀,后来在Simulink配置里勾选Optimization->Level1,代码量从38KB减到27KB,证明模型里那些没用的诊断接口确实吃资源。
这种开发方式最适合做算法验证,但真要量产还得优化。比如把Simulink生成的PID结构体改成寄存器直接操作,能把计算时间从15μs压到8μs。不过对于大部分应用场景,自动生成的代码已经足够让电机欢快地转起来了。

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

所有评论(0)