DC-DC Buck 电路(降压转换器)全面解析

Buck 电路是嵌入式 / 硬件设计中最常用的非隔离型 DC-DC 降压转换器 ,核心功能是将输入高压直流(Vin)转换为更低的稳定直流输出(Vout < Vin),广泛应用于 STM32、MCU、传感器、电源模块等硬件设备中(如 5V 转 3.3V 给单片机供电、12V 转 5V 给 USB 设备供电)。

一、核心原理(通俗版 + 专业版)

1.Buck 电路类似 "高速开关 + 储能滤波" 的组合:

  • 开关(MOS 管)快速通断(频率通常 10kHz~1MHz),将输入电压 "切" 成脉冲信号;
  • 电感(L)和电容(C)组成低通滤波器,将脉冲信号 "抹平" 为平稳的直流电压;
  • 反馈电路实时监测输出电压,调整开关通断时间(占空比),保证输出稳定。

2. 专业原理(理想状态)

  • **导通阶段(开关闭合)**Vin 通过 MOS 管给电感 L 充电,电感储存磁能,同时给电容 C 充电和负载供电,电流 IL 线性上升;

  • **关断阶段(开关断开)**电感释放磁能,通过续流二极管(或同步整流 MOS 管)继续给负载和电容供电,电流 IL 线性下降;

  • 稳定输出条件导通时间内电感储存的能量 = 关断时间内释放的能量,输出电压公式(理想):

    Vout = Vin × D (D为占空比,0 < D < 1,D = 导通时间T_on / 开关周期T)

二、核心组成部分(嵌入式硬件常用选型)

三、关键参数与性能指标(硬件测试重点关注)

  1. 输出电压精度稳定负载下 Vout 与标称值的偏差(如 ±2%),嵌入式场景需满足 MCU 供电要求(如 3.3V±0.1V);
  2. **效率(η)**输出功率 Pout 与输入功率 Pin 的比值(η=Pout/Pin×100%),同步整流型 Buck(如 MP2307)效率可达 90%+,非同步(如 LM2596)约 75%~85%,低功耗场景优先选同步型;
  3. **输出纹波(Vripple)**输出电压的交流波动(通常 mV 级),嵌入式场景需控制在 50mV 以下(避免干扰 ADC、传感器);
  4. **最大输出电流(Iout_max)**芯片 / 电路能稳定供电的最大电流(如 LM2596 最大 3A,超过会触发过流保护);
  5. **开关频率(f_switch)**影响电感电容选型(频率越高,电感电容体积越小,但开关损耗越大),常用 100kHz~500kHz。

四、工作模式(嵌入式场景常见类型)

1. 连续导通模式(CCM)

  • 电感电流始终大于 0(导通 + 关断阶段电流不中断);
  • 适用于大负载电流(Iout ≥ 最小连续电流 Iout_min),输出纹波小、响应速度快;
  • 嵌入式场景(如 MCU、电机驱动)主流模式。

2. 断续导通模式(DCM)

  • 关断阶段电感电流降至 0 后,开关才再次导通;
  • 适用于小负载电流(Iout < Iout_min),效率较低,纹波较大;
  • 低功耗场景(如传感器休眠供电)需注意模式切换。

五、嵌入式硬件设计实战(以 3.3V 输出为例)

1. 经典方案:LM2596 非同步 Buck 电路(5V/12V 转 3.3V)

关键元件选型

  • 输入:Vin=5V 或 12V(如 USB 5V、12V 适配器);
  • 芯片:LM2596-3.3(固定 3.3V 输出,无需分压电阻,简化设计);
  • 电感:10μH/3A(磁屏蔽功率电感);
  • 二极管:SS34(3A/40V 肖特基);
  • 电容:Cin=100μF 电解 + 0.1μF 陶瓷,Cout=100μF 电解 + 0.1μF 陶瓷。

硬件测试要点(嵌入式工程师必测项)

  • 输出电压测量:空载 / 满载(如 500mA 负载)时,Vout 应在 3.23V~3.37V(±2% 精度);
  • 纹波测试:用示波器测 Vout(探头接地夹就近接地),纹波应 < 50mVpp;
  • 效率测试:测量 Vin、Iin、Vout、Iout,计算 η=(Vout×Iout)/(Vin×Iin)×100%(满载时应≥75%);
  • 过流保护:短路 Vout,芯片应自动关断,解除短路后恢复正常。

2. 高效方案:MP2307 同步 Buck 电路(12V 转 3.3V,低功耗)

  • 同步整流设计(无续流二极管,用 MOS 管替代),效率可达 95%,适合电池供电的嵌入式设备(如便携传感器);
  • 输出电流最大 2A,纹波更小(<30mVpp);
  • 电路设计与 LM2596 类似,核心区别是无需续流二极管,芯片集成同步 MOS 管。

