Skip to content Skip to footer

开关电源设计完全指南¶

开关电源设计完全指南¶

概述¶

开关电源(Switching Power Supply)是现代电子设备中最重要的电源转换技术,相比线性稳压器具有更高的效率和更灵活的电压转换能力。本教程将全面深入地讲解开关电源的设计原理、拓扑结构、控制技术和实际应用。

什么是开关电源¶

开关电源是一种通过高频开关动作和储能元件(电感、电容)来实现电压转换的电源技术。其核心思想是:

开关控制:通过功率开关管的快速通断

能量存储:利用电感和电容存储和释放能量

PWM调制:通过调节占空比控制输出电压

反馈稳压:通过闭环反馈保持输出稳定

开关电源 vs 线性稳压器¶

性能对比:

┌──────────────┬─────────────┬─────────────┐

│ 特性 │ 线性稳压器 │ 开关电源 │

├──────────────┼─────────────┼─────────────┤

│ 效率 │ 40-60% │ 80-95% │

│ 发热量 │ 大 │ 小 │

│ 体积 │ 大 │ 小 │

│ 噪声 │ 低 │ 较高 │

│ 成本 │ 低 │ 中等 │

│ 设计复杂度 │ 简单 │ 复杂 │

│ 电压转换 │ 降压 │ 升/降/反转 │

│ 输出纹波 │ 极低 │ 较高 │

└──────────────┴─────────────┴─────────────┘

效率计算:

线性稳压器:η = Vout / Vin × 100%

开关电源: η = Pout / Pin × 100% (通常 > 85%)

功耗对比示例:

输入:12V,输出:5V @ 1A

线性稳压器:

- 输出功率:5W

- 输入功率:12W

- 效率:41.7%

- 功耗:7W (发热严重)

开关电源:

- 输出功率:5W

- 输入功率:5.6W

- 效率:89%

- 功耗:0.6W (发热小)

应用场景¶

开关电源广泛应用于:

消费电子:手机充电器、笔记本电源适配器

工业控制:PLC电源、工业设备供电

通信设备:基站电源、路由器电源

汽车电子:车载DC-DC转换器

新能源:光伏逆变器、电动车充电器

嵌入式系统:单板计算机、物联网设备

本文内容概览¶

本教程将涵盖以下内容:

基础理论:开关电源工作原理、基本拓扑

Buck转换器:降压型开关电源设计

Boost转换器:升压型开关电源设计

Buck-Boost转换器:升降压型开关电源设计

PWM控制:脉宽调制技术和控制芯片

元件选型:电感、电容、MOSFET、二极管选择

反馈控制:电压反馈、电流反馈、补偿设计

保护电路:过流、过压、过温保护

PCB设计:布局布线、EMI抑制

实战项目:完整的开关电源设计实例

第一部分:开关电源基础理论¶

1.1 工作原理¶

开关电源的核心工作原理基于以下物理定律:

电感的基本特性:

电感电压-电流关系:

V_L = L × (di/dt)

关键特性:

1. 电感电流不能突变

2. 电感储能:E = (1/2) × L × I²

3. 电感阻止电流变化

电感在开关电源中的作用:

- 储存能量

- 平滑电流

- 实现电压转换

电容的基本特性:

电容电压-电流关系:

I_C = C × (dv/dt)

关键特性:

1. 电容电压不能突变

2. 电容储能:E = (1/2) × C × V²

3. 电容阻止电压变化

电容在开关电源中的作用:

- 滤波

- 储能

- 稳定电压

1.2 基本拓扑分类¶

开关电源有三种基本拓扑:

拓扑分类:

1. Buck (降压型)

输入电压 > 输出电压

Vout = Vin × D

应用:12V → 5V, 5V → 3.3V

2. Boost (升压型)

输入电压 < 输出电压

Vout = Vin / (1 - D)

应用:3.7V → 5V, 5V → 12V

3. Buck-Boost (升降压型)

输入电压可大于或小于输出电压

Vout = -Vin × D / (1 - D)

应用:电池供电系统

其中 D 为占空比 (Duty Cycle)

D = Ton / (Ton + Toff) = Ton / T

1.3 PWM控制基础¶

PWM (脉宽调制) 原理:

PWM信号特性:

┌──┐ ┌──┐ ┌──┐

│ │ │ │ │ │

─────┘ └────┘ └────┘ └────

Ton Toff

├─────┤

T

参数定义:

- T: 周期 (Period)

- f: 频率 (Frequency) = 1/T

- Ton: 导通时间

- Toff: 关断时间

- D: 占空比 = Ton/T

典型频率范围:

- 低频:20kHz - 100kHz

- 中频:100kHz - 500kHz

- 高频:500kHz - 2MHz

频率选择考虑:

- 频率越高,元件越小

- 频率越高,开关损耗越大

- 频率越高,EMI问题越严重

- 常用频率:100kHz - 500kHz

1.4 连续导通模式 (CCM) vs 断续导通模式 (DCM)¶

工作模式对比:

CCM (Continuous Conduction Mode):

- 电感电流始终 > 0

- 电流连续流动

- 适合大负载

- 纹波小

DCM (Discontinuous Conduction Mode):

- 电感电流降至 0

- 电流断续

- 适合轻载

- 纹波大

临界电感值:

L_crit = (Vin - Vout) × Vout / (2 × f × Vin × Iout_min)

设计建议:

- 大功率应用:设计为CCM

- 小功率应用:可工作在DCM

- 宽负载范围:考虑CCM/DCM混合模式

第二部分:Buck降压转换器设计¶

2.1 Buck转换器原理¶

Buck转换器是最常用的降压型开关电源拓扑。

电路结构:

Buck转换器基本电路:

Vin ──┬──[Q1]──┬──[L]──┬── Vout

│ │ │

┌┴┐ ┌┴┐ ┌┴┐

│C│ │D│ │C│ Rload

│i│ │1│ │o│

│n│ └─┘ └┬┘

└┬┘ │

│ │

GND──────────────GND

组件说明:

- Q1: 功率开关管 (N-MOSFET)

- D1: 续流二极管 (Schottky)

- L: 储能电感

- Cin: 输入滤波电容

- Co: 输出滤波电容

- Rload: 负载

工作过程:

工作周期分析:

阶段1:Q1导通 (Ton)

┌─────────────────────────┐

│ Vin → Q1 → L → Vout │

│ 电感电流上升 │

│ di/dt = (Vin-Vout)/L │

│ 能量从输入传递到输出 │

└─────────────────────────┘

阶段2:Q1关断 (Toff)

┌─────────────────────────┐

│ L → D1 → Vout │

│ 电感电流下降 │

│ di/dt = -Vout/L │

│ 电感释放储存的能量 │

└─────────────────────────┘

稳态时:

Ton × (Vin - Vout) = Toff × Vout

推导得:

Vout = Vin × D

其中 D = Ton / (Ton + Toff)

2.2 Buck转换器设计步骤¶

设计规格示例:

设计要求:

- 输入电压:Vin = 12V ± 10%

- 输出电压:Vout = 5V

- 输出电流:Iout = 2A (max)

- 开关频率:f = 200kHz

- 输出纹波:ΔVout < 50mV

- 效率目标:η > 90%

步骤1:计算占空比:

/**

* @brief 计算Buck转换器占空比

* @param vin: 输入电压 (V)

* @param vout: 输出电压 (V)

* @return 占空比 (0-1)

*/

float buck_calculate_duty_cycle(float vin, float vout)

