1. 古瑞瓦特光伏逆变器架构解析
古瑞瓦特Growatt 5-10kW光伏并网逆变器采用典型的双MCU架构设计,主控芯片选用日立H8系列微控制器。整个系统设计充分考虑了光伏应用场景的特殊需求,在有限的硬件资源(256kB Flash/64kB RAM)内实现了完整的并网逆变功能。
硬件架构上,系统包含以下几个核心模块:
- 功率转换模块:采用两级式拓扑(Boost+全桥)
- 采样调理电路:12通道ADC采样网络
- 保护电路:包含GFCI、DCI、孤岛保护等多重保护
- 通讯接口:支持Modbus-RTU和双机通讯
- 人机交互:LCD显示与按键输入
2. 嵌入式软件架构深度剖析
2.1 代码组织结构
工程源代码采用模块化设计,主要目录结构如下:
code复制SunShine1t5K/
├── QRPVInverter/
│ ├── App/
│ │ ├── Main/ # 主MCU业务逻辑
│ │ └── Slave/ # 从MCU镜像
│ ├── CPU/ # 启动、自举、ISP
│ └── Include/ # 头文件
整个工程包含98个源文件,编译后占用:
- Flash:175kB(68%利用率)
- RAM:32kB(50%利用率)
其中4kB RAM被双口通讯结构体占用。
2.2 启动流程设计
启动链路体现了工业级产品的可靠性设计:
- 复位向量初始化(CPU\Flash.c 630-720行)
assembly复制.SECTION PResetPRG
mov.l #USER_SP, er7
bsr @ClearRam_M ; 清零0xFEF20-0xFFF1F
bsr @MovProg2Ram_M ; 把0x400-0x7FF的flash控制例程搬到RAM
jmp @0xFF500 ; 在RAM里跑,解除flash读-改-写限制
- 双区启动机制(CPU\Flash.c 第94行)
c复制void sMCUBFlashOnLine(char bSciNo) {
set _imask_ ccr(1); // 关中断
if(bSciNo==0) SCI0_9600();
else SCI1_9600();
// 等待PC下发"W"/"A"/"C"命令
}
若15分钟内无合法命令,系统会自动将0x8000处的"OK"字符串改为"GO"并软复位,进入正常并网模式。这种设计既保证了生产测试的便利性,又确保了现场运行的可靠性。
3. 实时调度系统实现
3.1 轻量级任务调度
系统采用合作式调度器设计(App\Main\ABFunctions.c 280-350行):
c复制#define cTimerTicksPerSec 1000
volatile uint32_t uwTick;
void OSTaskStart(uint8_t prio, uint16_t ms) {
TaskCB[prio].wakeTick = uwTick + ms;
}
uint8_t OSEventPend(uint8_t prio) {
while(uwTick < TaskCB[prio].wakeTick)
__wait_nop(); // H8专用低功耗空等
return TaskCB[prio].eventFlag;
}
该调度器特点:
- 1ms时间基准
- 无任务栈切换开销
- 每个任务仅需16字节TCB控制块
- 中断中仅做uwTick++操作
3.2 任务优先级设计
系统主要任务及执行周期:
- ADC采样任务(64μs)
- RMS计算任务(4.1ms)
- MPPT算法(10ms)
- 保护检测(20ms)
- 通讯处理(100ms)
- LCD刷新(500ms)
4. 关键算法实现细节
4.1 电网同步与SPWM生成
并网逆变器的核心是精确的电网同步,系统实现方案:
- 过零捕获:通过IRQ0下降沿中断捕获电网过零点
c复制wOPFrecyReal = 245760000 / wLinePeriodTick; // 245760000=20MHz*12.288
- 锁相环实现(OutputTask.c 940-980行):
c复制static int16_t wPhaseErr;
wPhaseErr = (wOPFrecyReal - 5000) * 16384 / 5000; // 单位0.01Hz
wLoadAMP += (wPhaseErr * 37) >> 10; // 比例增益0.036
该PLL实现静态相位差<2°,动态5个周期内收敛。
- SPWM生成:
c复制CMPREG = (wLoadAMP * sinTable[phase]) >> 12; // Q12格式
使用256点正弦表,ROM占用512字节,载波频率18kHz。
4.2 MPPT算法优化
MPPT(最大功率点跟踪)采用改进型扰动观察法(LoadAdjust.c 60-280行):
c复制void sChangePVWork(void) {
if(dwPVWattNow > dwPVWattOld + wMPPTWatt)
bMPPTFlag = 0; // 同向继续
else if(dwPVWattNow + wMPPTWatt < dwPVWattOld)
bMPPTFlag = 2; // 反向
else
bDown2UpCnt++; // 功率平坦区计数
if(bDown2UpCnt > 50) // 50*10ms=500ms锁定
bMPPTFlag = 0;
}
算法优化点:
- 步长自适应:光照变化率>10%/s时步长放大8倍
- 母线耦合抑制:根据母线电压动态调整MPPT策略
- 低温保护:PV开路电压<370V时步长减半
4.3 保护机制实现
系统实现多重保护机制,典型实现:
- 漏电流保护(GFCI,PVTask.c 440-600行):
c复制// 30mA/300ms
if(wGFIAvg > cDelta25mA && bFaultFilter1++ > 30)
sSetFaultCode(cGFCIHigh);
// 60mA/150ms
if(wGFIAvg > cDelta40mA && bFaultFilter2++ > 15)
sSetFaultCode(cGFCIHigh);
// 300mA/30ms
if(wGFIAvg > cP250mA && bFaultFilter++ > 3)
sSetFaultCode(cGFCIHigh);
- 直流分量抑制(DCI,OutputTask.c 1100-1180行):
c复制dwDCILimitT = (wDCILimit100T * bACADCnt) / 500; // 100%功率下的数字门限
if(dwDCI_U_ADSum > dwDCILimitT)
wDCIAdj--; // 减小调制波直流偏置
else if(dwDCI_U_ADSum < -dwDCILimitT)
wDCIAdj++;
该算法稳态误差<40mA,满足IEC 62116标准。
5. 双机通讯与可靠性设计
5.1 主从MCU通讯协议
物理层参数:
- 接口:SCI1
- 波特率:19200bps
- 帧格式:26字节定长帧
- 校验:CRC16-IBM
数据结构定义(Communication.c 120-140行):
c复制typedef struct {
uint8_t head; // 'M'/'S'
uint8_t status; // 本机状态
uint8_t fault[4]; // 32位故障码
uint16_t pv1Volt;
uint16_t acVolt;
uint16_t acFreq;
uint16_t dci;
uint8_t CRC[2];
} __packed DualPort_t;
5.2 可靠性设计要点
- 心跳机制:主MCU每10ms发送一帧,从机2ms内应答
- 关键参数交叉校验:电网电压、DCI等参数双机独立采样
- 升级模式:主MCU充当透明网关,实现单口升级双机
6. 生产测试与校准
系统提供完整的生产测试接口(Modbus保留命令0x331x-0x334x):
- 电压校准(0x3311/0x3312):
c复制// 写入实测值*10,自动计算wPVV_1_AdjEE
- 功率校准(0x3313/0x3314):
c复制// 外接精密源,写入标准功率,计算wWatt_U_AdjEE1
- 校准退出(0x3315):
c复制// 把新系数写EEPROM,置bEEpromWriteType=4
校准过程全部采用uint32定点运算,单点校准耗时<200ms。
7. 能量计量与数据存储
7.1 能量累计算法
能量计量实现(UserFunction.c 280-320行):
c复制dwInvertedP1SecEE += (dwOP_UVW_WattSec/2); // 0.5Ws分辨率
if(dwInvertedP1SecEE >= 3600000) { // 1kWh
dwInvertedP0K1WEE++; // 0.1kWh单位
dwInvertedP1SecEE -= 3600000;
}
7.2 EEPROM磨损均衡
数据存储方案:
- 双区备份:16kB EEPROM分为A/B两区
- 写策略:每6小时写一次,先写对侧区
- 掉电保护:NMI下降沿检测,2ms内完成最后写入
该设计数据保持率>99.7%,满足10年以上使用寿命要求。
8. 代码可读性与维护性
古瑞瓦特这份代码虽然写于2010年,但展现了优秀的嵌入式编程实践:
- 资源优化:
- 全系统采用定点算法避免浮点运算
- 使用查表法替代实时计算
- 精心设计的数据结构减少内存占用
- 可维护性:
- 寄存器映射采用@前缀明确标识
- 状态机实现清晰明了
- 模块化设计便于功能扩展
- 可靠性设计:
- 关键操作原子化
- 重要数据双备份
- 故障检测全覆盖
这份代码的最大价值在于展示了如何在资源受限的嵌入式系统中实现复杂的光伏逆变功能,其设计思路对当今的嵌入式开发仍有重要参考价值。