光伏逆变器总控板,TMS320F28335,2路CAN通讯,2路485通讯,1个EEROM,2路AD采样电路。 主要功能为采样光伏电池电压,MPPT最大功率跟踪,功率计算,系统开关机等。 并且有对应的元器件明细表。 提供程序代码。 特产适合做此类项目的工程师参考,或者新手作为模板参考。 备注:公司成熟产品,提供代码!

光伏逆变器主控开发实战中,TMS320F28335确实是个狠角色。这枚28335芯片把浮点运算单元和PWM资源整合得明明白白,今天咱们就拆解一套正在商用的光伏控制方案。先看硬件架构:主控板挂着两路CAN做设备组网,两路485接智能电表,AD采样直接怼着光伏板电压电流开撸,EEPROM存着系统参数随时待命。

上电初始化代码里藏着玄机,SysCtrlRegs里头CLKCONFIG寄存器直接锁频到150MHz。老司机都懂,ADC模块必须抢在DSP启动前校准:

void InitAdc(void)
{
   AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;  // 唤醒模拟电路
   DELAY_US(1000);                    // 必须的延时
   AdcRegs.ADCCTL1.bit.ADCPWDN = 1;   // 开启ADC电源
   AdcRegs.ADCCTL1.bit.ADCCALON = 1;  // 自动校准模式
   while(AdcRegs.ADCCTL1.bit.ADCCALON != 0); // 等校准完成
}

校准不彻底,采样全白给。光伏板电压采样电路里藏着TVS管和RC滤波,程序里得做滑动滤波:

#define SAMPLE_WINDOW 16
volatile Uint16 adc_raw[SAMPLE_WINDOW];
float GetPVVoltage(void)
{
    static int index = 0;
    adc_raw[index] = AdcResult.ADCRESULT0; // 从结果寄存器抓数
    index = (index+1)%SAMPLE_WINDOW;
    Uint32 sum = 0;
    for(int i=0; i<SAMPLE_WINDOW; i++) sum += adc_raw[i];
    return (sum * 3.0 * 3.3)/4096.0/SAMPLE_WINDOW; // 硬件分压比3:1
}

MPPT算法才是灵魂。这套方案用扰动观察法,但加了风速预测因子。看这个核心判断逻辑:

float duty_step = 0.005; // 占空比步进量
void MPPT_Handler(float current_power)
{
    static float last_power = 0;
    static int direction = 1; // 1表示增加占空比
    
    if(current_power > last_power + 0.5) {
        // 功率上升保持方向
        EPwm1Regs.CMPA.half.CMPA += direction ? duty_step : -duty_step;
    } else {
        direction ^= 1; // 反转调节方向
        duty_step *= 0.8; // 接近峰值时减小步长
    }
    last_power = current_power;
}

CAN通讯用到了DMA加速,配置Mailbox时要注意验收滤波器的设置:

void CAN_Init(void)
{
    ECanaRegs.CANMC.bit.SCB = 1; // 进配置模式
    ECanaRegs.CANBTC.bit.BRP = 9; // 波特率500k计算值
    ECanaRegs.CANMC.bit.ABO = 1; // 自动恢复总线关闭
    // 配置接收邮箱
    ECanaMboxes.MBOX0.MSGID.all = 0x18FF50F0; // 扩展帧ID
    ECanaMboxes.MBOX0.MSGID.bit.IDE = 1; 
    ECanaMboxes.MBOX0.MSGID.bit.AME = 1; // 开启验收过滤
}

元器件表里有个骚操作——RS485芯片用SN65HVD3082E,这货在光伏现场抗干扰比MAX3485强两档。EEPROM选的是AT24C512,存储结构体时记得四字节对齐:

#pragma DATA_SECTION(sys_params,"EEPROMSection");
#pragma DATA_ALIGN(sys_params, 4); // 对齐到四字节
SystemParams sys_params = {
    .mppt_mode = 1,
    .max_voltage = 800.0,
    .serial_num = {0},
};

这套代码最骚的是看门狗喂狗策略——正常运行时1秒喂一次,但进入故障状态后改由独立硬件看门狗芯片接管。源码包里的wdog.c文件实现了状态机喂狗机制,有效防止软件死循环导致的喂狗失效。

(需要完整BOM清单和工程源码的老铁,直接到公众号"光伏嵌入式"后台回复"28335方案"获取。商用级代码,寄存器配置都带着现场踩坑注释)

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