{

// 理想占空比

float duty = vout / vin;

// 考虑MOSFET导通压降和二极管压降

float vd_mosfet = 0.1; // MOSFET导通压降

float vd_diode = 0.3; // 二极管压降

// 修正后的占空比

duty = (vout + vd_diode) / (vin - vd_mosfet);

// 限制范围

if (duty < 0.1) duty = 0.1;

if (duty > 0.9) duty = 0.9;

return duty;

}

// 示例计算

// Vin = 12V, Vout = 5V

// D = 5 / 12 = 0.417 (41.7%)

步骤2:选择电感值:

/**

* @brief 计算Buck转换器电感值

* @param vin: 输入电压 (V)

* @param vout: 输出电压 (V)

* @param iout: 输出电流 (A)

* @param freq: 开关频率 (Hz)

* @param ripple_ratio: 电流纹波比 (0.2-0.4)

* @return 电感值 (H)

*/

float buck_calculate_inductance(float vin, float vout,

float iout, float freq,

float ripple_ratio)

{

// 电感电流纹波

float delta_il = iout * ripple_ratio;

// 占空比

float duty = vout / vin;

// 电感值计算

// L = (Vin - Vout) × D / (f × ΔIL)

float inductance = (vin - vout) * duty / (freq * delta_il);

return inductance;

}

// 示例计算

// Vin = 12V, Vout = 5V, Iout = 2A

// f = 200kHz, ripple = 30%

// ΔIL = 2A × 0.3 = 0.6A

// L = (12-5) × 0.417 / (200000 × 0.6)

// L = 24.3 μH

// 选择标准值:L = 22μH 或 27μH

步骤3:选择输出电容:

/**

* @brief 计算Buck转换器输出电容

* @param delta_il: 电感电流纹波 (A)

* @param freq: 开关频率 (Hz)

* @param delta_vout: 允许的输出电压纹波 (V)

* @return 输出电容值 (F)

*/

float buck_calculate_output_capacitance(float delta_il,

float freq,

float delta_vout)

{

// 输出电容计算

// Co = ΔIL / (8 × f × ΔVout)

float capacitance = delta_il / (8.0 * freq * delta_vout);

return capacitance;

}

// 示例计算

// ΔIL = 0.6A, f = 200kHz, ΔVout = 50mV

// Co = 0.6 / (8 × 200000 × 0.05)

// Co = 7.5 μF

// 考虑ESR影响,选择:Co = 22μF (低ESR陶瓷电容)

步骤4:选择功率MOSFET:

/**

* @brief MOSFET选型参数计算

*/

typedef struct {

float vds_max; // 最大漏源电压 (V)

float id_max; // 最大漏极电流 (A)

float rds_on; // 导通电阻 (Ω)

float qg_total; // 总栅极电荷 (nC)

float power_loss; // 功耗 (W)

} MOSFET_Params_t;

/**

* @brief 计算MOSFET选型参数

*/

void buck_select_mosfet(float vin, float iout, float freq,

MOSFET_Params_t *params)

{

// 电压裕量:1.5-2倍

params->vds_max = vin * 2.0;

// 电流裕量:1.5-2倍

params->id_max = iout * 2.0;

// 导通损耗

// P_cond = I²_rms × Rds(on)

float i_rms = iout; // 简化计算

params->rds_on = 0.01; // 目标值,越小越好

float p_conduction = i_rms * i_rms * params->rds_on;

// 开关损耗

// P_sw = 0.5 × Vin × Iout × (tr + tf) × f

float t_rise = 20e-9; // 上升时间 20ns

float t_fall = 20e-9; // 下降时间 20ns

float p_switching = 0.5 * vin * iout * (t_rise + t_fall) * freq;

// 总功耗

params->power_loss = p_conduction + p_switching;

// 栅极电荷(影响驱动损耗)

params->qg_total = 20; // nC,越小越好

}

// 示例选型

// Vin = 12V, Iout = 2A, f = 200kHz

// 要求:

// - Vds > 24V (选择30V或40V)

// - Id > 4A (选择5A或更大)

// - Rds(on) < 10mΩ

// - Qg < 30nC

//

// 推荐型号:

// - IRF3205 (55V, 110A, 8mΩ)

// - IRFZ44N (55V, 49A, 17.5mΩ)

// - Si2302 (20V, 2.3A, 85mΩ) - 小功率

步骤5:选择续流二极管:

/**

* @brief 二极管选型参数

*/

typedef struct {

float vr_max; // 最大反向电压 (V)

float if_avg; // 平均正向电流 (A)

float vf; // 正向压降 (V)

float trr; // 反向恢复时间 (ns)

float power_loss; // 功耗 (W)

} Diode_Params_t;

/**

* @brief 计算二极管选型参数

*/

void buck_select_diode(float vin, float vout, float iout,

float duty, Diode_Params_t *params)

{

// 反向电压:输入电压 + 裕量

params->vr_max = vin * 1.5;

// 平均电流:(1-D) × Iout

params->if_avg = (1.0 - duty) * iout;

// 肖特基二极管正向压降

params->vf = 0.3; // 0.2-0.4V

// 反向恢复时间(肖特基几乎为0)

params->trr = 10; // ns

// 二极管功耗

// P_diode = Vf × If_avg

params->power_loss = params->vf * params->if_avg;

}

// 示例选型

// Vin = 12V, Vout = 5V, Iout = 2A, D = 0.417

// 要求:

// - Vr > 18V (选择20V或30V)

// - If > 1.2A (选择2A或3A)

// - Vf < 0.4V

// - 肖特基二极管

//

// 推荐型号:

// - SS34 (40V, 3A, Vf=0.5V)

// - 1N5819 (40V, 1A, Vf=0.6V)

// - MBRS340 (40V, 3A, Vf=0.5V)

2.3 Buck转换器完整设计实例¶

完整的Buck转换器实现:

/**

* @file buck_converter.c

* @brief Buck降压转换器完整实现

* @author 嵌入式知识平台

*/

#include

#include

#include "stm32f1xx_hal.h"

/* 硬件配置 */

#define BUCK_PWM_TIMER TIM1

#define BUCK_PWM_CHANNEL TIM_CHANNEL_1

#define BUCK_PWM_FREQUENCY 200000 // 200kHz

#define BUCK_ADC_VOUT ADC_CHANNEL_0

#define BUCK_ADC_IOUT ADC_CHANNEL_1

/* 设计参数 */

#define BUCK_VIN_NOM 12.0f // 标称输入电压

#define BUCK_VOUT_TARGET 5.0f // 目标输出电压

#define BUCK_IOUT_MAX 2.0f // 最大输出电流

#define BUCK_INDUCTANCE 22e-6f // 22μH

#define BUCK_OUTPUT_CAP 22e-6f // 22μF

/* 控制参数 */

#define BUCK_DUTY_MIN 0.1f // 最小占空比

#define BUCK_DUTY_MAX 0.9f // 最大占空比

#define BUCK_VOUT_TOLERANCE 0.05f // 5%电压容差

/**

* @brief Buck转换器状态结构

*/

typedef struct {

float vin; // 输入电压 (V)

float vout; // 输出电压 (V)

float iout; // 输出电流 (A)

float duty; // 当前占空比

float vout_target; // 目标输出电压 (V)

bool enabled; // 使能状态

uint32_t fault_flags; // 故障标志

} Buck_State_t;

/* 全局状态 */

static Buck_State_t g_buck_state = {0};

