1. 项目概述:基于Simulink的直流有刷电机双闭环控制方案
在工业控制和自动化领域,直流有刷电机因其结构简单、控制方便等特点,至今仍在许多应用场景中占据重要地位。这次要分享的是基于TMS320F28335 DSP芯片和Matlab Simulink环境开发的直流有刷电机速度-电流双闭环控制系统。这个方案最大的特点是实现了从算法仿真到硬件部署的全流程开发,大大缩短了开发周期。
我们选用的TMS320F28335是TI C2000系列中的明星产品,它内置浮点运算单元(FPU),主频高达150MHz,12位ADC采样时间仅需60ns,特别适合实时控制应用。更关键的是,它完美支持Matlab/Simulink的嵌入式代码自动生成功能,让我们可以专注于控制算法本身,而不必陷入繁琐的底层寄存器配置。
2. 系统架构与设计思路
2.1 双闭环控制原理
直流有刷电机的双闭环控制通常由外环速度环和内环电流环组成。速度环负责宏观调节,根据设定转速与实际转速的偏差计算出所需的电流参考值;电流环则负责微观调节,快速跟踪这个电流参考值。这种分层结构既保证了系统的稳态精度,又提高了动态响应速度。
在实际建模时,两个环路的采样周期需要合理配置。我们的经验是:
- 速度环采样周期:1ms(对应控制带宽约100Hz)
- 电流环采样周期:100μs(对应控制带宽约1kHz)
这种10:1的采样周期比例能有效避免环路间的相互干扰。
2.2 Simulink模型搭建要点
在Simulink中搭建模型时,有几个关键模块需要特别注意:
- PWM生成模块:
matlab复制EPWM_Config = struct('Frequency', 10e3, ... % 10kHz PWM频率
'DeadTime', 1.2e-6); % 1.2μs死区时间
死区时间设置不当会导致上下桥臂直通,我们曾因使用默认的3μs差点烧毁MOS管,最终1.2μs是最佳值。
-
ADC采样模块:
ADC采样触发必须与PWM中断严格同步。我们使用EPWM1的CTR=0事件触发ADC转换,并将acqps参数从默认的14调整为9,使得采样保持时间为112.5ns(9*12.5ns),完美匹配电流传感器的响应特性。 -
PID控制器模块:
Simulink的PID模块默认使用single数据类型,但在生成28335代码时会自动转为Q15定点数格式。因此需要在建模时就考虑信号量程,避免后续定点化导致的精度损失。
3. 代码生成与硬件部署
3.1 自动代码生成配置
在Simulink中配置代码生成参数时,有几个关键选项:
- 系统目标文件:选择
ti_c2000.tlc - 硬件配置:选择
F28335.ccxml - 代码优化:建议开启Level1优化,可显著减小代码体积(我们的案例中从38KB降到27KB)
重要提示:生成的CMD文件需要手动检查,有时会错误地将代码分配到BLOCK H0区域,导致Flash分页问题。正确的做法是在CCS工程的Build Settings中,强制指定程序段到PAGE0。
3.2 关键代码解析
自动生成的PID算法核心代码如下:
c复制void Speed_PID_Calc(void) {
speed_err = speed_ref - actual_speed;
speed_integral += Ki_speed * speed_err;
// 抗积分饱和处理
if(speed_integral > 30000) speed_integral = 30000;
if(speed_integral < -30000) speed_integral = -30000;
current_ref = Kp_speed * speed_err + speed_integral;
}
这段代码有几个值得注意的细节:
- 使用
__IQmpy进行定点数乘法运算 - 手动添加了积分限幅,防止启动时的积分饱和
- 所有变量都采用Q15格式表示
3.3 实时调试技巧
利用CCS的Data Monitor功能可以实时观测关键变量:
- 配置观测变量:
c复制#pragma DATA_SECTION(actual_speed, "DMONITOR")
float actual_speed;
- 在Watch窗口中添加
actual_speed变量 - 设置采样率为1kHz,可以清晰看到控制过程的动态响应
4. 性能优化与实测结果
4.1 控制性能指标
经过精心调参后,系统达到了以下性能:
- 空载速度超调:<5%
- 突加负载转速跌落:<50RPM
- 电流环响应时间:<2个PWM周期(200μs)
- 速度环调节时间:<50ms(对10%阶跃输入)
4.2 代码优化技巧
对于需要更高性能的场景,可以考虑以下优化手段:
- 寄存器级优化:
将PID结构体操作改为直接寄存器访问,计算时间可从15μs降至8μs。
c复制// 优化前:使用结构体
PID_speed.Integral += Ki * Error;
// 优化后:直接寄存器操作
__asm(" MOVW DP, #_PID_speed_Integral");
__asm(" MOV ACC, @_Error");
__asm(" QMPY ACC, @_Ki");
__asm(" ADD @_PID_speed_Integral, ACC");
-
中断优化:
将ADC和PID计算放在同一个中断服务例程中,减少上下文切换开销。 -
查表法:
对于非线性环节,如死区补偿,可以使用预先计算的查找表代替实时计算。
5. 常见问题与解决方案
5.1 代码生成问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 生成的代码无法运行 | CMD文件配置错误 | 检查存储器分配,确保代码在PAGE0 |
| 变量值异常 | 数据类型不匹配 | 检查Simulink中的信号类型和量程 |
| PWM输出异常 | 死区时间设置不当 | 使用示波器测量实际死区时间 |
5.2 控制性能问题
- 速度振荡:
- 检查速度环PID参数,特别是微分项
- 确认机械传动系统是否有间隙
- 适当降低速度环带宽
- 电流环响应慢:
- 检查PWM频率是否足够高(建议≥10kHz)
- 确认ADC采样时刻是否在PWM周期中点
- 增大电流环比例系数
- 启动时过流:
- 添加启动柔化功能
- 限制积分项初始值
- 采用斜坡给定代替阶跃给定
6. 进阶开发建议
对于希望进一步优化系统的开发者,可以考虑以下方向:
-
参数自整定:
实现基于继电器反馈的PID参数自动整定算法,可以适应不同的电机参数。 -
抗扰动设计:
加入扰动观测器(DOB)或滑模控制,提高系统抗负载扰动能力。 -
效率优化:
根据负载情况动态调整PWM频率,在轻载时降低开关损耗。 -
安全保护:
完善过流、过温、堵转等保护机制,增加硬件看门狗。
这套基于模型设计(MBD)的开发流程,最大的优势在于算法工程师可以专注于控制策略本身,而不必深陷底层硬件细节。当然,要获得最佳性能,后期的手动优化仍然是必要的。从我们的经验来看,这种半自动化的开发方式能够将典型电机控制项目的开发周期缩短40%以上。