1. 系统架构设计
1.1 硬件组成
- 主控芯片:TMS320F28335(32位浮点DSP,150MHz主频,集成18路PWM通道)
- 逆变电路:三相全桥IGBT模块(耐压1200V,电流100A)
- 电流采样:霍尔传感器(如ACS712)+ 16位ADC模块
- 位置检测:增量式编码器(分辨率4096PPR)或无感方案(滑模观测器)
- 通信接口:CAN(用于上位机交互)+ SCI(调试串口)
1.2 功能框图
上位机指令 → CAN接收 → DSP主控 → SVPWM生成 → 逆变驱动 → 电机↑↓ADC采样(电流/电压反馈)↑↓滑模观测器(无感方案)
2. 关键外设配置
2.1 ePWM模块配置
// EPWM1初始化(以A相为例)
EPwm1Regs.TBPRD = 9375; // PWM周期(150MHz时钟,周期=1/9375秒)
EPwm1Regs.TBPHS.half.TBPHS = 0; // 初始相位偏移
EPwm1Regs.CMPA.half.CMPA = 4687; // 初始占空比50%
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // 中断触发条件
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // 每周期触发一次中断
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 启用死区
EPwm1Regs.DBRED = 150; // 死区时间150ns
EPwm1Regs.DBFED = 150; // 死区恢复时间
2.2 ADC模块配置
AdcRegs.ADCCTL2.bit.INTPULSE_POS = 1; // 中断在转换结束上升沿触发
AdcRegs.ADCSOC0CTL.bit.CHSEL = ADC_CH_A0; // 采样通道配置(A相电流)
AdcRegs.ADCSOC1CTL.bit.CHSEL = ADC_CH_B0; // B相电流
AdcRegs.ADCSOC2CTL.bit.CHSEL = ADC_CH_C0; // C相电流
3. 矢量控制算法实现
3.1 坐标变换流程
// Clarke变换(三相→两相静止)
I_alpha = (2.0/3.0) * (Ia - 0.5*Ib - 0.5*Ic);
I_beta = (sqrt(3)/3.0) * (Ib - Ic);// Park变换(静止→旋转坐标系)
Id = I_alpha * cos_theta + I_beta * sin_theta;
Iq = -I_alpha * sin_theta + I_beta * cos_theta;// 反Park变换(旋转→静止坐标系)
Vd = Vq * cos_theta - Id * sin_theta;
Vq = Vq * sin_theta + Id * cos_theta;
3.2 扇区判断与作用时间计算
// 扇区判断(60°分割)
int GetSector(float I_alpha, float I_beta) {float angle = atan2(I_beta, I_alpha) * 180/PI;if(angle < 0) angle += 360;if(angle < 60) return 1;else if(angle < 120) return 2;// ... 其他扇区判断
}// 作用时间计算(以扇区1为例)
void CalcDutyCycle(int sector, float Vref, float *Ta, float *Tb, float *Tc) {static const float Vdc = 12.0; // 直流母线电压*Ta = (sqrt(3)*Vref/Vdc) * sin((sector-1)*60*PI/180);*Tb = (sqrt(3)*Vref/Vdc) * sin(sector*60*PI/180);*Tc = 1.0 - *Ta - *Tb;
}
3.3 PWM更新代码
interrupt void EPwm1_ISR(void) {// 1. 清除中断标志EPwm1Regs.TIFR.bit.INT = 1;// 2. 读取电流采样值AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清中断标志Ia = AdcResult.ADCRESULT0; // A相电流Ib = AdcResult.ADCRESULT1; // B相电流Ic = AdcResult.ADCRESULT2; // C相电流// 3. 坐标变换与控制计算ClarkeParkTransform(Ia, Ib, Ic, &I_alpha, &I_beta);Idq_Control(); // 电流环PI控制ParkClarkeInverse(); // 反变换到静止坐标系Sector_DutyCycle(); // 计算占空比// 4. 更新PWM占空比EPwm1Regs.CMPA.half.CMPA = (Ta + T0/2) * PWM_PERIOD;EPwm2Regs.CMPA.half.CMPA = (Tb + T0/2) * PWM_PERIOD;EPwm3Regs.CMPA.half.CMPA = (Tc + T0/2) * PWM_PERIOD;
}
4. 性能优化策略
4.1 死区补偿
// 硬件死区配置
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 启用死区
EPwm1Regs.DBRED = 150; // 死区时间150ns
EPwm1Regs.DBFED = 150; // 死区恢复时间// 软件补偿(查表法)
const float deadband_comp[6] = {0.016, 0.016, 0.016, 0.016, 0.016, 0.016};
Vd_comp = Vd + deadband_comp[sector-1] * Vdc;
4.2 抗积分饱和
// PI控制器改进
float PI_Controller(float error, float *integral) {float output = Kp * error + Ki * (*integral);if(output > max_limit) {*integral -= error * Ki; // 积分分离output = max_limit;}return output;
}
4.3 低通滤波
// 电流环低通滤波(截止频率1kHz)
float LPF(float input) {static float prev_output = 0;float alpha = 0.001; // RC时间常数=1msprev_output = alpha * input + (1-alpha) * prev_output;return prev_output;
}
5. 调试与验证
5.1 波形观测
- 示波器设置:CH1(EPWM1A),CH2(EPWM2A),CH3(EPWM3A),时基10μs/div
- 验证要点: 三相PWM对称性(占空比差<±0.5%) 死区时间对称性(上升/下降沿延迟一致) 谐波分析(FFT显示THD<3%)
5.2 参数整定流程
1. 电流环PI参数整定- Kp=0.5, Ki=0.01 → 观察超调量- 逐步增大Ki至电流波动<2%2. 速度环滑模参数整定- λ=0.5, k=1 → 观察转速振荡- 调整k值消除稳态误差
6. 典型应用场景
6.1 永磁同步电机(PMSM)驱动
- 控制模式:FOC(磁场定向控制)
- 性能指标: 转速响应时间:<100ms 转矩波动:<1.5% 效率:>95%(额定负载)
6.2 无刷直流电机(BLDC)控制
-
六步换相优化:
// 换相逻辑(以U相导通为例) if(当前扇区==1) {EPwm1Regs.AQCSFRC.bit.CSFA = 0; // 关闭A相上桥臂EPwm2Regs.AQCSFRC.bit.CSFB = 1; // 开启B相下桥臂 }
参考代码 基于DSP28335的SVPWM,矢量控制等程序 www.youwenfan.com/contentcnj/69431.html
7. 调试问题解决方案
问题1:电机振动明显
- 可能原因:死区补偿不足或电流环PI参数不匹配
- 解决方法: 增加死区补偿系数(从0.016调整至0.02) 降低Ki值至0.008并增加滤波时间常数
问题2:低速转矩不足
- 可能原因:弱磁控制未启用或电压利用率低
- 解决方法: 启用弱磁算法(Vd = Vq * sinθ) 提高PWM频率至20kHz
8. 扩展功能实现
8.1 无传感器控制
// 滑模观测器实现
void SlidingModeObserver() {float theta_hat = theta + (1.0/tau) * (Iq_ref - Iq_est);float Id_est = (Vd - R*Id - Ld*dId/dt) / (Ld*omega);float Iq_est = (Vq - R*Iq + Ld*dIq/dt) / (Ld*omega);
}
8.2 多电机协同控制
- 主从架构:DSP28335作为主控,搭配C28069作为从控
- EtherCAT通信:实现多轴同步(周期<1ms)