/* PID控制器参数 */

typedef struct {

float kp; // 比例系数

float ki; // 积分系数

float kd; // 微分系数

float integral; // 积分累积

float prev_error; // 上次误差

float output_min; // 输出最小值

float output_max; // 输出最大值

} PID_Controller_t;

static PID_Controller_t g_voltage_pid = {

.kp = 0.5f,

.ki = 0.1f,

.kd = 0.01f,

.integral = 0.0f,

.prev_error = 0.0f,

.output_min = BUCK_DUTY_MIN,

.output_max = BUCK_DUTY_MAX

};

/**

* @brief 初始化Buck转换器

* @retval 0: 成功, -1: 失败

*/

int buck_init(void)

{

// 初始化PWM定时器

TIM_HandleTypeDef htim;

htim.Instance = BUCK_PWM_TIMER;

htim.Init.Prescaler = 0;

htim.Init.CounterMode = TIM_COUNTERMODE_UP;

htim.Init.Period = SystemCoreClock / BUCK_PWM_FREQUENCY - 1;

htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

if (HAL_TIM_PWM_Init(&htim) != HAL_OK) {

return -1;

}

// 配置PWM通道

TIM_OC_InitTypeDef sConfigOC = {0};

sConfigOC.OCMode = TIM_OCMODE_PWM1;

sConfigOC.Pulse = 0; // 初始占空比为0

sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

if (HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC,

BUCK_PWM_CHANNEL) != HAL_OK) {

return -1;

}

// 初始化ADC用于电压电流采样

// ... ADC初始化代码 ...

// 初始化状态

g_buck_state.vout_target = BUCK_VOUT_TARGET;

g_buck_state.duty = 0.0f;

g_buck_state.enabled = false;

return 0;

}

/**

* @brief 启动Buck转换器

*/

void buck_start(void)

{

if (!g_buck_state.enabled) {

// 软启动:从小占空比开始

g_buck_state.duty = BUCK_DUTY_MIN;

buck_set_duty_cycle(g_buck_state.duty);

// 启动PWM

HAL_TIM_PWM_Start(BUCK_PWM_TIMER, BUCK_PWM_CHANNEL);

g_buck_state.enabled = true;

}

}

/**

* @brief 停止Buck转换器

*/

void buck_stop(void)

{

if (g_buck_state.enabled) {

// 停止PWM

HAL_TIM_PWM_Stop(BUCK_PWM_TIMER, BUCK_PWM_CHANNEL);

// 清零占空比

g_buck_state.duty = 0.0f;

buck_set_duty_cycle(0.0f);

g_buck_state.enabled = false;

}

}

/**

* @brief 设置PWM占空比

* @param duty: 占空比 (0.0 - 1.0)

*/

void buck_set_duty_cycle(float duty)

{

// 限制范围

if (duty < BUCK_DUTY_MIN) duty = BUCK_DUTY_MIN;

if (duty > BUCK_DUTY_MAX) duty = BUCK_DUTY_MAX;

// 计算CCR值

uint32_t period = __HAL_TIM_GET_AUTORELOAD(BUCK_PWM_TIMER);

uint32_t pulse = (uint32_t)(duty * period);

// 设置占空比

__HAL_TIM_SET_COMPARE(BUCK_PWM_TIMER, BUCK_PWM_CHANNEL, pulse);

g_buck_state.duty = duty;

}

/**

* @brief PID控制器更新

* @param pid: PID控制器

* @param setpoint: 设定值

* @param measurement: 测量值

* @param dt: 时间间隔 (s)

* @return 控制输出

*/

float pid_update(PID_Controller_t *pid, float setpoint,

float measurement, float dt)

{

// 计算误差

float error = setpoint - measurement;

// 比例项

float p_term = pid->kp * error;

// 积分项

pid->integral += error * dt;

float i_term = pid->ki * pid->integral;

// 微分项

float derivative = (error - pid->prev_error) / dt;

float d_term = pid->kd * derivative;

// 总输出

float output = p_term + i_term + d_term;

// 限幅

if (output < pid->output_min) {

output = pid->output_min;

// 抗积分饱和

pid->integral -= error * dt;

}

if (output > pid->output_max) {

output = pid->output_max;

// 抗积分饱和

pid->integral -= error * dt;

}

// 保存当前误差

pid->prev_error = error;

return output;

}

/**

* @brief 读取输出电压

* @return 输出电压 (V)

*/

float buck_read_vout(void)

{

// 启动ADC转换

HAL_ADC_Start(&hadc1);

HAL_ADC_PollForConversion(&hadc1, 100);

uint32_t adc_value = HAL_ADC_GetValue(&hadc1);

// 转换为电压值

// 假设:ADC参考电压3.3V,12位ADC,分压比1:2

float voltage = (adc_value * 3.3f / 4096.0f) * 2.0f;

return voltage;

}

/**

* @brief 读取输出电流

* @return 输出电流 (A)

*/

float buck_read_iout(void)

{

// 使用电流检测电阻或霍尔传感器

// 这里假设使用0.1Ω检测电阻 + 运放放大10倍

HAL_ADC_Start(&hadc1);

HAL_ADC_PollForConversion(&hadc1, 100);

uint32_t adc_value = HAL_ADC_GetValue(&hadc1);

// 转换为电流值

float voltage = adc_value * 3.3f / 4096.0f;

float current = voltage / 10.0f / 0.1f; // I = V / (Gain × Rsense)

return current;

}

/**

* @brief Buck转换器控制循环(定时调用,如1kHz)

*/

void buck_control_loop(void)

{

if (!g_buck_state.enabled) {

return;

}

// 读取输出电压和电流

g_buck_state.vout = buck_read_vout();

g_buck_state.iout = buck_read_iout();

// PID控制

float dt = 0.001f; // 1ms控制周期

float new_duty = pid_update(&g_voltage_pid,

g_buck_state.vout_target,

g_buck_state.vout,

dt);

// 更新占空比

buck_set_duty_cycle(new_duty);

// 故障检测

buck_check_faults();

}

/**

* @brief 故障检测

*/

void buck_check_faults(void)

{

g_buck_state.fault_flags = 0;

// 过压保护

if (g_buck_state.vout > BUCK_VOUT_TARGET * 1.2f) {

g_buck_state.fault_flags |= (1 << 0);

buck_stop();

}

// 欠压保护

if (g_buck_state.vout < BUCK_VOUT_TARGET * 0.8f) {

g_buck_state.fault_flags |= (1 << 1);

}

// 过流保护

if (g_buck_state.iout > BUCK_IOUT_MAX * 1.2f) {

g_buck_state.fault_flags |= (1 << 2);

buck_stop();

}

}

/**

* @brief 设置目标输出电压

* @param voltage: 目标电压 (V)

*/

void buck_set_output_voltage(float voltage)

{

g_buck_state.vout_target = voltage;

// 重置PID积分项

g_voltage_pid.integral = 0.0f;

}

/**

* @brief 获取Buck转换器状态

* @return 状态结构指针

*/

const Buck_State_t* buck_get_state(void)

{

return &g_buck_state;

}

第三部分:Boost升压转换器设计¶

3.1 Boost转换器原理¶

Boost转换器用于将低电压升高到更高电压。

电路结构:

Boost转换器基本电路:

Vin ──[L]──┬──[D1]──┬── Vout

│ │

┌┴┐ ┌┴┐

│Q│ │C│ Rload

│1│ │o│

└┬┘ └┬┘

