基于DSP28335芯片实现SVPWM程序解析

一、SVPWM核心原理

  1. 坐标变换
    • Clarke变换:将三相电流(\(Ia, Ib, Ic\))转换为两相静止坐标系(\(Iα, Iβ\)
      \(I_lpha = \frac{2}{3}(I_a - \frac{1}{2}I_b - \frac{1}{2}I_c)\)
      \(I_eta = \frac{\sqrt{3}}{3}(I_b - I_c)\)
    • Park变换:将静止坐标系转换为旋转坐标系(Id, Iq)
      \(I_d = I_lpha \cos heta + I_eta \sin heta\)
      \(I_q = -I_lpha \sin heta + I_eta \cos heta\)
  2. 扇区判断
    根据目标电压矢量(\(Vα, Vβ\))的角度θ,划分6个扇区(每60°一个扇区),通过查表法确定相邻非零矢量作用顺序。
  3. 作用时间计算
    相邻矢量作用时间公式:
    \(Tx=Ts⋅Vdc3∣Vref∣sin(60∘−heta)\)
    \(Ty=Ts⋅Vdc3∣Vref∣sin(heta)\)
    \(T0=Ts−Tx−Ty\)
    其中\(Ts\)\(PWM\)周期,\(Vdc\)为直流母线电压。

二、DSP28335硬件优势

  1. 高精度PWM模块
    • 150ps分辨率,支持死区时间配置(如1.6%死区补偿)
    • 互补输出模式(ePWM1A与ePWM1B互补导通)
  2. 硬件FPU加速
    浮点运算单元提升坐标变换和三角函数计算效率,减少中断延迟。
  3. ADC同步采样
    配置ADC模块与PWM同步触发,实时采集三相电流。

三、软件实现步骤

1. 外设初始化

// ePWM模块配置(以ePWM1为例)
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;      // 每周期触发一次中断

// ADC模块配置
AdcRegs.ADCCTL2.bit.INTPULSE_POS = 1;    // 中断在转换结束上升沿触发
AdcRegs.ADCSOC0CTL.bit.CHSEL = ADC_CH_A0; // 采样通道配置

2. 中断服务程序(ISR)

interrupt void EPwm1_ISR(void) {
    // 1. 读取ADC采样值
    AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清除中断标志
    Ia = AdcResult.ADCRESULT0;            // 读取A相电流
    
    // 2. Clarke-Park变换
    float I_alpha = (2.0/3.0) * (Ia - 0.5*Ib - 0.5*Ic);
    float I_beta = (sqrt(3)/3.0) * (Ib - Ic);
    
    // 3. 扇区判断与作用时间计算
    int sector = GetSector(I_alpha, I_beta);
    float Tx, Ty, T0;
    CalculateDutyCycle(&Tx, &Ty, &T0, sector);
    
    // 4. 更新PWM占空比
    EPwm1Regs.CMPA.half.CMPA = (Tx + T0/2) * 9375; // 基准值偏移
    EPwm2Regs.CMPA.half.CMPA = (Ty + T0/2) * 9375; // 互补通道
}

3. 关键函数实现

// 扇区判断函数
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;
    // ... 其他扇区判断
}

// 作用时间计算函数
void CalculateDutyCycle(float *Tx, float *Ty, float *T0, int sector) {
    static const float Vdc = 12.0; // 直流母线电压
    float Vref = 6.0;              // 参考电压幅值
    *Tx = (sqrt(3) * Vref / Vdc) * sin((sector-1)*60*PI/180);
    *Ty = (sqrt(3) * Vref / Vdc) * sin(sector*60*PI/180);
    *T0 = 1.0 - *Tx - *Ty;
}

四、优化与调试技巧

  1. 死区补偿
    通过硬件死区模块(EPWMA反转极性)或软件补偿算法,防止IGBT直通:

    EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 启用死区
    EPwm1Regs.DBRED = 150;      // 死区时间(150ns)
    EPwm1Regs.DBFED = 150;
    
  2. 性能优化

    • 使用查表法替代实时三角函数计算
    • 开启编译器优化选项(-O2)
    • 减少中断服务程序中的浮点运算量
  3. 调试方法

    • 示波器观察PWM波形对称性
    • 逻辑分析仪验证死区时间
    • 电流谐波分析(FFT)评估调制效果

参考代码 基于DSP28335芯片的SVPWM程序 www.youwenfan.com/contentcnn/56819.html

五、扩展应用

结合AD采样实现闭环控制:

// 闭环PI控制示例
float Speed_Error = Target_Speed - Measured_Speed;
Integral += Speed_Error * Ts;
float Vd = Kp * Speed_Error + Ki * Integral;
SVPWM_SetReference(Vd); // 更新SVPWM参考电压

建议参考TI官方例程(如epwm_svpwm.c)进行深度优化,并配合《TMS320F28335 Technical Reference Manual》配置外设寄存器。

posted @ 2025-12-10 12:01  小前端攻城狮  阅读(0)  评论(0)    收藏  举报