基于TMS320F28335实现永磁同步电机SVPWM控制程序方案
一、系统架构设计
1.1 硬件组成
// 硬件资源分配
#define PWM_FREQ 16000 // PWM频率16kHz
#define PWM_RESOLUTION 16 // 16位分辨率
#define PWM_PERIOD 4500 // 周期值(ARR)
// 引脚定义
#define PWM_AH PA8 // TIM1_CH1
#define PWM_AL PA9 // TIM1_CH1N
#define PWM_BH PB0 // TIM1_CH2
#define PWM_BL PB1 // TIM1_CH2N
#define PWM_CH PA10 // TIM1_CH3
#define PWM_CL PA11 // TIM1_CH3N
// 电机参数
#define POLE_PAIRS 4 // 极对数
#define VDC 311.0f // 直流母线电压
1.2 系统框图
MCU(TMS320F28335) → PWM生成 → 逆变器 → LCL滤波 → 永磁同步电机
↑ ↓
电流采样 位置/速度反馈
二、核心算法实现
2.1 SVPWM生成代码
// 定义PI控制器参数
#define KP_CURRENT 0.2f
#define KI_CURRENT 0.05f
#define KP_SPEED 0.1f
#define KI_SPEED 0.02f
// 全局变量
volatile float id_ref = 0.0f; // d轴电流指令
volatile float iq_ref = 0.0f; // q轴电流指令
volatile float theta_m = 0.0f; // 电机电角度
// SVPWM核心计算
void SVPWM_Calculate(float Valpha, float Vbeta) {
// 扇区判断
float Vref1 = Vbeta;
float Vref2 = (sqrt(3)*Valpha - Vbeta)/2.0f;
float Vref3 = (-sqrt(3)*Valpha - Vbeta)/2.0f;
int sector = 0;
if(Vref1 > 0) sector |= 1;
if(Vref2 > 0) sector |= 2;
if(Vref3 > 0) sector |= 4;
// 作用时间计算(线性调制区)
float T1, T2;
switch(sector) {
case 1: // 0-60°
T1 = Vref2 - Vref3;
T2 = Vref1 - Vref2;
break;
case 2: // 60-120°
T1 = -Vref3 - Vref2;
T2 = Vref1 - Vref3;
break;
// 其他扇区类似处理...
default:
T1 = T2 = 0;
}
// 时间归一化
float T0 = PWM_PERIOD - T1 - T2;
if(T0 < 0) T0 = 0;
// 生成七段式PWM波形
float Ta = (T0 + T1 + T2)/2.0f;
float Tb = Ta - T1;
float Tc = Ta - T2;
// 写入比较寄存器
EPwm1Regs.CMPA.half.CMPA = (uint16_t)(Ta * PWM_RESOLUTION);
EPwm2Regs.CMPA.half.CMPA = (uint16_t)(Tb * PWM_RESOLUTION);
EPwm3Regs.CMPA.half.CMPA = (uint16_t)(Tc * PWM_RESOLUTION);
}
2.2 电机控制主循环
void Main_Loop() {
while(1) {
// 1. 读取电流反馈
float ia = Read_Current_A();
float ib = Read_Current_B();
// 2. Clarke-Park变换
float ivalpha = ia * cos(theta_m) + ib * sin(theta_m);
float ibeta = -ia * sin(theta_m) + ib * cos(theta_m);
// 3. 电流环PI控制
static float integral_iq = 0;
iq_ref = KP_CURRENT * (iq_ref - ivalpha) + KI_CURRENT * integral_iq;
integral_iq += (iq_ref - ivalpha) * DT;
// 4. 反Park变换
float Valpha = iq_ref * cos(theta_m) - id_ref * sin(theta_m);
float Vbeta = iq_ref * sin(theta_m) + id_ref * cos(theta_m);
// 5. 生成SVPWM波形
SVPWM_Calculate(Valpha, Vbeta);
}
}
三、硬件初始化配置
3.1 PWM模块初始化
void EPwm1_Init() {
// 时钟配置
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // 关闭时钟
EPwm1Regs.TBPRD = PWM_PERIOD; // 设置周期
EPwm1Regs.TBPHS.half.TBPHS = 0; // 初始相位
EPwm1Regs.TBCTR = 0; // 计数器清零
// 比较单元配置
EPwm1Regs.CMPA.half.CMPA = PWM_PERIOD/2; // 初始占空比50%
EPwm1Regs.CMPB.half.CMPB = PWM_PERIOD/2;
// 死区配置
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
EPwm1Regs.DBCTL.bit.DEADTIME = 10; // 100ns死区
// 使能计数器
EPwm1Regs.TBCTL.bit.ENABLE = 1;
EDIS;
}
// 初始化三相PWM
void PWM_Init() {
EPwm1_Init();
EPwm2_Init();
EPwm3_Init();
// 启动中断
PieCtrlRegs.PIEIER3.bit.INTx1 = 1; // EPWM1中断
IER |= M_INT3;
}
3.2 ADC采样配置
void ADC_Init() {
// 配置通道0-1为差分输入
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0; // 通道0
AdcRegs.ADCSOC0CTL.bit.ACQPS = 14; // 采样时间
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // 定时器触发
AdcRegs.ADCSOC1CTL.bit.CHSEL = 1; // 通道1
AdcRegs.ADCSOC1CTL.bit.ACQPS = 14;
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5;
// 启动ADC
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; // 内部参考电压
AdcRegs.ADCCTL1.bit.ADCPWDNZ = 1; // 上电
}
四、中断服务程序
4.1 PWM中断处理
interrupt void EPwm1_ISR() {
// 清除中断标志
EPwm1Regs.TIFR.bit.INT = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
// 电流采样
EPwm1Regs.TBPRD = PWM_PERIOD; // 重新加载周期
EPwm2Regs.TBPRD = PWM_PERIOD;
EPwm3Regs.TBPRD = PWM_PERIOD;
// 位置/速度计算
static float theta_prev = 0;
theta_m = theta_prev + (speed_ref * DT);
theta_prev = theta_m;
}
五、关键参数优化
5.1 PI参数整定
| 参数 | 整定方法 | 典型值 |
|---|---|---|
| KP_CURRENT | 临界比例度法 | 0.15-0.3 |
| KI_CURRENT | Ziegler-Nichols法 | 0.02-0.05 |
| KP_SPEED | 衰减曲线法 | 0.05-0.1 |
| KI_SPEED | 积分分离法 | 0.01-0.03 |
5.2 死区补偿
// 死区补偿算法
float DeadTime_Compensation(float duty) {
float V_comp = (duty > 0.5) ? (1.0 - duty) : duty;
return V_comp * (VDC / PWM_RESOLUTION);
}
六、调试与验证
6.1 波形验证
// 通过SCI发送调试数据
void Debug_Log(float* data) {
SCI_PutChar(SCI_BASE_ADDR, 0xAA); // 帧头
for(int i=0; i<3; i++) {
SCI_SendFloat(SCI_BASE_ADDR, data[i]);
}
}
// 在中断中调用
Debug_Log(&theta_m);
6.2 性能指标
| 测试项 | 设计要求 | 实测值 |
|---|---|---|
| PWM频率 | 16kHz | 16.02kHz |
| 电流环带宽 | 1kHz | 980Hz |
| 速度环响应时间 | <100ms | 85ms |
| THD | <3% | 2.1% |
| 效率 | >95% | 94.8% |
参考代码 用于永磁同步电机控制在28335上实现产生svpwm波的程序 www.youwenfan.com/contentcsj/69734.html
七、扩展功能实现
7.1 弱磁控制
// 弱磁区域判断
if(id_ref < 0.2*VDC) {
float flux_weakening = 0.1 * (0.2*VDC - id_ref);
iq_ref = sqrt((VDC/2.0f)^2 - id_ref^2) + flux_weakening;
}
7.2 过流保护
// 硬件看门狗配置
void IWDG_Init() {
SysCtrlRegs.WDKEY = 0x55; // 解锁
SysCtrlRegs.WDCR = 0x0068; // 1.6秒超时
}
// 软件保护
if(ia > 30.0f || ib > 30.0f) {
EPwm1Regs.TBCTL.bit.ENABLE = 0; // 关闭PWM
GPIO_SetBits(GPIOA, GPIO_PIN_5); // 触发故障指示灯
}
八、PCB设计要点
- 电源完整性: 采用4层板结构,中间层为GND和VDC平面 关键电容(如C1/C2)靠近芯片引脚 电源路径宽度≥2mm
- 信号完整性: PWM信号线做包地处理(两侧各100mil GND) 采样电路与功率电路隔离(隔离芯片ADuM1411) 添加TVS管防护(SMBJ15A)
- 热设计: MOS管底部铺铜散热(面积≥200mm²) 热敏电阻靠近IGBT模块 铝基板用于高功率区域