│ │

GND──────GND

组件说明:

- L: 储能电感

- Q1: 功率开关管 (N-MOSFET)

- D1: 整流二极管 (Schottky)

- Co: 输出滤波电容

- Rload: 负载

工作过程:

工作周期分析:

阶段1:Q1导通 (Ton)

┌─────────────────────────┐

│ Vin → L → Q1 → GND │

│ 电感储能 │

│ di/dt = Vin/L │

│ 电感电流线性上升 │

└─────────────────────────┘

阶段2:Q1关断 (Toff)

┌─────────────────────────┐

│ Vin → L → D1 → Vout │

│ 电感释放能量 │

│ di/dt = (Vin-Vout)/L │

│ 电感电流下降 │

└─────────────────────────┘

稳态时:

Ton × Vin = Toff × (Vout - Vin)

推导得:

Vout = Vin / (1 - D)

其中 D = Ton / (Ton + Toff)

特点:

- 输出电压总是高于输入电压

- 占空比越大,升压比越高

- D → 1 时,Vout → ∞ (理论上)

- 实际最大占空比约0.8-0.85

3.2 Boost转换器设计步骤¶

设计规格示例:

设计要求:

- 输入电压:Vin = 3.7V (单节锂电池)

- 输出电压:Vout = 5V

- 输出电流:Iout = 1A

- 开关频率:f = 500kHz

- 输出纹波:ΔVout < 50mV

- 效率目标:η > 85%

步骤1:计算占空比:

/**

* @brief 计算Boost转换器占空比

* @param vin: 输入电压 (V)

* @param vout: 输出电压 (V)

* @return 占空比 (0-1)

*/

float boost_calculate_duty_cycle(float vin, float vout)

{

// 理想占空比

// D = 1 - Vin/Vout

float duty = 1.0f - (vin / vout);

// 考虑二极管压降

float vd = 0.3f; // 肖特基二极管压降

duty = 1.0f - (vin / (vout + vd));

// 限制范围

if (duty < 0.1f) duty = 0.1f;

if (duty > 0.85f) duty = 0.85f; // 实际最大值

return duty;

}

// 示例计算

// Vin = 3.7V, Vout = 5V

// D = 1 - 3.7/5 = 0.26 (26%)

步骤2:选择电感值:

/**

* @brief 计算Boost转换器电感值

* @param vin: 输入电压 (V)

* @param iout: 输出电流 (A)

* @param vout: 输出电压 (V)

* @param freq: 开关频率 (Hz)

* @param ripple_ratio: 电流纹波比 (0.2-0.4)

* @return 电感值 (H)

*/

float boost_calculate_inductance(float vin, float iout,

float vout, float freq,

float ripple_ratio)

{

// 输入电流(大于输出电流)

float iin = iout * vout / vin / 0.9f; // 考虑效率

// 电感电流纹波

float delta_il = iin * ripple_ratio;

// 占空比

float duty = 1.0f - (vin / vout);

// 电感值计算

// L = Vin × D / (f × ΔIL)

float inductance = vin * duty / (freq * delta_il);

return inductance;

}

// 示例计算

// Vin = 3.7V, Vout = 5V, Iout = 1A

// f = 500kHz, ripple = 30%

// Iin ≈ 1.5A

// ΔIL = 1.5A × 0.3 = 0.45A

// L = 3.7 × 0.26 / (500000 × 0.45)

// L = 4.3 μH

// 选择标准值:L = 4.7μH

步骤3:选择输出电容:

/**

* @brief 计算Boost转换器输出电容

* @param iout: 输出电流 (A)

* @param duty: 占空比

* @param freq: 开关频率 (Hz)

* @param delta_vout: 允许的输出电压纹波 (V)

* @return 输出电容值 (F)

*/

float boost_calculate_output_capacitance(float iout, float duty,

float freq,

float delta_vout)

{

// Boost输出电容计算

// Co = Iout × D / (f × ΔVout)

float capacitance = iout * duty / (freq * delta_vout);

return capacitance;

}

// 示例计算

// Iout = 1A, D = 0.26, f = 500kHz, ΔVout = 50mV

// Co = 1 × 0.26 / (500000 × 0.05)

// Co = 10.4 μF

// 选择:Co = 22μF (低ESR陶瓷电容)

3.3 Boost转换器完整实现¶

/**

* @file boost_converter.c

* @brief Boost升压转换器完整实现

*/

#include

#include

#include "stm32f1xx_hal.h"

/* 设计参数 */

#define BOOST_VIN_NOM 3.7f // 标称输入电压

#define BOOST_VOUT_TARGET 5.0f // 目标输出电压

#define BOOST_IOUT_MAX 1.0f // 最大输出电流

#define BOOST_PWM_FREQUENCY 500000 // 500kHz

#define BOOST_INDUCTANCE 4.7e-6f // 4.7μH

#define BOOST_OUTPUT_CAP 22e-6f // 22μF

/**

* @brief Boost转换器状态

*/

typedef struct {

float vin; // 输入电压

float vout; // 输出电压

float iin; // 输入电流

float iout; // 输出电流

float duty; // 占空比

float vout_target; // 目标输出电压

bool enabled; // 使能状态

uint32_t fault_flags; // 故障标志

} Boost_State_t;

static Boost_State_t g_boost_state = {0};

/**

* @brief 初始化Boost转换器

*/

int boost_init(void)

{

// PWM初始化(类似Buck)

// ... PWM配置代码 ...

// ADC初始化

// ... ADC配置代码 ...

// 初始化状态

g_boost_state.vout_target = BOOST_VOUT_TARGET;

g_boost_state.duty = 0.0f;

g_boost_state.enabled = false;

return 0;

}

/**

* @brief 启动Boost转换器(软启动)

*/

void boost_start(void)

{

if (!g_boost_state.enabled) {

// 软启动:逐步增加占空比

for (float d = 0.1f; d < 0.3f; d += 0.01f) {

boost_set_duty_cycle(d);

HAL_Delay(10); // 延迟10ms

}

g_boost_state.enabled = true;

}

}

/**

* @brief Boost控制循环

*/

void boost_control_loop(void)

{

if (!g_boost_state.enabled) {

return;

}

// 读取电压电流

g_boost_state.vin = boost_read_vin();

g_boost_state.vout = boost_read_vout();

g_boost_state.iin = boost_read_iin();

g_boost_state.iout = boost_read_iout();

// 计算理论占空比

float duty_ideal = 1.0f - (g_boost_state.vin /

g_boost_state.vout_target);

// PID微调

float error = g_boost_state.vout_target - g_boost_state.vout;

float duty_correction = error * 0.01f; // 简单比例控制

float new_duty = duty_ideal + duty_correction;

// 限制占空比

if (new_duty < 0.1f) new_duty = 0.1f;

if (new_duty > 0.85f) new_duty = 0.85f;

boost_set_duty_cycle(new_duty);

// 故障检测

boost_check_faults();

}

/**

* @brief Boost故障检测

*/

void boost_check_faults(void)

{

g_boost_state.fault_flags = 0;

// 输入欠压

if (g_boost_state.vin < 2.5f) {

g_boost_state.fault_flags |= (1 << 0);

boost_stop();

}

// 输出过压

if (g_boost_state.vout > BOOST_VOUT_TARGET * 1.2f) {

g_boost_state.fault_flags |= (1 << 1);

boost_stop();

}

// 输入过流

if (g_boost_state.iin > 3.0f) {

g_boost_state.fault_flags |= (1 << 2);

boost_stop();

}

}

