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配置

  1. 引脚分配
    • PA8 → TIM1_CH1(主PWM输出)
    • PB13 → TIM1_CH1N(互补输出)
  2. 参数设置
    • 频率:100kHz(PSC=0,ARR=720-1)
    • 死区时间:0.138μs(Dead Time=43)
TIM1输出触发事件选择

# 3. ADC与DMA配置

  • ADC通道
    • IN4(电压采样)
    • IN5(电流采样)
  • 触发源:TIM1捕获比较事件(同步PWM触发)
  • DMA模式:循环传输,解放CPU资源
ADC1的外部触发转换设置

# 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. 数据转换与显示(代码清单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

# 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

# 15.3.3 开环实验验证

# 1. 实验步骤

  1. 硬件连接
    • 输入电源:12V锂电池
    • 负载:10Ω/2W电阻
  2. 占空比计算

  3. 示波器观测
    • 测量PA8(PWM)与PB13(互补PWM)波形,验证死区时间与频率。

# 2. 结果分析

  • 驱动波形
    输出驱动波形图
    实测频率99.79kHz,误差在合理范围内(±1%)。

  • 输出电压
    OLED显示
    万用表显示
    初始占空比28%时输出电压偏差,调整至31%后输出稳定3.3V。


# 15.3.4 关键说明

  • 死区时间:0.138μs,避免MOS管直通损坏。
  • 编码器映射:10~90编码值对应占空比10%~90%(CCR=72~648)。
  • ADC校准:HAL_ADCEx_Calibration_Start确保采样精度。