光伏离网并网逆变器设计方案SPWM数字控制学习资料TMS320F28335

光伏离网/并网逆变器的核心玩法就是如何把直流电折腾成交流电。这里边有个关键角色叫SPWM(正弦脉宽调制),说白了就是让开关管按照正弦规律啪啪啪通断。现在用DSP搞数字控制才是真香,TMS320F28335这货自带高精度PWM模块,拿来造逆变器简直就像用瑞士军刀削苹果。

先上段硬核代码镇楼。配置ePWM模块时咱们得这么玩:

void InitEPwm(void) {
    EPwm1Regs.TBPRD = 3750;          // 载波周期=10kHz
    EPwm1Regs.TBPHS.half.TBPHS = 0; // 相位清零
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 上下计数模式
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // 不用同步
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;       // 高速时钟不分频
    EPwm1Regs.CMPA.half.CMPA = 1875;               // 初始占空比50%
    EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;    // 计数到CMPA时拉高
    EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;  // 计数到周期值时拉低
}

这段代码在搞什么飞机?简单说就是设置PWM波的骨架——载波频率定在10kHz(TBPRD=3750对应150MHz主频下),用上下计数模式生成对称波形。CMPA寄存器就是控制脉宽的核心参数,后面咱们要动态修改它来生成正弦波。

玩过逆变器的都知道,SPWM本质就是把正弦波和三角波比大小。在数字控制里,三角波其实就是定时器的计数值上下跑,而正弦波数据得提前算好存成表。比如搞个200点的正弦表:

#pragma DATA_SECTION(SinTable, "RAMGS0")
float SinTable[200] = { 
    0.0, 0.0314, 0.0628, ..., 0.0  // 实际数据需要完整填充
};

查表时要注意相位累加器的玩法,像这样:

Uint16 spwm_index = 0;  // 相位指针
#define SAMPLE_STEP 3   // 调整这个值改变输出频率

void EPWM1_ISR(void) {
    EPwm1Regs.CMPA.half.CMPA = (Uint16)(1875 * (1 + SinTable[spwm_index]));
    spwm_index = (spwm_index + SAMPLE_STEP) % 200;
    EPwm1Regs.ETCLR.bit.INT = 1; // 清中断
}

这里藏了个骚操作:1875对应50%占空比,乘上(1+正弦值)把双极性信号转成单极性。SAMPLE_STEP控制着输出频率,当载波是10kHz时,3步长的步进对应50Hz输出(200点/(10kHz/(3*2))=50Hz)。

光伏离网并网逆变器设计方案SPWM数字控制学习资料TMS320F28335

死区时间必须安排上,不然上下管同时导通分分钟放烟花。F28335的DB模块配置起来贼方便:

EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 使能双路输出
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;      // 高有效互补
EPwm1Regs.DBRED = 50;          // 上升沿延时50ns
EPwm1Regs.DBFED = 50;          // 下降沿延时50ns

这里设置50ns死区,具体数值得看用的IGBT或MOS管的开关速度。有个坑要注意:DBRED/DBFED的数值单位是系统时钟周期,假设系统150MHz,每个时钟周期约6.67ns,50ns就需要约7.5个周期,实际得取整处理。

并网时还得玩锁相环同步电网相位,这时候F28335的捕获模块CAP派上用场。检测电网过零点:

void InitCAP(void) {
    ECap1Regs.CTRL1.bit.CAP1EN = 1;   // 使能CAP1
    ECap1Regs.CTRL1.bit.TSCTRSTOP = 1;// 开始计数
    ECap1Regs.ECEINT.bit.CEVT1 = 1;   // 允许捕获事件中断
}

捕获中断里计算电网周期,调整SPWM的相位指针spwm_index实现同步。这步要是没对齐,并网时直接变成炸机小能手。

最后放个大招——用CLA协处理器做实时计算。把SPWM生成扔给CLA,主CPU就能腾出手搞MPPT算法:

__attribute__((interrupt void)) void Cla1Task1 ( void ) {
    Cla1Regs.MVECT1.bit.VECT = (int16_t)(_Cla1sinTab[cla_index] * 1875.0);
    cla_index = (cla_index + cla_step) % 200;
}

这么搞SPWM更新完全不用占用主CPU周期,CLA的150MHz独立运行直接把控制精度提到新高度。实测THD(谐波失真)能压到3%以内,比模拟方案还顶。

整这些活的关键是吃透F28335的PWM子系统,官方文档Figure 12-3那张ePWM模块框图建议纹在眼皮上。哪天要是发现输出的SPWM像帕金森手抖,八成是CMPA更新时机不对——记住要在计数器过零时更新占空比,不然会出鬼影波形。

更多推荐