第四部分:Buck-Boost转换器设计¶

4.1 Buck-Boost转换器原理¶

Buck-Boost转换器可以实现升压或降压,输出电压极性与输入相反。

电路结构:

Buck-Boost转换器(反相):

Vin ──┬──[Q1]──[L]──┬──[D1]──┬── -Vout

│ │ │

┌┴┐ GND ┌┴┐

│C│ │C│ Rload

│i│ │o│

│n│ └┬┘

└┬┘ │

│ │

GND─────────────────────┘

输出电压:

Vout = -Vin × D / (1 - D)

特点:

- 输出电压极性相反

- 可升压可降压

- 输入输出不共地

非反相Buck-Boost(SEPIC/Cuk):

SEPIC拓扑(同相升降压):

Vin ──[L1]──┬──[Q1]──┬──[L2]──┬── Vout

│ │ │

┌┴┐ ┌┴┐ ┌┴┐

│C│ │C│ │C│ Rload

│1│ │c│ │o│

└┬┘ └┬┘ └┬┘

│ │ │

GND──────GND──────GND

优点:

- 输出同相

- 输入输出共地

- 输入电流连续

缺点:

- 元件多

- 成本高

- 设计复杂

4.2 四开关Buck-Boost设计¶

现代方案:使用四个开关实现非反相升降压。

电路结构:

四开关Buck-Boost:

Q1 Q3

Vin ──┬─[S]─┬──[L]──┬─[S]─┬── Vout

│ │ │ │

┌┴┐ ┌┴┐ ┌┴┐ ┌┴┐

│C│ │S│ │S│ │C│ Rload

│i│ │Q│ │Q│ │o│

│n│ │2│ │4│ └┬┘

└┬┘ └┬┘ └┬┘ │

│ │ │ │

GND───GND─────GND────GND

工作模式:

1. Buck模式 (Vin > Vout)

- Q1, Q4导通/关断

- Q2, Q3保持状态

2. Boost模式 (Vin < Vout)

- Q2, Q3导通/关断

- Q1, Q4保持状态

3. Buck-Boost模式 (Vin ≈ Vout)

- 四个开关协调工作

控制策略:

/**

* @brief 四开关Buck-Boost控制

*/

typedef enum {

MODE_BUCK = 0, // Buck模式

MODE_BOOST, // Boost模式

MODE_BUCK_BOOST // Buck-Boost模式

} BuckBoost_Mode_t;

/**

* @brief 选择工作模式

*/

BuckBoost_Mode_t select_operating_mode(float vin, float vout)

{

float ratio = vin / vout;

if (ratio > 1.1f) {

// 输入明显高于输出,使用Buck

return MODE_BUCK;

}

else if (ratio < 0.9f) {

// 输入明显低于输出,使用Boost

return MODE_BOOST;

}

else {

// 输入接近输出,使用Buck-Boost

return MODE_BUCK_BOOST;

}

}

/**

* @brief 四开关控制

*/

void four_switch_control(BuckBoost_Mode_t mode, float duty)

{

switch (mode) {

case MODE_BUCK:

// Buck模式:Q1和Q4同步开关

set_switch_q1(duty); // PWM

set_switch_q2(0); // 关断

set_switch_q3(1); // 导通

set_switch_q4(1.0f - duty); // 互补PWM

break;

case MODE_BOOST:

// Boost模式:Q2和Q3同步开关

set_switch_q1(1); // 导通

set_switch_q2(1.0f - duty); // 互补PWM

set_switch_q3(duty); // PWM

set_switch_q4(0); // 关断

break;

case MODE_BUCK_BOOST:

// Buck-Boost模式:四开关协调

// 复杂控制策略

four_switch_buck_boost_control(duty);

break;

}

}

第五部分:PWM控制技术¶

5.1 PWM控制芯片¶

常用的PWM控制芯片:

控制芯片分类:

1. 电压模式控制

- TL494 (经典双路PWM)

- UC3842/3843 (电流模式)

- SG3525 (推挽式)

2. 电流模式控制

- UC3842/3843

- LM2596 (集成开关)

- LM2577 (Boost)

3. 同步整流控制

- LTC3780 (Buck-Boost)

- TPS54360 (Buck)

- LM27313 (Boost)

4. 数字控制

- UCD3138 (数字电源)

- MCU + PWM外设

5.2 使用TL494设计Buck转换器¶

TL494引脚功能:

TL494引脚定义:

1 - IN1+ 误差放大器1正输入

2 - IN1- 误差放大器1负输入

3 - FB 反馈输入

4 - DTC 死区时间控制

5 - CT 振荡器定时电容

6 - RT 振荡器定时电阻

7 - GND 地

8 - C1 补偿电容1

9 - E1 发射极1

10 - E2 发射极2

11 - C2 补偿电容2

12 - VCC 电源 (7-40V)

13 - OUT_CTRL 输出控制

14 - REF 5V基准输出

15 - IN2+ 误差放大器2正输入

16 - IN2- 误差放大器2负输入

振荡频率:

f = 1 / (RT × CT)

TL494 Buck转换器电路:

/**

* @brief TL494参数计算

*/

// 振荡频率设置

// 目标频率:100kHz

// 选择:CT = 1nF

// 计算:RT = 1 / (f × CT) = 1 / (100000 × 1e-9) = 10kΩ

// 反馈分压电阻

// Vout = 5V, Vref = 5V

// R1 / (R1 + R2) = Vref / Vout

// 选择:R1 = 10kΩ, R2 = 0 (直接反馈)

// 死区时间控制

// DTC引脚接地:0%死区

// DTC引脚接Vref:最大死区

/**

* @brief TL494应用电路示例

*/

const char* tl494_circuit =

"TL494 Buck转换器电路:\n"

"\n"

"Vin(12V) ──┬── VCC(12)\n"

" │\n"

" ┌┴────────────┐\n"

" │ TL494 │\n"

" 10kΩ ───┤RT(6) │\n"

" 1nF ───┤CT(5) │\n"

" │ │\n"

" Vout ───┤FB(3) │\n"

" │ │\n"

" GND ───┤DTC(4) │\n"

" │ │\n"

" │ E1(9)──┼── MOSFET Gate\n"

" │ E2(10)─┼── (不用)\n"

" │ │\n"

" GND(7) REF(14)── 5V输出\n"

" └─────────────┘\n";

5.3 使用UC3842设计Boost转换器¶

UC3842特性:

UC3842/3843特性:

- 电流模式PWM控制

- 内置误差放大器

- 内置振荡器

- 欠压锁定 (UVLO)

- 最大占空比限制

- 输出驱动能力:1A

引脚定义:

1 - COMP 补偿

2 - VFB 电压反馈

3 - ISENSE 电流检测

4 - RT/CT 振荡器

5 - GND 地

6 - OUT 输出驱动

7 - VCC 电源

8 - VREF 5V基准

UC3842 Boost转换器设计:

/**

* @brief UC3842 Boost转换器参数计算

*/

// 振荡频率设置

// f = 1.8 / (RT × CT)

// 目标:200kHz

// 选择:CT = 1nF

// RT = 1.8 / (200000 × 1e-9) = 9kΩ

// 电流检测电阻

// Rsense = 1V / Ipeak

// Ipeak = 2 × Iin_avg (Boost)

// Iin_avg = Pout / (Vin × η) = 5W / (3.7V × 0.85) = 1.59A

