第一次接触TI的DSP28335还是在2012年做伺服驱动项目时,当时就被它强悍的运算能力和丰富的外设资源震撼到。十几年过去了,这颗"老将"在工业现场依然随处可见,特别是在对成本敏感又需要可靠性的电机控制领域。最近用公司库存的28335控制板做了个多电机控制平台,实测下来发现:只要吃透芯片特性,它完全能胜任现代电机控制的各种"花式玩法"。
这块控制板的硬件配置很典型:主频150MHz的28335核心,搭配DRV8301驱动芯片,电流采样用AMC1300隔离放大器,编码器接口直接接增量式编码器。软件层面基于TI的motorware库搭建,但做了深度裁剪优化。最让我惊喜的是通过合理调度CPU资源,单芯片同时实现了四种电机的控制算法,还能通过串口实时上传运行数据到上位机做曲线分析。
电机控制最头疼的就是干扰问题。这块板子采用三级供电设计:24V转5V的DC-DC给驱动部分供电,再通过TPS767D301产生3.3V和1.9V给DSP核心。关键信号全部用磁耦隔离,特别是PWM输出和编码器反馈这两条路径,实测在50kHz开关频率下也没有出现信号畸变。
重要提示:GPIO到驱动芯片的PWM信号线一定要做阻抗匹配,我们曾因走线过长导致边沿振铃,最终在信号线上串联33Ω电阻解决问题。
传统方案用霍尔传感器,但AMC1300这种隔离式Δ-Σ调制器更适合精密控制。需要注意:
核心算法流程:
关键参数配置:
c复制// 在motorware库中修改这些宏定义
#define USER_IQ_FULL_SCALE_FREQ_Hz (50.0) // 电气频率上限
#define USER_IQ_FULL_SCALE_VOLTAGE_V (12.0) // 电压限制
#define USER_MOTOR_Rr_Ohm (0.5) // 转子电阻
相比FOC更简单粗暴,但要注意:
利用28335的HRPWM模块实现256微步:
c复制// 配置HRPWM寄存器
EPwm1Regs.HRPCTL.bit.HRPE = 1; // 高分辨率使能
EPwm1Regs.HRPCTL.bit.PWMSYNCSEL = 1; // 同步时钟选择
虽然性能不如矢量控制,但对简单应用够用:
自定义轻量级协议帧格式:
code复制| 0xAA | 数据ID(1B) | 数据长度(1B) | 数据(nB) | CRC(2B) |
通过SCI模块以1Mbps速率传输,用DMA减轻CPU负担。
用Python+PyQt5开发的上位机,关键点:
实测可以同时显示6通道波形(电流、转速、位置等),刷新率保持在30Hz以上。
最初发现电流采样偶尔出错,最终定位是:
驱动芯片的上下管导通需要死区时间,但:
速度环PI参数调试口诀:
将关键函数用#pragma CODE_SECTION指定到RAM:
c复制#pragma CODE_SECTION(CLARKE_calc, "ramfuncs");
执行时间从5.2us降到1.8us。
TI提供的定点数运算库比浮点快3倍:
c复制#include "IQmathLib.h"
_iq CurrentA = _IQmpy(IqA, _IQ(0.95));
将控制循环拆分为:
通过EPWM模块的CMPA中断触发不同任务。
虽然28335已经面世多年,但我们发现几个创新用法:
最近还尝试用28335做预测控制算法,通过精心优化代码,20kHz的控制频率也能稳定运行。这让我想起导师说过的话:"芯片的性能边界,往往取决于工程师的想象力边界"。