14.3 高级定时器项目:PWM互补输出实验

# 14.3 高级定时器项目:PWM互补输出实验

本实验通过STM32的高级定时器TIM1生成带死区时间的互补PWM信号,结合示波器验证波形参数,并通过OLED实时显示中断计数。
核心功能

  • 互补PWM输出:TIM1_CH1(PA8)与TIM1_CH1N(PB13)输出互补信号。
  • 死区时间控制:避免上下桥臂直通,确保电路安全。
  • 频率与占空比调节:PWM频率150kHz,占空比可调。

# 14.3.1 STM32CubeMX配置

# 1. 基础配置

  • 工程设置:芯片型号STM32F103C8T6,主频72MHz,调试接口SWD。
  • TIM1配置
    • 模式:PWM Generation CH1 + CH1N(互补输出)。
    • 引脚:PA8(TIM1_CH1)、PB13(TIM1_CH1N)。
开启TIM1互补输出通道

# 2. 定时器参数

  • 预分频器(PSC):0 → 时钟频率72MHz。
  • 自动重装载值(ARR):480 → PWM频率150kHz。
  • 占空比(Pulse):200(约41.67%)。
  • 死区时间(Dead Time):43 → 0.597μs。
TIM1工作参数

# 3. 死区时间管理

  • 刹车功能:禁用。
  • 输出状态:OSSR/OSSI禁用,确保通道禁用时输出低电平。
  • 锁定配置:关闭写保护。
死区时间管理参数

# 14.3.2 软件设计

# 1. TIM1初始化(代码清单14‑2)

static void MX_TIM1_Init(void) {
  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 0;           // 预分频0,时钟72MHz
  htim1.Init.Period = 480;            // PWM周期480,频率150kHz
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP; // 向上计数
  TIM_OC_InitTypeDef sConfigOC = {
    .OCMode = TIM_OCMODE_PWM1,        // PWM模式1
    .Pulse = 200,                     // 初始占空比200(41.67%)
    .OCPolarity = TIM_OCPOLARITY_HIGH // 高电平有效
  };
  // 配置死区时间
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {
    .DeadTime = 43,                   // 死区时间43个时钟周期
    .BreakState = TIM_BREAK_DISABLE    // 禁用刹车功能
  };
  HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
  HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 2. 主函数(代码清单14‑3)

int main(void) {
  HAL_Init();
  MX_GPIO_Init();
  MX_TIM1_Init();
  MX_I2C1_Init();
  OLED_Init();
  // 启动PWM及互补输出
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
  while (1) {
    OLED_NewFrame();
    OLED_PrintString(1, 1, "PWM Complementary", &font16x16, OLED_COLOR_NORMAL);
    OLED_ShowFrame();
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 3. 中断回调函数(代码清单14‑4)

long int counter = 0;
char message[20];
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
  if (htim == &htim1) {
    counter++;
    if (counter == 150000) {  // 约1秒
      counter = 0;
      sprintf(message, "Count: %d", i++);
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11

# 14.3.3 下载验证

# 现象与步骤

  1. 烧录程序:通过ST-LINK下载代码至开发板。
  2. 示波器观测
    • PA8(TIM1_CH1):PWM波形,频率149.7kHz,占空比41.67%。
    • PB13(TIM1_CH1N):互补PWM波形,死区时间约600ns。
  3. OLED显示:每秒更新中断计数(如Count: 5)。
示波器显示互补PWM信号

关键说明

  • 频率计算

  • 死区时间:43个时钟周期对应约0.597μs(72MHz时钟)。
  • 应用场景:适用于电机驱动、半桥/全桥电路等需避免直通的场景。