1. 项目概述与硬件平台选型
在电力电子控制领域,DSP28335凭借其出色的实时处理能力成为逆变器开发的理想选择。这款32位浮点DSP控制器主频高达150MHz,内置12位16通道ADC模块和18路PWM发生器,为单相逆变系统提供了完整的硬件支持。我最近完成的一个太阳能储能项目就采用了这套方案,实测输出波形THD(总谐波失真)可控制在3%以内,完全满足家用光伏并网要求。
硬件平台的核心配置如下:
- 主控芯片:TMS320F28335PGFA(工业级)
- 功率模块:采用IPM智能功率模块FSBB30CH60F,集成驱动和保护电路
- 采样电路:电流采样用LEM LA55-P,电压采样用电阻分压+隔离运放
- 显示界面:12864液晶屏,通过SPI接口与DSP通信
关键提示:DSP28335的PWM死区时间可编程范围是0-1023个系统时钟周期,在实际调试中需要根据功率管开关特性精确设置,一般建议留出200ns以上的安全裕量。
2. 系统软件架构设计
2.1 主程序流程图解析
整个系统采用前后台架构,主循环处理显示和通信等非实时任务,中断服务程序处理关键时序控制:
c复制void main(void) {
InitSysCtrl(); // 系统时钟初始化
InitPieCtrl(); // 中断控制器初始化
InitGpio(); // GPIO配置
InitEPwm(); // PWM模块初始化
InitAdc(); // ADC模块初始化
InitSPI_LCD(); // LCD接口初始化
while(1) {
Display_Update(); // 刷新显示数据
Protection_Check();// 保护状态监测
if(Comm_Flag) UART_Process(); // 串口通信处理
}
}
2.2 实时中断服务程序
PWM周期中断作为系统时序基准,在中断服务程序中完成所有实时控制算法:
c复制interrupt void epwm1_isr(void) {
AdcResult = ReadAdc(); // 读取ADC采样值
PLL_Update(); // 锁相环计算
CurrentLoop(); // 电流环控制
VoltageLoop(); // 电压环控制
EPwm1Regs.ETCLR.bit.INT = 1; // 清除中断标志
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
3. 关键模块实现细节
3.1 ADC采样模块优化
ADC配置需要特别注意采样窗口与PWM周期的同步关系。我们采用EPWM1触发ADC采样,确保采样时刻避开功率管开关噪声:
c复制void InitAdc(void) {
AdcRegs.ADCTRL1.bit.ACQ_PS = 0xF; // 采样窗口=15个ADC时钟
AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x3; // ADC时钟分频=CPUCLK/4
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 级联序列器模式
AdcRegs.ADCMAXCONV.all = 0x0003; // 4个转换通道
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; // 通道0:直流母线电压
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 1; // 通道1:输出电流
// ...其他通道配置
}
实测经验:在PCB布局时,ADC输入引脚需要添加RC滤波(典型值1kΩ+100nF),并确保模拟地AGND与数字地DGND单点连接,这样可将采样噪声降低约40%。
3.2 PWM调制策略实现
采用单极性倍频调制方式,配置要点包括:
c复制void InitEPwm(void) {
EPwm1Regs.TBPRD = 3750; // 20kHz PWM (150MHz/3750/2)
EPwm1Regs.TBPHS.half.TBPHS = 0;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 增减计数模式
EPwm1Regs.CMPA.half.CMPA = 1875; // 初始占空比50%
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 计数增时置高
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 计数减时置低
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 死区使能
EPwm1Regs.DBRED = 30; // 上升沿死区=30个时钟(200ns)
EPwm1Regs.DBFED = 30; // 下降沿死区
}
调试中发现,当输出电流超过10A时,需要将死区时间调整为35个时钟周期(约233ns)才能避免桥臂直通。
4. 锁相环(PLL)实现技巧
4.1 软件锁相环设计
采用基于二阶广义积分器(SOGI)的锁相方案,关键代码如下:
c复制typedef struct {
float x1, x2; // 状态变量
float k, w; // 增益和基波频率
} SOGI_Type;
void SOGI_Update(SOGI_Type *p, float u) {
float dx1 = p->w*(p->k*u - p->x1 - p->x2);
float dx2 = p->w*p->x1;
p->x1 += dx1 * Ts; // Ts为控制周期
p->x2 += dx2 * Ts;
}
float PLL_Update(float u, float *phase) {
static SOGI_Type sogi = {0};
static float integrator = 0;
float q = sogi.x1; // 正交分量
float error = u * q; // 鉴相器输出
integrator += Ki_PLL * error * Ts;
float freq = Kp_PLL * error + integrator;
*phase += 2*PI * freq * Ts;
sogi.w = 2*PI * (50 + freq); // 频率自适应
SOGI_Update(&sogi, u);
return freq;
}
参数整定经验:Kp_PLL一般取0.5-2.0,Ki_PLL取Kp_PLL的1/10,调试时可先给阶跃频率扰动观察锁定速度。
5. 保护机制实现方案
5.1 分级保护策略
系统实现三级保护机制:
- 硬件比较器:响应时间<500ns
- PWM模块自触发:响应时间<100ns
- 软件保护:每个PWM周期检测
保护触发逻辑配置示例:
c复制void InitTZ(void) {
EPwm1Regs.TZSEL.bit.OSHT1 = 1; // 启用Trip1单次触发
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_HI; // 故障时PWMxA拉高
EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_HI; // PWMxB拉高
EPwm1Regs.TZEINT.bit.OST = 1; // 使能单次触发中断
}
interrupt void TZ1_ISR(void) {
System_Status = FAULT_MODE;
EPwm1Regs.TZCLR.bit.OST = 1; // 清除故障标志
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
5.2 保护参数设置
关键保护阈值设置原则:
- 过流保护:1.2倍额定电流,延时5ms
- 过压保护:1.15倍额定电压,延时10ms
- 欠压保护:0.85倍额定电压,延时20ms
6. LCD显示模块开发
采用状态机方式管理显示内容,主要界面包括:
- 主界面:输出电压/电流/频率
- 参数设置:保护阈值、控制参数
- 故障记录:最近5次故障信息
显示刷新优化技巧:
c复制void Display_Update(void) {
static uint16_t counter = 0;
if(++counter >= 50) { // 约1秒刷新一次
counter = 0;
SPI_SendString(0, 0, "Uout:%5.1fV", Voltage_Out);
SPI_SendString(0, 1, "Iout:%5.2fA", Current_Out);
// ...其他显示内容
}
}
在调试中发现,SPI时钟频率超过1MHz时会出现显示乱码,最终设置为500kHz工作稳定。
7. 系统调试经验总结
7.1 常见问题排查
-
PWM无输出:
- 检查EPWM时钟使能位(EPwmXRegs.TBCTL.bit.PHSEN)
- 验证GPIO复用配置(GPAMUX寄存器)
-
ADC采样值异常:
- 测量模拟输入电压是否在0-3V范围
- 检查ADC校准值(AdcRegs.ADCOFFTRIM)
-
锁相环失锁:
- 检查输入信号幅值是否足够
- 调整SOGI的K参数(建议0.8-1.2)
7.2 性能优化记录
通过以下优化将系统效率从92%提升到95.5%:
- 将PWM开关频率从10kHz提高到20kHz
- 优化死区时间设置(最终确定为220ns)
- 采用三阶LC滤波器替代原二阶设计
这个项目让我深刻体会到,电力电子控制既是科学也是艺术。每个参数的微调都可能影响整体性能,需要反复实验验证。建议新手一定要做好实验记录,建立参数变化与性能指标的对应关系表,这对快速定位问题非常有帮助。