基于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_CURRENTZiegler-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频率16kHz16.02kHz
电流环带宽1kHz980Hz
速度环响应时间<100ms85ms
THD❤️%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设计要点

  1. 电源完整性: 采用4层板结构,中间层为GND和VDC平面 关键电容(如C1/C2)靠近芯片引脚 电源路径宽度≥2mm
  2. 信号完整性: PWM信号线做包地处理(两侧各100mil GND) 采样电路与功率电路隔离(隔离芯片ADuM1411) 添加TVS管防护(SMBJ15A)
  3. 热设计: MOS管底部铺铜散热(面积≥200mm²) 热敏电阻靠近IGBT模块 铝基板用于高功率区域
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值