六、嵌入式软件适配(电源管理相关代码示例)

Buck 电路输出稳定后,需通过 MCU 软件实现电源监测、保护等功能(以 STM32 为例):

1. 输出电压监测(ADC 采集)

复制代码
#include "stm32f10x.h"
// ADC初始化(采集Vout分压后电压)
void ADC_Init_Vout(void) {
    GPIO_InitTypeDef GPIO_InitStruct;
    ADC_InitTypeDef ADC_InitStruct;

    // 使能GPIOA和ADC1时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);

    // PA0配置为模拟输入(采集分压后的Vout)
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    // ADC配置(单通道、单次转换、12位分辨率)
    ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStruct.ADC_ScanConvMode = DISABLE;
    ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStruct.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStruct);

    // 使能ADC1
    ADC_Cmd(ADC1, ENABLE);

    // ADC校准
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));
}
// 读取Vout实际电压(分压比:R1=2.2kΩ,R2=10kΩ,Vout = ADC_Value × 3.3V × (R1+R2)/(R2×4096))
float Get_Vout(void) {
    uint16_t adc_val;
    float vout;

    // 选择ADC通道0,采样时间55.5周期
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);

    // 启动ADC转换
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);

    // 等待转换完成
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));

    // 读取ADC值
    adc_val = ADC_GetConversionValue(ADC1);

    // 计算实际Vout(3.3V为STM32参考电压)
    vout = adc_val * 3.3f * (12.2f / 10.0f) / 4096.0f;

    return vout;
}
// 主函数中使用
int main(void) {
    float vout;
    ADC_Init_Vout();

    while(1) {
        vout = Get_Vout();
        // 若Vout超出3.0V~3.6V范围,触发报警(如点亮LED)
        if(vout < 3.0f || vout > 3.6f) {
            GPIO_SetBits(GPIOC, GPIO_Pin_13); // PC13点亮报警
        } else {
            GPIO_ResetBits(GPIOC, GPIO_Pin_13);
        }
        delay_ms(500); // 每隔500ms监测一次
    }
}

2. 低功耗场景:Buck 电路休眠控制

复制代码
// 当MCU进入休眠模式时,关闭Buck电路(通过GPIO控制芯片使能引脚)
void Buck_Power_Control(uint8_t enable) {
    GPIO_InitTypeDef GPIO_InitStruct;

    // 配置PB0为推挽输出(控制LM2596的SHDN引脚)
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    if(enable) {
        GPIO_SetBits(GPIOB, GPIO_Pin_0); // 使能Buck电路(SHDN高电平)
    } else {
        GPIO_ResetBits(GPIOB, GPIO_Pin_0); // 关闭Buck电路(SHDN低电平)
    }
}
// MCU休眠函数
void MCU_Sleep(void) {
    Buck_Power_Control(0); // 关闭Buck电路
    // 配置MCU进入深度休眠模式
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
    PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
}

七、常见问题与排查(硬件测试避坑指南)

八、总结

Buck 电路是嵌入式硬件的 "电源基石",核心优势是结构简单、效率高、输出稳定 ,适配从低功耗传感器到中功率 MCU 的各类供电需求。嵌入式工程师在设计时,需根据输入电压、输出电压、最大电流、效率要求选择合适的芯片(如 LM2596 经典通用、MP2307 高效低功耗),搭配匹配的电感、电容、二极管,并通过硬件测试和软件适配确保电源可靠性。

相关推荐
xcLeigh1 小时前
AI的提示词专栏:“Prompt Chaining”把多个 Prompt 串联成工作流
人工智能·ai·prompt·提示词·工作流
Mz12211 小时前
day04 小美的区间删除
数据结构·算法
是店小二呀1 小时前
AI模型练好了却传不出去?这两个工具帮你破局
人工智能
galaxylove1 小时前
Gartner发布2025年人工智能和网络安全技术成熟度曲线:网络安全领域对AI的期望值达到顶峰
人工智能·安全·web安全
_OP_CHEN2 小时前
算法基础篇:(十九)吃透 BFS!从原理到实战,解锁宽度优先搜索的核心玩法
算法·蓝桥杯·bfs·宽度优先·算法竞赛·acm/icpc
小猪咪piggy2 小时前
【算法】day 20 leetcode 贪心
算法·leetcode·职场和发展
galaxylove2 小时前
Gartner发布CISO人工智能安全指南:将AI安全治理融入所有网络安全治理体系
人工智能·安全·web安全
依米s2 小时前
2019年人工智能大会核心议题《智联世界无限可能》
人工智能·waic·人工智能大会