TMS320F28335/DSP28335 光伏逆变器 本装置DC-DC采用Boost升压,DCAC采用单相全桥逆变电路结构,以TI公司的浮点数字信号控制器TMS320F28335 DSP为控制电路核心,采用规则采样法和DSP片内ePWM模块功能实现PWM和SPWM波。 PV功率点跟踪(MPPT)采用了恒压跟踪法(CVT法)来实现,并用软件锁相环进行系统的同频、同相控制,控制灵活简单。 注:系统DCDC和DCAC的驱动PWM都由TMS320F28335提供,并网运行。 提供PCB,原理图(ad格式),代码,文档说明
先说硬件架构,主控用F28335这个浮点DSP是真香。自带ePWM模块能直接生成六路PWM,搞DC-DC和全桥驱动完全不用外扩芯片。这里有个坑要注意:驱动信号死区时间必须硬件设定,别指望软件延时,否则炸管分分钟教你做人。我们当时在EPwm1Regs里这么配置的:
EPwm1Regs.TBPRD = 1000; // PWM周期=系统时钟/(分频系数*TBPRD) EPwm1Regs.CMPA.half.CMPA = 500; // 占空比50% EPwm1Regs.DBCTL.bit.OUT_MODE = 0x3; // 上下管互补模式 EPwm1Regs.DBCTL.bit.POLSEL = 0x2; // 下降沿插入死区 EPwm1Regs.DBFED = 50; // 死区时间=50*时钟周期这段代码里CMPA值直接决定占空比,重点在死区配置。DBFED寄存器设成50是根据MOSFET的开关时间实测调整的,具体数值得看你的驱动芯片参数。
再来说说SPWM生成。用规则采样法比自然采样法计算量小很多,适合实时控制。核心思路就是查正弦表配合PWM周期更新。我们建了个256点的正弦表,用EPWM定时器触发ADC采样同时更新占空比:
#pragma DATA_SECTION(SinTable, "sin_tbl"); const Uint16 SinTable[256] = { 512,518,525,...,512 // 生成工具算好的量化值 }; interrupt void EPWM1_ISR(void){ static Uint8 index = 0; EPwm1Regs.CMPA = SinTable[index++]; if(index >= 256) index = 0; // 同步执行电压电流采样 AdcRegs.ADCSOCFRC1.bit.SOC0 = 1; }这里有个骚操作:把正弦表放在特定存储区域防止被意外修改。中断频率设的是10kHz,配合256点表格刚好输出50Hz基波。
MPPT部分用了恒压跟踪,虽然比扰动观测法简单,但要注意温度补偿。程序里设了个电压阈值,当光伏板电压低于18V时自动降低占空比:
if(PV_Voltage < 18.0){ Boost_Duty -= 0.01; // 小步长调整 }else if(PV_Voltage > 18.5){ Boost_Duty += 0.01; } // 限幅保护 Boost_Duty = (Boost_Duty > 0.85) ? 0.85 : Boost_Duty; Boost_Duty = (Boost_Duty < 0.15) ? 0.15 : Boost_Duty;这算法简单粗暴但有效,实测在光照突变时响应速度够用。关键是AD采样必须做均值滤波,我们用了移动平均滤波,代码里是这么玩的:
#define SAMPLE_NUM 16 Uint16 adcBuf[SAMPLE_NUM]; float Get_AdcAverage(){ static Uint8 ptr = 0; adcBuf[ptr++] = AdcResult.ADCRESULT0; if(ptr >= SAMPLE_NUM) ptr = 0; Uint32 sum = 0; for(int i=0; i<SAMPLE_NUM; i++){ sum += adcBuf[i]; } return sum * 3.0 / 4096.0 / SAMPLE_NUM; // 转实际电压值 }最后说说软件锁相环。用DSP实现比硬件锁相省成本,关键是要准确捕获电网过零点。我们用了双二阶滤波器配合PI调节,这部分代码有点复杂,核心逻辑是:
void PLL_Update(float gridVoltage){ static float integrator = 0.0; // 正交信号生成 float alpha = gridVoltage; float beta = delayUnit; // 延迟90度 // 鉴相器 float error = alpha * beta_prev - beta * alpha_prev; // PI调节 integrator += Ki * error; float pllOutput = Kp * error + integrator; // 更新频率 PLL_Freq = 50.0 + pllOutput; // 限制在47-53Hz PLL_Freq = (PLL_Freq >53)?53:((PLL_Freq<47)?47:PLL_Freq); }调试时发现电网谐波会影响锁相精度,后来在AD采样前加了二阶低通滤波才解决。现在这套系统THD能做到3%以内,够过国标了。
PCB布局有个血泪教训:数字地和功率地必须单点连接!最初版本没处理好,导致AD采样全是毛刺。后来把DSP的电源单独走线,模拟部分用磁珠隔离才好。原理图里光耦驱动部分要留够裕量,我们用的HCPL316J直接驱动IGBT,每个通道都加了负压关断。
代码仓库里有个Util文件夹放着自写的SCI调试工具,用串口发指令能实时修改PWM参数,比CCS在线调试方便得多。比如发送"PWM 700"可以直接修改载波频率,这对现场调试太有用了。