
基于ARM的buck-boost拓扑双向DC-DC电源变换器资料 同步BUCK电路和同步BOOST电路进行级联采用高性能32位ARM 芯片构建数字电源能够根据输入电压和输出电压的大小关系实现自动切换工作模式将参数信息进行显示并且可以实现稳压输出。最近在折腾一个基于ARM的双向DC-DC电源项目同步BUCK和BOOST电路搞级联玩自动升降压挺有意思的。这货的核心逻辑就是根据输入输出电压关系自动切换工作模式还能用屏幕显示实时参数。今天咱们从硬件拓扑到代码实现唠点干货。先说电路结构这玩意儿本质上就是两个同步整流电路背靠背连接。BUCK部分的MOS管Q1/Q2负责降压BOOST部分的Q3/Q4负责升压。中间储能电感选型很关键我用的铁硅铝磁环绕制实测在300kHz开关频率下效率能到93%。这里有个坑要注意两个电路的驱动相位必须错开不然上下管直通烧芯片分分钟的事。基于ARM的buck-boost拓扑双向DC-DC电源变换器资料 同步BUCK电路和同步BOOST电路进行级联采用高性能32位ARM 芯片构建数字电源能够根据输入电压和输出电压的大小关系实现自动切换工作模式将参数信息进行显示并且可以实现稳压输出。主控用的是STM32G474这货的HRTIM高级定时器简直是为数字电源量身定制的。看这段PWM初始化代码// 配置互补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分频寄存器设到最高分辨率能实现纳秒级死区调节比普通定时器精准不止一个量级。模式切换逻辑是核心算法我的实现方案是用状态机滞环比较。当VinVout0.5V时进BUCK模式Vin#define SAMPLES 64 uint32_t adc_oversample(void) { uint32_t sum 0; for(uint8_t i0; iSAMPLES; i){ sum HAL_ADC_GetValue(hadc1); // 插入延时确保采样间隔大于RC时间常数 DWT_Delay(10); } return sum 4; // 64次平均等效提高2位分辨率 }显示部分用的OLED屏移植了UGUI库。这里有个坑爹问题电源高频干扰导致SPI通信乱码。解决办法是软件SPI配合IO口复用关键代码void SPI_Write(uint8_t data) { for(int i0; i8; 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但针对开关电源特性做了改进。加入输出电压二阶导数前馈动态响应速度提升明显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%以内。