基于ARM的buck-boost拓扑双向DC-DC电源变换器资料 同步BUCK电路和同步BOO...

基于ARM的buck-boost拓扑双向DC-DC电源变换器资料 同步BUCK电路和同步BOOST电路进行级联,采用高性能32位ARM 芯片构建数字电源,能够根据输入电压和输出电压的大小关系,实现自动切换工作模式,将参数信息进行显示,并且可以实现稳压输出。

最近在折腾一个基于ARM的双向DC-DC电源项目,同步BUCK和BOOST电路搞级联玩自动升降压,挺有意思的。这货的核心逻辑就是根据输入输出电压关系自动切换工作模式,还能用屏幕显示实时参数。今天咱们从硬件拓扑到代码实现唠点干货。

先说电路结构,这玩意儿本质上就是两个同步整流电路背靠背连接。BUCK部分的MOS管Q1/Q2负责降压,BOOST部分的Q3/Q4负责升压。中间储能电感选型很关键,我用的铁硅铝磁环绕制,实测在300kHz开关频率下效率能到93%。这里有个坑要注意:两个电路的驱动相位必须错开,不然上下管直通烧芯片分分钟的事。

主控用的是STM32G474,这货的HRTIM高级定时器简直是为数字电源量身定制的。看这段PWM初始化代码:

c 复制代码
// 配置互补PWM通道
hrtim1.Instance->sTimerxRegs[0].CMP1xR = 150; // 占空比初始值
hrtim1.Instance->sTimerxRegs[0].SETx1R = HRTIM_SET1R_SST; 
hrtim1.Instance->sTimerxRegs[0].RSTx1R = HRTIM_RST1R_SRT1;
hrtim1.Instance->sTimerxRegs[1].CMP1xR = 150; // 互补通道
hrtim1.Instance->sTimerxRegs[1].SETx1R = HRTIM_SET1R_SST;
hrtim1.Instance->sTimerxRegs[1].RSTx1R = HRTIM_RST1R_SRT1;

这里的骚操作在于利用对称PWM生成方式,死区时间直接硬件生成。HRTIM的psc分频寄存器设到最高分辨率,能实现纳秒级死区调节,比普通定时器精准不止一个量级。

模式切换逻辑是核心算法,我的实现方案是用状态机+滞环比较。当Vin>Vout+0.5V时进BUCK模式,Vin

c 复制代码
#define SAMPLES 64
uint32_t adc_oversample(void) {
    uint32_t sum = 0;
    for(uint8_t i=0; i<SAMPLES; i++){
        sum += HAL_ADC_GetValue(&hadc1);
        // 插入延时确保采样间隔大于RC时间常数
        DWT_Delay(10); 
    }
    return sum >> 4; // 64次平均等效提高2位分辨率
}

显示部分用的OLED屏,移植了UGUI库。这里有个坑爹问题:电源高频干扰导致SPI通信乱码。解决办法是软件SPI配合IO口复用,关键代码:

c 复制代码
void SPI_Write(uint8_t data) {
    for(int i=0; i<8; i++){
        HAL_GPIO_WritePin(SPI_CLK_GPIO_Port, SPI_CLK_Pin, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(SPI_MOSI_GPIO_Port, SPI_MOSI_Pin, (data & 0x80) ? GPIO_PIN_SET : GPIO_PIN_RESET);
        DWT_Delay(1); // 插入硬件延时
        HAL_GPIO_WritePin(SPI_CLK_GPIO_Port, SPI_CLK_Pin, GPIO_PIN_SET);
        data <<= 1;
        DWT_Delay(1);
    }
}

稳压算法用的增量式PID,但针对开关电源特性做了改进。加入输出电压二阶导数前馈,动态响应速度提升明显:

c 复制代码
float pid_update(PID_TypeDef *pid, float setpoint, float measured) {
    float error = setpoint - measured;
    float d_input = measured - pid->last_measured;
    
    // 计算微分项时用测量值变化代替误差变化
    float d_term = pid->Kd * (d_input - pid->prev_d_input);
    pid->prev_d_input = d_input;
    
    // 前馈项加入二阶导数
    float feedforward = pid->Kff2 * (d_input * d_input);
    
    float output = pid->Kp * error + pid->Ki * pid->integral + d_term + feedforward;
    
    // 抗积分饱和
    if(output < pid->out_max && output > pid->out_min){
        pid->integral += error * pid->Ki;
    }
    
    return output;
}

最后说几个玄学经验:布局时功率地和数字地之间用磁珠连接比0Ω电阻靠谱;环路补偿别迷信仿真,实际用动态负载测试更有效;PWM驱动电阻选51Ω时波形最干净。这玩意儿调了两个月,烧了五六个MOS管才稳定,现在满负载24V/5A运行稳如老狗,切换模式时电压波动能控制在0.8%以内。

相关推荐
中防喷墨7 小时前
ONE-PASS高速UV喷码技术创新发展百科解析
uv
开发者联盟league1 天前
windows安装uv
windows·uv
*wait for?1 天前
利用uv安装python包,并运行jupyter
python·jupyter·uv
中防喷墨3 天前
选UV喷码机还是激光喷码机,哪款更适合流水线?
人工智能·uv
Martina_03214 天前
AI生成的模块场景一烘焙就有黑边?用6步检查Lightmap UV、纹素密度与Padding
人工智能·游戏·3d·aigc·uv·游戏策划·关卡设计
jayhgq4 天前
新一代Python包与项目管理工具——UV
开发语言·python·uv
玖石书5 天前
linux 安装uv(python虚拟环境管理)
linux·python·uv
DP DPharness6 天前
从 uv 装到技能蒸馏:memsearch 的六步配置路径
uv
Data analyse4566 天前
Cookie过期引发UV上涨的复核方法
服务器·前端·数据分析·uv
ysu_03147 天前
uv实战指南-从Python版本虚拟环境到pyproject依赖管理
开发语言·python·pip·uv·虚拟环境·包管理·依赖管理