1. DSP28335在电机控制领域的经典地位
第一次接触DSP28335还是在2012年的伺服驱动项目上,当时就被它强大的PWM模块和事件管理器惊艳到了。十年过去,虽然市场上出现了性能更强的处理器,但在中小功率电机控制领域,这颗"老将"依然保持着惊人的生命力。最近用闲置的28335控制板做了个多电机测试平台,实测下来发现它处理四种典型电机(直流有刷、步进、永磁同步、感应电机)的控制算法游刃有余。
为什么这款十多年前的DSP还能持续发光发热?从硬件角度看,它具备6组高精度PWM输出(150ps分辨率)、12位ADC(80ns转换时间)和正交编码器接口,这些特性完美契合电机控制需求。更难得的是,TI至今仍在维护其开发环境CCS的兼容性,最新的controlSUITE库还提供了优化后的电机控制算法库。我手头这块自制控制板成本不到200元,却实现了商业驱动器80%的功能,这就是工程师的性价比哲学。
2. 硬件平台搭建要点
2.1 核心板最小系统设计
我的控制板采用双面板设计,核心是28335主控+DRV8323三相驱动芯片的组合。电源部分需要特别注意:数字3.3V与模拟3.3V必须隔离,采用TPS767D301双路LDO分别供电。电机母线电压检测电路使用差分放大器INA240,其共模抑制比(CMRR)达到110dB,可有效抑制PWM开关噪声。
关键提示:GPIO34/35必须保留给CLA协处理器使用,这是实现FOC算法实时性的关键。我曾因误用这两个引脚导致电流环响应延迟3μs,直接造成电机震荡。
2.2 信号调理电路细节
- 电流采样:在每相下桥臂串联0.01Ω合金电阻,经INA240放大50倍后送入ADC。注意布局时采样电阻要尽量靠近MOSFET,我的实测数据显示走线超过1cm就会引入200mV以上的开关噪声。
- 位置反馈:增量式编码器信号经过AM26C32差分接收器处理,正交解码模块(eQEP)的计数误差要控制在±1个脉冲内。对于无传感器方案,采用基于滑模观测器的位置估算算法,在3000RPM时角度误差<0.5°。
3. 四种电机控制实现解析
3.1 直流有刷电机双闭环控制
采用经典的转速-电流双环结构,PWM频率设为20kHz。电流环使用PI控制器,关键参数计算过程:
code复制Kp = L * BW * 2π = 1mH * 500Hz * 6.28 ≈ 3.14
Ki = R / L = 0.5Ω / 1mH = 500
在CCS中通过CLA实时更新PWM占空比,实测阶跃响应时间仅1.2ms。调试时发现电机换向火花较大,通过增加死区时间到1μs并并联104电容解决。
3.2 步进电机微步驱动
利用28335的HRPWM模块实现256微步控制,关键点是:
- 使用正弦-余弦查表法生成相位差90°的两路PWM
- 通过PWM斩波限制绕组电流(设定值2A)
- 加入半步静止力矩补偿算法
实测在1.8°步进电机上,微步模式使振动降低60%。注意绕组续流二极管要选用超快恢复类型(如UF4007),普通1N4007会导致电流波形畸变。
3.3 永磁同步电机FOC控制
磁场定向控制(FOC)的实现流程:
- Clarke变换将三相电流转换为Iα/Iβ
- Park变换得到Id/Iq
- PI调节器输出Vd/Vq
- 逆Park变换生成PWM
使用TI提供的IQmath库加速运算,在60MHz主频下完成一次FOC计算仅需25μs。调试中发现初始位置检测很关键,我的方案是:
- 注入高频电压信号
- 检测d轴电流响应
- 通过反正切计算转子位置
3.4 感应电机VF控制
虽然矢量控制性能更优,但VF开环控制在风机等场合仍具实用价值。实现要点:
- 电压/频率按电机额定参数线性变化
- 启动时需进行电压补偿(我设置的补偿系数为0.5Hz/V)
- 加入转差补偿功能
通过eCAN模块连接HMI,可实时修改VF曲线参数。存储预设值时注意Flash编程前要先擦除扇区,否则会导致数据写入失败。
4. 实时监控系统开发
4.1 数据采集与传输
利用28335的DMA通道将关键变量(电流、转速、位置等)传输到RAM缓冲区,通过串口以500Hz频率发送到上位机。数据包格式设计为:
code复制帧头(0xAA) | 数据长度 | 时间戳 | 变量1 | ... | 校验和
在115200波特率下,每帧传输时间约0.8ms,不会影响控制时序。曾因忘记关闭串口中断导致PWM周期抖动,改用DMA后问题解决。
4.2 上位机曲线显示
使用Python+PyQt5开发监控界面,关键代码片段:
python复制class WaveformWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.plot = pg.PlotWidget()
self.curve = self.plot.plot(pen='y')
def update_data(self, new_values):
self.curve.setData(new_values)
通过多线程处理串口数据,可实现8通道波形同步刷新。调试中发现直接调用pyqtgraph的setData会导致界面卡顿,改用信号槽机制后流畅度提升明显。
5. 工程优化经验总结
5.1 中断优先级配置
正确的中断优先级设置对系统稳定性至关重要,我的配置方案:
- PWM周期中断(最高优先级)
- ADC采样完成中断
- CLA任务完成中断
- 串口通信中断(最低)
特别注意:CLA与主CPU共享外设总线,在CLA访问外设期间要禁用相关中断,否则会出现数据冲突。这个问题让我花了三天时间排查。
5.2 代码优化技巧
- 将频繁调用的函数(如PID计算)放在RAM中运行,速度比Flash快30%
- 使用#pragma CODE_SECTION指令指定函数存放位置
- 关键循环展开处理,例如:
c复制#pragma CODE_SECTION(CLARunFOC, "ramfuncs");
void CLARunFOC(void) {
__asm(" NOP"); // 避免编译器优化
// FOC算法代码
}
5.3 电磁兼容处理
电机控制板的EMC问题往往令人头痛,我的实战经验:
- 功率地与信号地单点连接,使用10Ω电阻并联104电容
- PWM输出线加磁珠滤波(如BLM18PG221SN1)
- 编码器信号采用双绞线传输,必要时加共模扼流圈
- 示波器探头接地要短,否则会观测到虚假振荡
有一次因MOSFET栅极驱动电阻过大(原设计100Ω),导致开关边沿产生200MHz振铃。将电阻改为20Ω并在栅源极间加100pF电容后,辐射噪声降低15dB。