// Ipeak = 3.18A

// Rsense = 1V / 3.18A = 0.31Ω

// 选择:Rsense = 0.3Ω, 2W

// 反馈分压

// Vout = 5V, Vref = 2.5V

// R1 / (R1 + R2) = Vref / Vout = 2.5 / 5 = 0.5

// 选择:R1 = 10kΩ, R2 = 10kΩ

/**

* @brief UC3842电路连接

*/

void uc3842_circuit_description(void)

{

/*

UC3842 Boost电路:

Vin ──[L]──┬──[D]──┬── Vout(5V)

│ │

┌┴┐ ┌┴┐

│Q│ │C│ Rload

│ │ │o│

└┬┘ └┬┘

│ │

[Rsense] ├─[R1]─┬─[R2]─GND

│ │ │

GND │ VFB(2)

┌──┴──────────┐

│ UC3842 │

│ │

9kΩ ───┤RT/CT(4) │

1nF ───┤ │

│ OUT(6)─┼── Q Gate

│ │

GND(5) VCC(7)── 12V

└─────────────┘

*/

}

5.4 MCU实现PWM控制¶

使用STM32实现完整的PWM控制:

/**

* @file mcu_pwm_control.c

* @brief MCU实现开关电源PWM控制

*/

#include "stm32f1xx_hal.h"

/* PWM配置 */

#define PWM_FREQUENCY 200000 // 200kHz

#define PWM_TIMER TIM1

#define PWM_CHANNEL TIM_CHANNEL_1

#define PWM_RESOLUTION 1000 // 10位分辨率

/* ADC通道 */

#define ADC_VOUT_CHANNEL ADC_CHANNEL_0

#define ADC_IOUT_CHANNEL ADC_CHANNEL_1

#define ADC_VIN_CHANNEL ADC_CHANNEL_2

/**

* @brief 初始化PWM

*/

int pwm_init(void)

{

TIM_HandleTypeDef htim;

// 计算定时器参数

uint32_t timer_clock = HAL_RCC_GetPCLK1Freq() * 2;

uint32_t prescaler = 0;

uint32_t period = timer_clock / PWM_FREQUENCY - 1;

// 如果period太大,使用预分频

while (period > 65535) {

prescaler++;

period = timer_clock / (prescaler + 1) / PWM_FREQUENCY - 1;

}

// 配置定时器

htim.Instance = PWM_TIMER;

htim.Init.Prescaler = prescaler;

htim.Init.CounterMode = TIM_COUNTERMODE_UP;

htim.Init.Period = period;

htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

htim.Init.RepetitionCounter = 0;

if (HAL_TIM_PWM_Init(&htim) != HAL_OK) {

return -1;

}

// 配置PWM通道

TIM_OC_InitTypeDef sConfigOC = {0};

sConfigOC.OCMode = TIM_OCMODE_PWM1;

sConfigOC.Pulse = 0;

sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;

sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;

sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;

if (HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC,

PWM_CHANNEL) != HAL_OK) {

return -1;

}

return 0;

}

/**

* @brief 设置PWM占空比

* @param duty: 占空比 (0.0 - 1.0)

*/

void pwm_set_duty(float duty)

{

// 限制范围

if (duty < 0.0f) duty = 0.0f;

if (duty > 1.0f) duty = 1.0f;

// 计算CCR值

uint32_t period = __HAL_TIM_GET_AUTORELOAD(&htim1);

uint32_t pulse = (uint32_t)(duty * period);

// 设置比较值

__HAL_TIM_SET_COMPARE(&htim1, PWM_CHANNEL, pulse);

}

/**

* @brief 启动PWM输出

*/

void pwm_start(void)

{

HAL_TIM_PWM_Start(&htim1, PWM_CHANNEL);

}

/**

* @brief 停止PWM输出

*/

void pwm_stop(void)

{

HAL_TIM_PWM_Stop(&htim1, PWM_CHANNEL);

}

/**

* @brief PWM频率可调

* @param frequency: 目标频率 (Hz)

*/

void pwm_set_frequency(uint32_t frequency)

{

uint32_t timer_clock = HAL_RCC_GetPCLK1Freq() * 2;

uint32_t period = timer_clock / frequency - 1;

__HAL_TIM_SET_AUTORELOAD(&htim1, period);

}

第六部分:元件选型指南¶

6.1 电感选型¶

电感是开关电源的核心元件。

电感参数:

电感关键参数:

1. 电感值 (L)

- 决定电流纹波

- 影响动态响应

- 典型值:1μH - 100μH

2. 饱和电流 (Isat)

- 电感值下降10-30%时的电流

- 必须 > 峰值电流

- 留20-30%裕量

3. 额定电流 (Irms)

- 温升限制的电流

- 必须 > RMS电流

- 留20-30%裕量

4. 直流电阻 (DCR)

- 影响效率

- 越小越好

- 典型:几十mΩ

5. 封装尺寸

- 功率越大,体积越大

- 屏蔽式 vs 非屏蔽式

- SMD vs 插件

电感类型:

- 铁粉芯:成本低,饱和特性软

- 铁氧体:高频特性好,饱和特性硬

- 合金粉芯:性能好,成本高

电感选型步骤:

/**

* @brief 电感选型计算

*/

typedef struct {

float inductance; // 电感值 (H)

float isat_min; // 最小饱和电流 (A)

float irms_min; // 最小额定电流 (A)

float dcr_max; // 最大直流电阻 (Ω)

float peak_current; // 峰值电流 (A)

float rms_current; // RMS电流 (A)

} Inductor_Spec_t;

/**

* @brief 计算电感规格

*/

void calculate_inductor_spec(float vin, float vout,

float iout, float freq,

Inductor_Spec_t *spec)

{

// 计算电感值

float duty = vout / vin; // Buck示例

float delta_il = iout * 0.3f; // 30%纹波

spec->inductance = (vin - vout) * duty / (freq * delta_il);

// 计算峰值电流

spec->peak_current = iout + delta_il / 2.0f;

// 饱和电流要求(1.3倍裕量)

spec->isat_min = spec->peak_current * 1.3f;

// RMS电流(Buck近似等于输出电流)

spec->rms_current = iout;

// 额定电流要求(1.2倍裕量)

spec->irms_min = spec->rms_current * 1.2f;

// DCR要求(损耗 < 1%)

spec->dcr_max = 0.01f * vout / spec->rms_current;

}

// 示例选型

// Vin=12V, Vout=5V, Iout=2A, f=200kHz

// 计算结果:

// - L = 24μH

// - Isat > 2.8A

// - Irms > 2.4A

// - DCR < 25mΩ

//

// 推荐型号:

// - Coilcraft MSS1260-223 (22μH, 3.5A, 2.8A, 23mΩ)

// - Wurth 744 043 220 (22μH, 4.2A, 3.5A, 18mΩ)

6.2 电容选型¶

输入电容选型:

输入电容要求:

1. 容值

- 提供瞬态电流

- 滤除输入纹波

- 典型:10μF - 100μF

2. 耐压

- 1.5-2倍输入电压

- 考虑瞬态过压

3. ESR (等效串联电阻)

- 影响纹波电压

- 越小越好

- 陶瓷电容ESR最小

4. 纹波电流额定值

- 必须 > RMS纹波电流

- 留50%裕量

电容类型选择:

- 陶瓷电容:ESR低,体积小,成本适中

- 电解电容:容值大,ESR较高,寿命受温度影响

- 钽电容:性能好,成本高,有失效风险

