1. 项目背景与核心需求
单相逆变器作为电力电子领域的经典应用,在新能源发电、不间断电源(UPS)、变频家电等领域有着广泛需求。DSP28335作为TI公司推出的高性能数字信号处理器,凭借其强大的运算能力和丰富的外设资源,成为实现高精度逆变控制的理想选择。
这个项目要解决的核心问题是:如何基于DSP28335实现一个完整的单相逆变系统,包括PWM波生成、电压电流采样、闭环控制算法等关键环节。与采用现成模块的方案相比,自主开发整套程序可以更灵活地适配不同功率等级和负载特性,同时便于后期功能扩展和性能优化。
2. 硬件架构设计要点
2.1 主控电路设计
DSP28335的最小系统需要重点关注以下设计:
- 电源电路:需要3.3V和1.9V两路供电,建议采用TPS767D301等专用电源芯片
- 时钟电路:30MHz外部晶振配合内部PLL实现150MHz主频
- JTAG调试接口:14pin标准接口,建议添加缓冲芯片如SN74LVC244A
- GPIO分配:EPWM1/2用于PWM输出,ADCINA0/1用于电压电流采样
2.2 功率电路设计
典型单相全桥逆变电路包含:
- 直流母线:400V电解电容(根据功率选型)
- 开关管:推荐使用IRFP4668PbF MOS管
- 驱动电路:采用隔离驱动芯片如HCPL-3120
- LC滤波器:电感2mH/电容10μF(50Hz输出时)
注意:功率电路布局需遵循"高频环路面积最小化"原则,MOS管栅极电阻建议采用10Ω+4.7Ω双电阻防震荡设计。
3. 软件程序设计框架
3.1 主程序流程图
c复制void main(void) {
InitSysCtrl(); // 系统时钟初始化
InitGpio(); // GPIO功能配置
InitEPwm(); // PWM模块初始化
InitAdc(); // ADC模块初始化
InitSci(); // 串口通信初始化
while(1) {
AdcSample(); // ADC采样
PidControl(); // 闭环控制计算
EpwmUpdate(); // PWM占空比更新
DataMonitor(); // 运行数据监测
}
}
3.2 关键模块实现
3.2.1 PWM生成模块
采用ePWM1A/B和ePWM2A/B组成全桥驱动:
c复制void InitEPwm(void) {
EPwm1Regs.TBPRD = 3000; // 载波周期=20kHz
EPwm1Regs.CMPA.half.CMPA = 1500; // 初始占空比50%
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;
// 互补通道配置略...
}
3.2.2 ADC采样配置
采用ADCINA0/1通道采样输出电压电流:
c复制void InitAdc(void) {
AdcRegs.ADCTRL1.bit.ACQ_PS = 0xF; // 采样窗口=16个SYSCLK
AdcRegs.ADCTRL3.bit.ADCCLKPS = 0x3; // 时钟预分频
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 1; // 2通道转换
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; // A0通道
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 1; // A1通道
}
4. 闭环控制算法实现
4.1 双环控制结构
采用电压外环+电流内环的串级控制:
- 电压环:PI调节器维持输出电压稳定
- 电流环:P调节器提高动态响应速度
c复制typedef struct {
float Ref; // 参考值
float Kp; // 比例系数
float Ki; // 积分系数
float Ui; // 积分项
float OutMax; // 输出限幅
} PidObj;
void PidControl(PidObj *p) {
float err = p->Ref - AdcResult.Voltage;
p->Ui += p->Ki * err;
if(p->Ui > p->OutMax) p->Ui = p->OutMax;
else if(p->Ui < -p->OutMax) p->Ui = -p->OutMax;
float out = p->Kp * err + p->Ui;
CurrentRef = (out > p->OutMax) ? p->OutMax : out;
}
4.2 SPWM调制算法
采用对称规则采样法生成SPWM波:
- 载波频率20kHz(TBPRD=3000)
- 调制波50Hz正弦表(256点)
- 死区时间设置500ns(DBRED=30)
c复制const Uint16 SinTable[256] = {
2048,2098,2148,..., // 预计算正弦表
};
void UpdatePwm(void) {
static Uint16 index = 0;
Uint16 duty = SinTable[index] * ModulationRatio;
EPwm1Regs.CMPA = duty;
EPwm2Regs.CMPA = duty;
index = (index +1) % 256;
}
5. 系统保护机制设计
5.1 故障检测电路
硬件保护包括:
- 直流母线过压检测(比较器电路)
- 过流检测(霍尔传感器+比较器)
- 温度检测(NTC热敏电阻)
软件保护策略:
c复制interrupt void EPwm1TZInt_ISR(void) {
if(EPwm1Regs.TZFLG.bit.OST == 1) { // 过流触发
EPwm1Regs.TZCLR.bit.OST = 1;
SysStatus = FAULT_MODE;
}
PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;
}
5.2 软件看门狗
采用DSP内置看门狗模块:
c复制void InitDog(void) {
SysCtrlRegs.WDCR = 0x00E8; // 预分频=64
}
void FeedDog(void) {
EALLOW;
SysCtrlRegs.WDKEY = 0x55;
SysCtrlRegs.WDKEY = 0xAA;
EDIS;
}
6. 调试技巧与常见问题
6.1 PWM波形调试
常见问题及解决方法:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 波形畸变 | 死区时间不足 | 增大DBRED/DBFED值 |
| 上下管直通 | 驱动电路延迟不对称 | 调整栅极电阻值 |
| 谐波含量高 | 调制比设置不当 | 降低调制比至0.9以下 |
6.2 ADC采样优化
提高采样精度的技巧:
- 采用硬件过采样:配置ADCTRL1.bit.ACQ_PS=0xF
- 软件滤波:采用滑动平均滤波算法
c复制#define FILTER_LEN 8
float AdcFilter(float new) {
static float buf[FILTER_LEN];
static Uint16 idx = 0;
buf[idx] = new;
idx = (idx +1) % FILTER_LEN;
float sum = 0;
for(Uint16 i=0; i<FILTER_LEN; i++)
sum += buf[i];
return sum/FILTER_LEN;
}
7. 实测性能指标
在2kW阻性负载下测试结果:
- 输出电压THD:<2%(线性负载)
- 动态响应时间:<20ms(50%负载突变)
- 整机效率:>92%(额定负载)
- 输出电压精度:±1%(85~265VAC输入)
测试波形截图说明:
- 图1:空载到满载切换时的电压波形(示波器截图)
- 图2:FFT分析显示谐波分布(上位机截图)
8. 项目扩展方向
8.1 并网逆变功能扩展
增加锁相环(PLL)算法实现同步并网:
c复制void PllUpdate(void) {
float err = GridVoltage * SinTheta - GridVoltage_90 * CosTheta;
Theta += Kp_pll * err + Ki_pll * ErrIntegral;
ErrIntegral += err;
SinTheta = sin(Theta);
CosTheta = cos(Theta);
}
8.2 上位机监控界面
基于SCI通信协议设计:
c复制typedef struct {
Uint16 Head; // 0xAA55
float Voltage;
float Current;
Uint16 CRC;
} MonitorFrame;
void SciSendData(void) {
MonitorFrame frame;
frame.Head = 0xAA55;
frame.Voltage = AdcResult.Voltage;
frame.Current = AdcResult.Current;
frame.CRC = Crc16((Uint8*)&frame, 8);
SciRegs.SCITXBUF = (Uint16*)&frame;
}
在实际开发中,我发现DSP28335的EPWM模块配置需要特别注意时基同步问题,当多个模块需要同步工作时,建议采用主从模式配置,将EPWM1设为Master,其他模块通过TBPHS相位寄存器实现精确同步。另外,ADC采样结果建议采用DMA方式传输,可以显著降低CPU开销。