之前做光伏储能样机的时候,我卡得最久的地方不是功率板焊接,也不是 DCDC 调压,而是“拓扑怎么选”和“DSP 控制算法怎么写”这两件事。网上的资料要么只讲 H4 桥并网,要么只丢一个控制框图,真正把 Heric 拓扑、TMS320F280039C 外设配置、并网控制环路和 PCB 设计要点串起来的教程很少。本文以 7.2kW 单相光伏储能 Heric 并网逆变器为例,完整梳理从系统架构、硬件设计要点到 DSP 控制算法实现的全流程,项目资料包含 DSP 代码、PCB 和原理图,文章重点讲解其中的控制算法研究与工程落地思路。
适合阅读本文的读者有三类:一是正在做光伏并网逆变器、储能变流器相关课题的学生;二是想把 Heric 拓扑从仿真搬到实物、但卡在 DSP 外设和控制算法细节上的工程师;三是准备做数字电源方向、想系统了解 C2000 系列开发方法的人。读完你会搞清楚:为什么选 Heric 而不是 H5 或 H4,TMS320F280039C 的哪些外设是专门为数字电源准备的,单相并网锁相环和电流环怎么写,以及样机调试时最容易踩的坑是什么。
1. 背景与核心概念
1.1 Heric 拓扑解决了什么问题
无变压器并网逆变器因为体积小、成本低、效率高,已经成为户用光伏和储能的主流方案。但去掉工频变压器后,光伏组件对地寄生电容和电网之间会形成共模回路。桥臂开关管高频动作时,共模电压不断跳变,会在这条回路上激励出高频漏电流。漏电流过大会带来三个问题:超过安规限值、降低并网电能质量、还可能带来触电隐患。
H5 拓扑和 Heric 拓扑都是为抑制无变压器拓扑共模漏电流而设计的。H5 是在 H4 桥的直流侧增加了一个开关管,续流阶段通过直流侧开关管切断桥臂与直流母线的联系。Heric 则是在 H4 桥的交流侧增加由两个反向串联开关管组成的双向旁路支路,续流阶段电流走交流旁路,桥臂开关管全部关断,电感电流不再经过桥臂续流。这样一来,续流期间各点电位被钳位,共模电压变化幅度大幅减小,漏电流也就被压住了。
从效率角度看,Heric 拓扑在部分负载下比 H5 更有优势,因为续流损耗走旁路开关,不经过主开关管。这就是为什么 7.2kW 单相光伏储能逆变器经常选择 Heric 拓扑。它的代价是多了两个交流旁路开关管,控制时序和驱动电路会稍微复杂一些,但这对 DSP 控制来说并不是难事。
1.2 为什么选择 TMS320F280039C
TMS320F280039C 属于 TI C2000 实时 MCU 系列,定位就是数字电源、电机控制和电池管理。相比普通 MCU,它有几个非常契合并网逆变器控制的特性。
首先是浮点运算单元 FPU。7.2kW 单相并网控制中会大量使用浮点运算,比如 SOGI 锁相环、准 PR 控制器、功率计算,浮点 MCU 写起来比定点 MCU 省心很多,不容易出现标幺化和 Q 格式转换导致的精度问题。
其次是 TMU 三角函数加速单元。单相 PLL、正余弦计算、坐标变换会频繁调用 sin、cos 这类函数,TMU 能缩短这些计算的执行时间,保证 20kHz 中断里算法跑得完。
第三是 CLA 控制律加速器。CLA 可以看成是一个能独立运行的控制协处理器,它可以直接访问 ADC 结果寄存器,并行执行一些简单控制算法。对于后续想扩展 MPPT、电池管理或者更复杂控制策略的开发者来说,CLA 能释放主 CPU 的负载。
另外,C2000 的 EPWM 模块和 ADC 触发机制对数字电源非常友好。EPWM 可以产生带死区的互补 PWM,ADC 可以由 EPWM 事件触发采样,确保每个开关周期在固定时刻采样,这对电流环的性能至关重要。CMPSS 比较器子系统还能实现硬件级过流保护,不依赖软件响应时间。
1.3 7.2kW 单相光伏储能系统架构
7.2kW 单相光伏储能系统通常不是一级拓扑,而是多级结构。光伏组件先经过 Boost 变换器做 MPPT,把光伏电压抬升到直流母线电压;储能电池通过双向 Buck-Boost 变换器接到直流母线;直流母线再经过 Heric 逆变桥、交流滤波电感和继电器接入电网。有些方案会把电池直接并联在直流母线上,母线电压由电池电压决定,光伏 Boost 负责能量搬运。具体拓扑结构要根据电池电压范围和电网电压范围来确定。
从功率量级上看,7.2kW 在 220V 单相电网下的电流有效值约为 32.7A,峰值接近 46A。这决定了功率管选型、母线电容、电感、采样电路量程和 PCB 走线宽度,后续所有硬件设计都要围绕这个电流等级展开。
DSP 控制板负责以下任务:采样光伏电压电流、电池电压电流、直流母线电压、电网电压、并网电流;运行 MPPT 算法、充放电管理、母线电压环、并网电流环和锁相环;输出 PWM 驱动 Heric 主开关管和旁路开关管;控制并网继电器和预充电回路;实现过压、过流、过温保护。
2. 系统方案与硬件设计要点
2.1 功率主回路设计
功率主回路的架构可以分成前级变换器和后级 Heric 逆变器两部分。前级变换器负责把光伏和电池的能量统一汇到直流母线,同时稳定母线电压;后级 Heric 逆变器负责把直流母线能量转换成与电网同频同相的正弦电流馈入电网,或者反过来从电网取电给电池充电。
后级 Heric 主回路核心器件是四个主开关管和两个交流旁路开关管。主开关管承受的是直流母线电压,交流旁路开关管因为存在反向串联结构,每个管子承受的电压和应力与主开关管不同。7.2kW 功率等级下,开关频率通常取 16kHz 到 24kHz,本文按 20kHz 讲解。选择 IGBT 还是 SiC MOSFET,取决于成本、效率目标和散热方案,不能只看电流等级,还要看开关损耗和续流二极管反向恢复特性。
交流侧滤波器一般使用 L 或 LCL 结构。L 滤波结构简单、控制容易,但电感体积大;LCL 滤波高频衰减能力强,总电感量更小,但存在谐振峰,需要无源阻尼或有源阻尼,控制上更复杂。7.2kW 单相并网逆变器工程上更常见的是 LCL,但为了先把控制算法跑通,样机阶段先用 L 滤波器比较稳妥。
母线电容的作用是维持直流母线电压稳定、吸收前后级功率脉动。单相并网逆变器存在固有二倍频功率脉动,母线电容需要足够大,这也直接影响成本和体积。
2.2 控制板设计要点
控制板的核心是 TMS320F280039C 最小系统,包括电源供电、时钟、复位、JTAG 下载电路和启动配置。DSP 供电通常是 3.3V,需要独立的电源芯片,并且要与功率板的驱动电源隔离。
采样电路设计非常关键。电网电压采样建议用电阻分压加差分运放,把 ±311V 的电网电压映射到 ADC 可接受的 0 到 3.3V 范围。并网电流采样可以用霍尔传感器、隔离运放或采样电阻加隔离放大器,7.2kW 电流较大,流经采样电阻的损耗不可忽略,霍尔方案更常见。直流母线电压采样与电网电压采样类似,但要注意母线电压是单极性,偏置设计不同。
驱动电路方面,主开关管和旁路开关管都需要隔离驱动。驱动芯片应具备足够的峰值电流能力,最好带负压关断和米勒钳位,防止开关管在高 dv/dt 下误开通。旁路开关管因为是交流回路,需要根据实际电压方向设计驱动电源。
保护电路不能只靠软件。硬件层面要设计过流比较电路,快速封锁 PWM;DSP 内部使用 CMPSS 比较器,把 ADC 采样电流与阈值比较,一旦超限立刻触发 EPWM 的 TZ 动作,强行把 PWM 输出置为安全状态。这个响应速度在微秒级,是软件中断做不到的。
2.3 PCB 布局与安全设计
PCB 布局直接决定样机能否稳定工作。功率部分按电流走向布置,母线电容尽量靠近桥臂,减小功率回路的寄生电感;驱动信号走线要短,驱动芯片靠近功率管;采样走线要远离高频开关节点,采用差分走线降低干扰。功率地和信号地要分开,最后在单点汇合,避免采样地受功率地噪声污染。
安全方面必须强调:并网逆变器直流母线电压高达几百伏,调试时不能直接用手触碰功率部分。建议使用隔离变压器或调压器对电网输入降压,示波器使用差分探头,先低压验证控制算法,再逐步升压到额定工况。如果实验条件允许,最好在功率板和电网之间串联一个限流电阻或调压器,限制意外故障时的电流冲击。
3. 开发环境与软件工程搭建
3.1 CCS 与 C2000Ware 环境
TMS320F280039C 的开发环境是 TI Code Composer Studio,也就是 CCS。新建工程时建议直接基于 C2000Ware 中的 F28003x 例程修改,而不是从空目录手写。C2000Ware 里包含了芯片外设驱动库、位域定义头文件和大量可运行的示例工程,比如 EPWM 产生 PWM、ADC 采样、CMPSS 过流保护等。
版本方面以你手头安装的 CCS 和 C2000Ware 版本为准,不同版本之间构建系统可能不同,有基于工程文件的项目方式,也有基于 CMake 的方式。本文不讲具体版本号,重点演示配置思路。刚开始接触时,先跑通一个简单的 LED 闪烁例程,确认仿真器连接、编译下载链路正常,再往里面添加外设初始化代码。
需要注意 F280039C 的引脚复用功能很多,同一个引脚可能是 GPIO、ADC、EPWM、SCI、SPI 中的多个功能。修改引脚分配时,要对照数据手册确认复用关系,同时在 GpioCtrlRegs 中正确配置输入输出方向和内部上拉状态。
3.2 工程文件结构
控制算法涉及的代码模块比较多,建议按功能分层组织。下面是一个适合并网逆变器项目的目录结构示例:
project/ ├── src/ │ ├── main.c │ ├── system_init.c │ ├── adc_driver.c │ ├── epwm_driver.c │ ├── protection.c │ ├── pll_sogi.c │ ├── current_control.c │ ├── voltage_control.c │ └── isr.c ├── include/ │ ├── system_init.h │ ├── adc_driver.h │ ├── epwm_driver.h │ ├── protection.h │ ├── pll_sogi.h │ ├── current_control.h │ └── voltage_control.h └── hardware/ └── board_config.hboard_config.h用来放硬件相关的宏定义,比如采样系数、ADC 通道映射、PWM 频率、控制周期、保护阈值等。这样换一块硬件时,只需要修改这个头文件,不需要大改算法代码。
3.3 外设初始化顺序
外设初始化顺序看起来简单,但顺序错了会导致采样异常或 PWM 误动作。推荐顺序是:
- 关闭看门狗,初始化系统时钟。
- 初始化 GPIO 复用功能。
- 初始化 ADC,配置采样通道和触发源,并将结果寄存器关联到 EPWM 触发事件。
- 初始化 EPWM,配置载波频率、死区、比较值初始值。
- 初始化 CMPSS 硬件过流保护,绑定到 EPWM 的 TZ 保护输入。
- 初始化 PIE 中断向量表,注册 PWM 中断服务函数。
- 全局开中断,启动 EPWM。
初始化 EPWM 时,默认比较值要设置成不会导致过大占空比输出的安全值,避免初始化瞬间输出异常驱动信号。CMPSS 的过流阈值也要在使能 PWM 前配置好,否则可能出现“启动即炸管”的问题。
4. 核心控制算法拆解
4.1 单相锁相环 SOGI-PLL
并网逆变器工作的前提是输出电流与电网电压同频同相。三相系统可以直接用 Clarke 变换和 Park 变换得到电网电压矢量角度,单相系统只有一个电压信号,没有办法直接做 dq 变换,所以要先构造一个与电网电压正交的虚拟信号。
最常用的方法是 SOGI 二阶广义积分器。SOGI 输入单相电网电压,输出两个信号:一个与原电压同相位的 alpha 轴分量,另一个是滞后 90 度的 beta 轴分量。有了这两个正交分量,就可以把单相系统看成静止坐标系下的两相系统,后续做 Park 变换得到 dq 分量。
SOGI 还有一个好处,它本身是一个谐振于电网频率的滤波器,对输入电压中的谐波有一定抑制作用,锁相环得到的角度比直接过零检测稳定得多。
4.2 直流母线电压外环
直流母线电压环的任务是维持母线电压稳定。在两级式结构中,后级逆变器控制并网功率,前级变换器控制母线电压,或者反过来由后级控制母线电压。对于光伏储能系统,通常做法是:光伏 Boost 执行 MPPT,电池双向变换器稳定母线电压,并网逆变器按功率指令向电网输送电流。
母线电压环的输出一般作为并网电流的幅值参考。电网电压基本不变,要输出更大的有功功率,就需要增大并网电流幅值。这里要注意电压环带宽和电流环带宽必须拉开差距。电流环带宽可以设计到 1kHz 左右,电压环带宽通常只有 100Hz 左右,否则两个环路相互作用,会出现母线电压振荡和并网电流波动。
由于单相系统存在二倍频功率脉动,母线电压本身会存在 100Hz 的纹波,电压环控制器不能对 100Hz 纹波响应太强,否则会把二倍频纹波引入电流参考,导致并网电流谐波变大。工程上可以在电压环输出后加陷波器,或者降低电压环带宽,把 100Hz 分量滤掉。
4.3 准 PR 电流内环
并网电流控制的本质是让电感电流跟踪一个与电网电压同频同相的正弦参考值。在 dq 旋转坐标系下,可以用 PI 控制器实现无静差跟踪,但需要解耦和坐标变换;在静止坐标系下,如果直接用 PI 控制器跟踪正弦波,会有稳态误差,因为它对正弦信号没有无穷大增益。
PR 控制器能解决这个问题。PR 控制器的传递函数在谐振频率处增益非常大,可以对正弦参考实现无静差跟踪。不过实际电网频率会波动,纯 PR 控制器在频率偏离谐振点时增益迅速下降,工程中更常用的是准 PR 控制器,引入一个带宽系数 wc,让谐振点附近保持足够增益,又不会对频率偏移过于敏感。
准 PR 控制器的调节参数主要有三个:Kp 决定动态响应速度,Kr 决定谐振增益大小,wc 决定谐振带宽。一般先根据系统带宽要求确定 Kp,再逐步增大 Kr,观察并网电流波形,最后调整 wc 兼顾抗频率波动和抗谐波能力。这个调参过程没有捷径,需要结合示波器波形逐步试。
4.4 Heric 调制策略与共模漏电流抑制
Heric 拓扑的调制策略属于单极性调制的一种。以电网电压正半周为例,主桥臂中某个上管高频 PWM,对应下管按互补方式工作或恒关断,另一个桥臂的对角下管常通,负载电流从电网正端流向负端。续流阶段主开关管全部关断,交流旁路开关管导通,电感电流通过旁路续流,桥臂不再形成共模电压跳变。
负半周的控制与正半周对称,只是换了一组桥臂常通,另一组桥臂高频开关。下面是一个简化开关逻辑表,实际工程需要根据驱动极性、死区时间和开关管耐压方向微调:
| 工作区间 | 主开关管状态 | 交流旁路开关 |
|---|---|---|
| 正半周功率传输 | 上桥臂高频PWM,下桥臂对管导通 | 关断 |
| 正半周续流 | 全部关断 | 导通 |
| 负半周功率传输 | 另一组桥臂高频PWM,上桥臂对管导通 | 关断 |
| 负半周续流 | 全部关断 | 导通 |
需要注意,Heric 拓扑的调制逻辑如果写错,比如续流阶段旁路管没有导通,那么拓扑就退化成普通的 H4 桥,共模漏电流问题会重新出现,甚至因为开关时序错误导致桥臂直通。工程上建议先用低速低压测试调制波形,确认每个开关周期内的逻辑关系正确,再加大功率。
4.5 储能双向功率控制逻辑
光伏储能逆变器与普通光伏逆变器的区别在于能量可以双向流动。放电模式下,逆变器把光伏和电池的能量馈入电网,电流与电网电压同相;充电模式下,逆变器工作在有源整流状态,电流与电网电压反相,电网能量进入直流母线给电池充电。
双向功率控制的核心是电流参考的方向切换。电流参考由功率指令除以电网电压幅值再乘以电压相位波形得到。功率指令为正时,参考电流与电网电压同相;功率指令为负时,参考电流反向。功率指令不能阶跃变化,要设置爬坡率,否则电流冲击会非常大。
另外还要考虑模式切换时的软起停。比如从放电模式切换到充电模式,如果直接翻转电流方向,电感电流会瞬间突变,可能导致过流保护动作。正确的做法是先把功率指令降到零,等电流平稳后再往反方向爬坡。
5. 完整实战案例:最小并网控制框架
这一部分给出一个简化但完整的最小并网控制框架。代码以示例思路为主,需要根据实际硬件和工程配置进行调整,不能直接复制到任意板卡上运行。示例假设开关频率 20kHz,控制周期 50us,电网频率 50Hz。
5.1 主中断控制流程
参数初始化完成后,整个控制系统运行在 EPWM 中断中。每次进入中断执行一次采样、一次锁相环更新、一次电流环更新和一次 PWM 占空比更新。
// 文件路径:src/isr.c __interrupt void EPWM1_INT_ISR(void) { // 1. 读取ADC采样值并转换为实际物理量 ReadAdcAndScale(); // 2. 软件保护检测 if (SoftwareProtectionCheck() != 0) { DisablePwmOutput(); return; } // 3. 更新锁相环 SOGI_Update(&g_sogi, g_sample.vGrid); PLL_Update(&g_pll, g_sogi.alpha, g_sogi.beta); // 4. 生成电流参考 g_iRef = g_powerRef / g_vGridAmplitude * g_pll.sinTheta; // 5. 电流环控制 float32_t err = g_iRef - g_sample.iGrid; g_modulate = PR_Update(&g_pr, err); // 6. 更新PWM占空比 UpdatePwmDuty(g_modulate); // 7. 清除中断标志 EPwm1Regs.ETCLR.bit.INT = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; }实际工程中电流参考的生成要更复杂一些,还要叠加无功功率指令、母线电压环输出、死区补偿等。但核心流程就是这样:采样、锁相、算参考、调电流、出占空比。
5.2 ADC 采样与标幺化
ADC 采样结果需要根据硬件采样电路换算成实际电压和电流值。标幺化的主要作用是让算法不依赖具体硬件量程,方便参数移植。
// 文件路径:include/board_config.h #define ADC_VBUS_GAIN 0.15f // 母线电压采样增益,单位 V/LSB,按实际分压比计算 #define ADC_VGRID_GAIN 0.12f // 电网电压采样增益 #define ADC_IGRID_GAIN 0.02f // 并网电流采样增益,单位 A/LSB #define GRID_FREQ_HZ 50.0f #define CONTROL_FREQ_HZ 20000.0f #define CONTROL_PERIOD_S 0.00005f// 文件路径:src/adc_driver.c void ReadAdcAndScale(void) { g_sample.vBus = (float32_t)AdcResult.ADCRESULT0 * ADC_VBUS_GAIN; g_sample.vGrid = (float32_t)AdcResult.ADCRESULT1 * ADC_VGRID_GAIN; g_sample.iGrid = (float32_t)AdcResult.ADCRESULT2 * ADC_IGRID_GAIN; }采样系数必须和硬件采样电路一一对应。更换硬件后第一件事就是重新标定这些系数,否则控制环路参数再准也没有意义。