输出电容选型:

/**

* @brief 输出电容选型

*/

typedef struct {

float capacitance; // 电容值 (F)

float voltage_rating; // 耐压 (V)

float esr_max; // 最大ESR (Ω)

float ripple_current; // 纹波电流 (A)

} Capacitor_Spec_t;

/**

* @brief 计算输出电容规格

*/

void calculate_output_cap_spec(float vout, float iout,

float delta_il, float freq,

float delta_vout,

Capacitor_Spec_t *spec)

{

// 容值计算(基于纹波要求)

spec->capacitance = delta_il / (8.0f * freq * delta_vout);

// 耐压(1.5倍裕量)

spec->voltage_rating = vout * 1.5f;

// ESR要求

// ΔVout_esr = ΔIL × ESR

spec->esr_max = delta_vout / delta_il;

// 纹波电流(RMS)

// Ic_rms ≈ ΔIL / (2√3)

spec->ripple_current = delta_il / (2.0f * 1.732f);

}

// 示例

// Vout=5V, Iout=2A, ΔIL=0.6A, f=200kHz, ΔVout=50mV

// 结果:

// - C > 7.5μF

// - Vrating > 7.5V (选10V或16V)

// - ESR < 83mΩ

// - Iripple > 0.17A

//

// 推荐:

// - 22μF/10V X7R陶瓷电容

// - 或 2×10μF/10V 并联

6.3 MOSFET选型详解¶

MOSFET关键参数:

MOSFET参数详解:

1. Vds (漏源击穿电压)

- 必须 > 最大输入电压

- 留1.5-2倍裕量

- 考虑瞬态尖峰

2. Id (漏极电流)

- 连续电流额定值

- 必须 > 最大负载电流

- 留1.5-2倍裕量

3. Rds(on) (导通电阻)

- 影响导通损耗

- 越小越好

- 注意温度系数

4. Qg (总栅极电荷)

- 影响开关速度

- 影响驱动损耗

- 越小越好

5. Ciss, Coss, Crss (寄生电容)

- 影响开关特性

- Crss (米勒电容) 影响最大

6. 封装

- TO-220, TO-263, SO-8等

- 散热能力

- PCB面积

损耗计算:

P_cond = I²_rms × Rds(on)

P_sw = 0.5 × Vin × Iout × (tr + tf) × f

P_gate = Qg × Vgs × f

P_total = P_cond + P_sw + P_gate

MOSFET选型实例:

/**

* @brief MOSFET损耗计算

*/

typedef struct {

float p_conduction; // 导通损耗 (W)

float p_switching; // 开关损耗 (W)

float p_gate; // 栅极驱动损耗 (W)

float p_total; // 总损耗 (W)

float efficiency; // 效率

float tj_max; // 最大结温 (°C)

} MOSFET_Loss_t;

/**

* @brief 计算MOSFET损耗

*/

void calculate_mosfet_loss(float vin, float iout, float duty,

float rds_on, float qg, float freq,

float tr, float tf,

MOSFET_Loss_t *loss)

{

// 导通损耗

float i_rms = iout * sqrtf(duty); // Buck RMS电流

loss->p_conduction = i_rms * i_rms * rds_on;

// 开关损耗

loss->p_switching = 0.5f * vin * iout * (tr + tf) * freq;

// 栅极驱动损耗

float vgs = 10.0f; // 栅极驱动电压

loss->p_gate = qg * 1e-9f * vgs * freq;

// 总损耗

loss->p_total = loss->p_conduction +

loss->p_switching +

loss->p_gate;

// 效率影响

float p_out = iout * vin * duty; // 输出功率

loss->efficiency = p_out / (p_out + loss->p_total);

}

// 示例计算

// Vin=12V, Iout=2A, D=0.417, f=200kHz

// MOSFET: Rds(on)=10mΩ, Qg=20nC, tr=tf=20ns

//

// 结果:

// P_cond = (2×√0.417)² × 0.01 = 0.17W

// P_sw = 0.5 × 12 × 2 × 40e-9 × 200000 = 0.096W

// P_gate = 20e-9 × 10 × 200000 = 0.04W

// P_total = 0.306W

// η_loss = 0.306 / (5 + 0.306) = 5.8%

6.4 二极管选型¶

肖特基二极管 vs 快恢复二极管:

二极管类型对比:

肖特基二极管 (Schottky):

优点:

- 正向压降低 (0.2-0.4V)

- 反向恢复时间极短 (几乎为0)

- 开关损耗小

- 效率高

缺点:

- 反向漏电流大

- 耐压较低 (通常<200V)

- 温度特性较差

应用:

- 低压大电流场合

- 高频开关电源

- Buck/Boost续流二极管

快恢复二极管 (Fast Recovery):

优点:

- 耐压高

- 反向漏电流小

- 温度特性好

缺点:

- 正向压降高 (0.8-1.2V)

- 有反向恢复时间

- 效率较低

应用:

- 高压场合

- 工频整流

- PFC电路

超快恢复二极管 (Ultra Fast):

- 介于两者之间

- trr < 50ns

- 适合中高压场合

二极管选型计算:

/**

* @brief 二极管损耗计算

*/

typedef struct {

float p_conduction; // 导通损耗 (W)

float p_reverse; // 反向恢复损耗 (W)

float p_total; // 总损耗 (W)

} Diode_Loss_t;

/**

* @brief 计算二极管损耗

*/

void calculate_diode_loss(float if_avg, float vf,

float vin, float freq,

float trr, float qrr,

Diode_Loss_t *loss)

{

// 导通损耗

loss->p_conduction = if_avg * vf;

// 反向恢复损耗

// P_rr = 0.5 × Vin × Qrr × f

loss->p_reverse = 0.5f * vin * qrr * 1e-9f * freq;

// 总损耗

loss->p_total = loss->p_conduction + loss->p_reverse;

}

// 肖特基二极管示例

// If_avg=1.2A, Vf=0.3V, Vin=12V, f=200kHz

// trr≈0, Qrr≈0

// P_cond = 1.2 × 0.3 = 0.36W

// P_rr ≈ 0W

// P_total = 0.36W

// 快恢复二极管示例

// If_avg=1.2A, Vf=1.0V, Vin=12V, f=200kHz

// trr=35ns, Qrr=50nC

// P_cond = 1.2 × 1.0 = 1.2W

// P_rr = 0.5 × 12 × 50e-9 × 200000 = 0.06W

// P_total = 1.26W

//

// 结论:肖特基效率更高!

第七部分:反馈控制与补偿¶

7.1 电压反馈原理¶

反馈网络设计:

电压反馈电路:

Vout ──┬──[R1]──┬── VFB (到控制器)

│ │

┌┴┐ ┌┴┐

│ │ │R│

│L│ │2│

│o│ └┬┘

│a│ │

│d│ GND

└─┘

分压比:

VFB = Vout × R2 / (R1 + R2)

设计要求:

VFB = Vref (控制器基准电压)

电阻选择:

- 总电阻:10kΩ - 100kΩ

- 太小:功耗大

- 太大:噪声敏感

示例:

Vout = 5V, Vref = 1.25V

R2 / (R1 + R2) = 1.25 / 5 = 0.25

选择:R2 = 10kΩ, R1 = 30kΩ

误差放大器:

/**

* @brief 误差放大器传递函数

*/

// Type II补偿网络

// 一个零点,两个极点

//

// R2

// Vout ──┬──────┬── VFB

// │ │

