15.3 数字BUCK变换器项目1:开环系统设计
# 15.3 数字BUCK变换器项目1:开环系统设计
本实验通过STM32的高级定时器TIM1输出互补PWM信号驱动同步BUCK电路,结合ADC采样与OLED显示,实现开环电压调节功能。
核心功能:
- 互补PWM驱动:TIM1生成带死区的PWM信号,避免上下管直通。
- 电压/电流采样:ADC采集输出参数并通过OLED实时显示。
- 编码器控制:动态调节占空比,精确控制输出电压。
# 15.3.1 STM32CubeMX配置
# 1. 工程基础配置
- 芯片型号:STM32F103C8T6
- 主频:72MHz
- 调试接口:SWD
# 2. TIM1互补PWM配置
- 引脚分配:
- PA8 → TIM1_CH1(主PWM输出)
- PB13 → TIM1_CH1N(互补输出)
- 参数设置:
- 频率:100kHz(PSC=0,ARR=720-1)
- 死区时间:0.138μs(Dead Time=43)

# 3. ADC与DMA配置
- ADC通道:
- IN4(电压采样)
- IN5(电流采样)
- 触发源:TIM1捕获比较事件(同步PWM触发)
- DMA模式:循环传输,解放CPU资源

# 15.3.2 开环软件设计
# 1. 初始化代码
/* USER CODE BEGIN 2 */
OLED_Init(); // OLED初始化
HAL_ADCEx_Calibration_Start(&hadc1); // ADC校准
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)value, 2); // 启动DMA传输
HAL_TIM_Base_Start_IT(&htim1); // 启动TIM1
HAL_TIM_Base_Start_IT(&htim3); // 启动TIM3(OLED刷新)
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); // 启动PWM主通道
HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1); // 启动互补通道
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL); // 启动编码器
/* USER CODE END 2 */
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 2. 数据转换与显示(代码清单15‑4)
void OLED_Disp(void) {
Vout = value[1] * 13.2 / 4096; // 电压转换:Vout = ADC值 × (3.3V/4096) × 分压比
Iout = value[0] * 1.65 / 4096; // 电流转换:Iout = ADC值 × (3.3V/4096) × 放大倍数
sprintf(Vo_str, "Vout:%0.2fV", Vout);
sprintf(Io_str, "Iout:%0.2fA", Iout);
sprintf(D_str, "Duty:%.2d%%", Encoder_cnt);
// OLED显示刷新
OLED_PrintString(45, 0, "BUCK", &font16x16, OLED_COLOR_NORMAL);
OLED_PrintString(16, 15, Vo_str, &font16x16, OLED_COLOR_NORMAL);
OLED_PrintString(16, 30, Io_str, &font16x16, OLED_COLOR_NORMAL);
OLED_PrintString(16, 45, D_str, &font16x16, OLED_COLOR_NORMAL);
OLED_ShowFrame();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 3. 编码器控制逻辑(代码清单15‑5)
void Encoder(void) {
Encoder_cnt = __HAL_TIM_GET_COUNTER(&htim2); // 读取编码器值
// 限幅处理:10%~90%
if (Encoder_cnt <= 10 || Encoder_cnt > 60000) {
Encoder_cnt = 10;
__HAL_TIM_SET_COUNTER(&htim2, 10);
} else if (Encoder_cnt > 90) {
Encoder_cnt = 90;
__HAL_TIM_SET_COUNTER(&htim2, 90);
}
// 占空比映射:编码器值 → CCR值(比例系数7.2)
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, Encoder_cnt * 7.2);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 15.3.3 开环实验验证
# 1. 实验步骤
- 硬件连接:
- 输入电源:12V锂电池
- 负载:10Ω/2W电阻
- 占空比计算:
- 示波器观测:
- 测量PA8(PWM)与PB13(互补PWM)波形,验证死区时间与频率。
# 2. 结果分析
驱动波形:
实测频率99.79kHz,误差在合理范围内(±1%)。输出电压:
初始占空比28%时输出电压偏差,调整至31%后输出稳定3.3V。
# 15.3.4 关键说明
- 死区时间:0.138μs,避免MOS管直通损坏。
- 编码器映射:10~90编码值对应占空比10%~90%(CCR=72~648)。
- ADC校准:HAL_ADCEx_Calibration_Start确保采样精度。