TMS320F28335光伏离并网逆变器设计方案及SPWM数字控制技术学习资料
光伏离网并网逆变器设计方案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更新时机不对——记住要在计数器过零时更新占空比,不然会出鬼影波形。
更多推荐
所有评论(0)