// ┌┴┐ ┌┴┐

// │R│ │C│

// │1│ │1│

// └┬┘ └┬┘

// │ │

// ┌┴┐ ┌┴┐

// │C│ │R│

// │2│ │3│

// └┬┘ └┬┘

// │ │

// GND GND

// 零点频率:

// fz = 1 / (2π × R1 × C1)

// 极点频率:

// fp1 = 1 / (2π × R2 × C1)

// fp2 = 1 / (2π × R3 × C2)

// 设计步骤:

// 1. 零点放在LC谐振频率之前

// 2. 极点放在开关频率之前

// 3. 保证足够的相位裕度 (>45°)

/**

* @brief Type II补偿网络设计

*/

typedef struct {

float r1, r2, r3; // 电阻值 (Ω)

float c1, c2; // 电容值 (F)

float fz; // 零点频率 (Hz)

float fp1, fp2; // 极点频率 (Hz)

} TypeII_Comp_t;

/**

* @brief 设计Type II补偿网络

*/

void design_type2_compensation(float fc, float fsw,

TypeII_Comp_t *comp)

{

// 交越频率:开关频率的1/10

fc = fsw / 10.0f;

// 零点:交越频率的1/5

comp->fz = fc / 5.0f;

// 极点1:交越频率的5倍

comp->fp1 = fc * 5.0f;

// 极点2:开关频率的1/2

comp->fp2 = fsw / 2.0f;

// 选择C1

comp->c1 = 100e-9f; // 100nF

// 计算R1

comp->r1 = 1.0f / (2.0f * 3.14159f * comp->fz * comp->c1);

// 计算R2

comp->r2 = 1.0f / (2.0f * 3.14159f * comp->fp1 * comp->c1);

// 选择C2

comp->c2 = 10e-9f; // 10nF

// 计算R3

comp->r3 = 1.0f / (2.0f * 3.14159f * comp->fp2 * comp->c2);

}

// 示例:fsw = 200kHz

// fc = 20kHz

// fz = 4kHz

// fp1 = 100kHz

// fp2 = 100kHz

// C1 = 100nF

// R1 = 398Ω (选390Ω)

// R2 = 15.9Ω (选15Ω)

// C2 = 10nF

// R3 = 159Ω (选160Ω)

7.2 电流模式控制¶

电流模式控制原理:

电流模式控制优点:

1. 内环电流控制

- 逐周期限流

- 快速响应

- 自动斜率补偿

2. 简化补偿

- 单极点系统

- 补偿网络简单

- 稳定性好

3. 并联均流

- 多相电源

- 负载均衡

- 模块化设计

电流检测方法:

1. 检测电阻

- 精度高

- 功耗大

- 成本低

2. DCR检测

- 利用电感DCR

- 无额外损耗

- 需要RC网络

3. 霍尔传感器

- 隔离检测

- 无损耗

- 成本高

斜率补偿:

/**

* @brief 斜率补偿计算

*/

// 为什么需要斜率补偿?

// 当占空比 > 50% 时,电流模式控制会出现次谐波振荡

// 斜率补偿原理:

// 在电流检测信号上叠加一个斜坡信号

// 补偿斜率计算:

// Se > 0.5 × Sn

// 其中:

// Se: 补偿斜率

// Sn: 电感电流下降斜率 = (Vout + Vd) / L

/**

* @brief 计算所需补偿斜率

*/

float calculate_slope_compensation(float vout, float vd,

float inductance, float fsw)

{

// 电感电流下降斜率

float sn = (vout + vd) / inductance;

// 所需补偿斜率(取0.6倍安全系数)

float se = 0.6f * sn;

// 补偿电压幅度

float v_comp = se * inductance / fsw;

return v_comp;

}

// 示例:

// Vout = 5V, Vd = 0.3V, L = 22μH, fsw = 200kHz

// Sn = 5.3 / 22e-6 = 240,909 A/s

// Se = 0.6 × 240,909 = 144,545 A/s

// V_comp = 144,545 × 22e-6 / 200000 = 15.9mV

7.3 数字控制实现¶

使用MCU实现数字PID控制:

/**

* @file digital_control.c

* @brief 数字PID控制实现

*/

/**

* @brief 数字PID控制器

*/

typedef struct {

// PID参数

float kp; // 比例系数

float ki; // 积分系数

float kd; // 微分系数

// 状态变量

float integral; // 积分累积

float prev_error; // 上次误差

float prev_output; // 上次输出

// 限幅

float output_min; // 输出最小值

float output_max; // 输出最大值

float integral_max; // 积分限幅

// 采样时间

float dt; // 采样周期 (s)

} Digital_PID_t;

/**

* @brief 初始化数字PID

*/

void digital_pid_init(Digital_PID_t *pid, float kp, float ki,

float kd, float dt)

{

pid->kp = kp;

pid->ki = ki;

pid->kd = kd;

pid->dt = dt;

pid->integral = 0.0f;

pid->prev_error = 0.0f;

pid->prev_output = 0.0f;

pid->output_min = 0.0f;

pid->output_max = 1.0f;

pid->integral_max = 0.5f;

}

/**

* @brief 数字PID更新(位置式)

*/

float digital_pid_update(Digital_PID_t *pid,

float setpoint,

float measurement)

{

// 计算误差

float error = setpoint - measurement;

// 比例项

float p_term = pid->kp * error;

// 积分项(梯形积分)

pid->integral += (error + pid->prev_error) * pid->dt / 2.0f;

// 积分限幅(抗饱和)

if (pid->integral > pid->integral_max) {

pid->integral = pid->integral_max;

}

if (pid->integral < -pid->integral_max) {

pid->integral = -pid->integral_max;

}

float i_term = pid->ki * pid->integral;

// 微分项(一阶滤波)

float derivative = (error - pid->prev_error) / pid->dt;

float alpha = 0.1f; // 滤波系数

derivative = alpha * derivative +

(1.0f - alpha) * pid->prev_output;

float d_term = pid->kd * derivative;

// 总输出

float output = p_term + i_term + d_term;

// 输出限幅

if (output > pid->output_max) {

output = pid->output_max;

}

if (output < pid->output_min) {

output = pid->output_min;

}

// 保存状态

pid->prev_error = error;

pid->prev_output = output;

return output;

}

/**

* @brief 增量式PID

*/

float digital_pid_incremental(Digital_PID_t *pid,

float setpoint,

float measurement)

{

// 当前误差

float error = setpoint - measurement;

// 增量计算

float delta_output = pid->kp * (error - pid->prev_error) +

pid->ki * error * pid->dt +

pid->kd * (error - 2.0f * pid->prev_error +

pid->prev_output) / pid->dt;

// 累加输出

float output = pid->prev_output + delta_output;

// 限幅

if (output > pid->output_max) output = pid->output_max;

if (output < pid->output_min) output = pid->output_min;

// 保存状态

pid->prev_output = pid->prev_error;

pid->prev_error = error;

pid->prev_output = output;

return output;

}

/**

* @brief PID参数自整定(Ziegler-Nichols方法)

*/

void pid_auto_tune(Digital_PID_t *pid, float ku, float tu)

{

// Ku: 临界增益

// Tu: 临界周期

// 经典PID参数

pid->kp = 0.6f * ku;

pid->ki = 1.2f * ku / tu;

pid->kd = 0.075f * ku * tu;

}

Copyright © 2088 初试游戏活动中心-热门网游最新资讯发布平台 All Rights Reserved.
友情链接