1. 项目概述:DSP28335永磁同步电机控制系统
最近在调试基于DSP28335的永磁同步电机(PMSM)控制系统,实现了一个支持有感和无感双模式的控制框架。这个方案在方波驱动模式下表现出优秀的带载能力,实测在额定负载下转速波动小于±2%。系统采用经典的双闭环结构——外环速度环输出iq电流指令,内环电流环通过PARK逆变换生成PWM信号。
这个项目最核心的价值在于整合了多种传感器接口和算法:
- 有感方案支持Hall传感器、磁编码器(AS5047P)和增量式编码器
- 无感方案包含三段式反电势过零点检测和滑模观测器算法
- 完整的PI控制器实现,包含抗积分饱和处理
- 梯形加减速算法确保启停平稳
2. 系统架构设计
2.1 硬件平台组成
系统基于TI的TMS320F28335 DSP控制器搭建,主要硬件模块包括:
- 功率驱动部分:采用三相全桥拓扑,栅极驱动芯片选用ISO5852S,带DESAT保护功能
- 电流检测:三电阻采样方案,运放调理电路带宽设计为20kHz
- 位置检测:
- 磁编码器接口:SPI通信,14位分辨率
- 增量编码器:QEP接口,4倍频计数
- Hall传感器:GPIO捕获
关键提示:功率部分PCB布局必须遵循"功率地"与"信号地"分离原则,单点接地位置应选择在DC-link电容负端。
2.2 软件架构设计
控制系统采用模块化设计,主要功能模块如下:
c复制// 系统主循环框架示例
void main(void) {
Init_System(); // 硬件初始化
while(1) {
if(ADC_Ready) {
Current_Loop(); // 电流环控制
if(Speed_Loop_Tick) {
Speed_Loop(); // 速度环控制
}
Position_Estimate(); // 位置估算
PWM_Update(); // PWM生成
}
}
}
软件架构特点:
- 电流环运行在PWM周期(如10kHz)
- 速度环运行在较低频率(如1kHz)
- 采用中断触发方式保证时序精确性
3. 核心算法实现
3.1 双闭环PI控制实现
电流环和速度环均采用PI控制器,关键实现代码如下:
c复制typedef struct {
float ref; // 参考值
float fb; // 反馈值
float Kp; // 比例系数
float Ki; // 积分系数
float integral; // 积分项
float output; // 输出
} PI_STRUCT;
void PI_Update(PI_STRUCT *pi) {
// 误差计算
pi->err = pi->ref - pi->fb;
// 积分项更新(带限幅)
pi->integral += pi->err * pi->Ki;
pi->integral = (pi->integral > INTEGRAL_LIMIT) ? INTEGRAL_LIMIT :
((pi->integral < -INTEGRAL_LIMIT) ? -INTEGRAL_LIMIT : pi->integral);
// 输出计算
pi->output = pi->Kp * pi->err + pi->integral;
}
参数整定经验:
- 电流环Kp初始值取0.3-0.5,Ki取0.02-0.05
- 速度环Kp初始值取0.1-0.3,Ki取0.005-0.01
- 调试时先调Kp至系统无明显超调,再加Ki消除静差
3.2 无感控制算法实现
3.2.1 滑模观测器设计
滑模观测器核心代码实现:
c复制typedef struct {
float i_alpha_est; // α轴电流估计值
float i_beta_est; // β轴电流估计值
float i_alpha_fb; // α轴电流反馈
float i_beta_fb; // β轴电流反馈
float Kslide; // 滑模增益
float E_alpha; // α轴反电势
float E_beta; // β轴反电势
PLL_STRUCT pll; // 锁相环
} SMO_STRUCT;
void SMO_Update(SMO_STRUCT *smo) {
// 滑模面计算
float s_alpha = smo->i_alpha_est - smo->i_alpha_fb;
float s_beta = smo->i_beta_est - smo->i_beta_fb;
// 切换函数
float z_alpha = (s_alpha > 0) ? smo->Kslide : -smo->Kslide;
float z_beta = (s_beta > 0) ? smo->Kslide : -smo->Kslide;
// 反电动势估算
smo->E_alpha = z_alpha * R_S / Ld;
smo->E_beta = z_beta * R_S / Ld;
// 锁相环更新
PLL_Update(&smo->pll, smo->E_alpha, smo->E_beta);
}
滑模观测器调试要点:
- 滑模增益Kslide通常取0.8-1.2倍母线电压
- 观测器带宽应高于电机最高电气频率的2-3倍
- 带载时角度跟踪延迟应控制在15度以内
3.2.2 三段式启动算法
无感启动采用经典的三段式方法:
- 预定位阶段:强制输出固定角度矢量(持续100-200ms)
- 开环加速阶段:线性增加频率至额定转速的10%
- 切换观测器阶段:当反电势足够大时切换到闭环控制
4. 关键外设配置
4.1 PWM模块配置
PWM生成需要特别注意死区时间和触发采样时刻:
c复制void Init_EPWM(void) {
EPwm1Regs.TBPRD = PWM_PERIOD; // 设置周期
EPwm1Regs.CMPA.half.CMPA = 0; // 初始占空比
// 死区配置
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
EPwm1Regs.DBFED = DEAD_TIME; // 上升沿死区
EPwm1Regs.DBRED = DEAD_TIME; // 下降沿死区
// ADC触发配置
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 使能SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 1; // 计数等于0时触发
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // 每周期触发一次
}
重要提示:PWM触发ADC采样时刻应与PWM中心对齐,偏差超过100ns会导致电流波形畸变。
4.2 ADC模块配置
电流采样ADC配置要点:
c复制void Init_ADC(void) {
AdcRegs.ADCTRL1.bit.ACQ_PS = 0x6; // 采样窗口=7*12.5ns
AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x3; // 内核时钟分频
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 级联模式
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;// 通道0对应相电流
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ = 1;// EPWM触发SEQ1
}
ADC校准技巧:
- 上电后先运行内部校准(ADCTRL2.bit.ADCRESET=1)
- 采样电阻两端电压应加入RC滤波(1kΩ+100nF)
- 软件中需做偏移校准,记录零电流时的ADC值
5. 传感器接口实现
5.1 磁编码器(AS5047P)接口
SPI读取磁编码器角度数据:
c复制uint16_t Read_AS5047P(void) {
SpiRegs.SPICTL.bit.TALK = 0; // 禁止发送
SpiRegs.SPITXBUF = 0xFFFF; // 发送空数据
while(SpiRegs.SPISTS.bit.INT_FLAG == 0); // 等待接收
uint16_t raw = SpiRegs.SPIRXBUF;
return (raw & 0x3FFF); // 取14位有效数据
}
磁编码器使用注意事项:
- SPI时钟不超过10MHz
- 电源需加π型滤波(10μF+0.1μF)
- 角度跳变应先检查电源纹波(应<50mVpp)
5.2 增量编码器接口
QEP模块配置示例:
c复制void Init_QEP(void) {
EQep1Regs.QUPRD = 0xFFFF; // 最大计数周期
EQep1Regs.QDECCTL.bit.QSRC = 0; // 正交计数模式
EQep1Regs.QEPCTL.bit.FREE_SOFT = 2; // 仿真模式
EQep1Regs.QEPCTL.bit.PCRM = 1; // 索引信号复位计数
EQep1Regs.QEPCTL.bit.UTE = 1; // 使能单元定时器
}
编码器信号处理技巧:
- 信号线应使用双绞线并加磁环
- 软件中需做四倍频处理提高分辨率
- 低速时可采用M法测速,高速采用T法
6. 保护功能实现
6.1 硬件保护电路
功率部分关键保护设计:
- DESAT保护:检测IGBT退饱和,响应时间<2μs
- RCD吸收回路:建议值22Ω+470pF+快恢复二极管
- 过流保护:硬件比较器直接关断PWM
6.2 软件保护策略
软件保护机制包括:
- 电流限制:iq/id最大值限制
- 速度限制:最大转速限制
- 故障检测:电压异常、温度过高等
c复制void Safety_Check(void) {
if(fabs(Iq_Meas) > IQ_MAX) {
PWM_Disable();
Fault_Flag |= OVER_CURRENT;
}
if(Motor_Speed > SPEED_MAX) {
Speed_Ramp.Target = SPEED_MAX;
}
}
保护系统调试要点:
- 所有保护功能应先在开环模式下验证
- 过流阈值应设置为额定值的1.5倍
- 故障恢复需加入延时和确认机制
7. 系统调试经验
7.1 电流环调试步骤
- 先开环运行,确认电流采样正确
- 设置Kp=0,逐步增加Ki至出现振荡后回退30%
- 固定Ki,增加Kp至响应速度满足要求
- 带载测试动态响应,调整参数
7.2 无感算法调试技巧
- 先验证反电势波形是否正常
- 调整滑模增益至角度跟踪稳定
- 带载测试切换过程是否平滑
- 关注低速(10%额定转速)下的控制性能
7.3 常见问题排查
- 电机抖动:检查电流环参数,特别是积分项
- 启动失败:调整预定位时间和开环加速斜率
- 角度跳变:检查传感器电源质量
- 过流保护:检查PWM死区时间和栅极驱动波形
我在实际调试中发现,DSP28335的Flash运行速度较慢,建议将关键算法放在RAM中运行。可以通过以下方式实现:
c复制#pragma CODE_SECTION(Current_PI_Update, "ramfuncs");
#pragma CODE_SECTION(SMO_Update, "ramfuncs");
此外,CCS工程配置中需将对应的存储器段设置为可加载和可运行。这个优化可以将算法执行时间缩短约30%,特别对高开关频率(>15kHz)的系统效果明显。