TIMER1 — PWM 输出(HAL 库)
固件库: PY32F0xx_Firmware V1.5.0
芯片: PY32F030
源文件:PUYA/PY32F0xx_Firmware_V1.5.0/Projects/PY32F030-STK/Example/TIMER1/TIM1_PWM/Src/main.c
功能简介
定时器(TIMER)是 MCU 最灵活的外设之一,可完成定时、计数、PWM 输出、输入捕获、编码器接口等。本示例聚焦最常用的 PWM(脉冲宽度调制)输出。
PY32F030 的 TIM1 是高级定时器,带 4 路独立比较通道。本例配置:
- 定时器时钟 8MHz(HSI),预分频 800,自动重装载值
ARR = 50; - 4 个通道的比较值
CCRx分别设为 10/20/30/40,于是占空比为 20% / 40% / 60% / 80%; - 用
HAL_TIM_PWM_Start()启动 4 路 PWM,输出到对应引脚(在HAL_TIM_MspInit中映射为 TIM1_CH1~CH4)。
PWM 频率 = 定时器时钟 / (预分频 × (ARR+1)) = 8MHz / (800 × 50) = 200Hz。占空比 = CCR / (ARR+1)。
硬件准备
- PY32F030 开发板
- 示波器 / 逻辑分析仪(测 TIM1_CH1~CH4 引脚),或接 4 颗 LED(串限流电阻)观察亮度
- 无需额外接线(用板载/引脚直出)
完整代码
|
|
代码分段讲解
1. 频率与占空比计算
- PWM 频率 =
TIM_CLK / ((PSC+1) × (ARR+1))。- 本例:
8MHz / (800 × 50) = 200Hz。
- 本例:
- 某通道占空比 =
CCRx / (ARR+1)(PWM1 且极性为高时):- CH1:
10/50 = 20%,CH2:20/50 = 40%,CH3:30/50 = 60%,CH4:40/50 = 80%。
- CH1:
2. PWM 模式 1 / 2
TIM_OCMODE_PWM1:计数 < CCR 时输出有效(高),≥ CCR 时无效(低)。TIM_OCMODE_PWM2:极性相反。改变模式或OCPolarity可反转波形,但占空比数值关系不变。
3. 引脚映射
TIM1_CH1~CH4 具体复用哪个 GPIO 引脚,由 HAL_TIM_MspInit()(py32f0xx_hal_msp.c)里的 HAL_GPIO_Init + Alternate 决定。若你改了引脚,需同步修改 MSP 配置。
4. 高级定时器 TIM1 的特殊性
TIM1 是高级定时器,带互补输出与死区(可用于电机/电源)。本例未用互补通道(N 端),仅用普通 CH1~CH4 输出。
实验现象
- TIM1_CH1~CH4 输出 200Hz PWM,占空比分别为 20% / 40% / 60% / 80%;
- 接 LED 时可见 4 颗亮度依次递增;示波器可见 4 路不同占空比方波。
常见问题
-
引脚没波形?
- 确认 MSP 里已把 CHx 引脚复用为 TIM1 并按
Alternate配置; - 确认已调用
HAL_TIM_PWM_Start()对应通道。
- 确认 MSP 里已把 CHx 引脚复用为 TIM1 并按
-
想改频率?
- 改
Period(ARR)或Prescaler:频率与两者成反比。例:要 1kHz,可设PSC=800-1, ARR=10-1(8MHz/800/10=1kHz)。
- 改
-
想做呼吸灯?
- 在主循环或定时器中断里周期性改变
CCRx:__HAL_TIM_SET_COMPARE(&TimHandle, TIM_CHANNEL_x, newVal);。
- 在主循环或定时器中断里周期性改变
-
占空比算不对?
- 注意是
CCRx / (ARR+1),且受OCMode与OCPolarity影响有效区间。
- 注意是
小结
- PWM = 定时器在 ARR 范围内循环计数,用 CCR 决定高电平占比。
- 关键三参数:PSC(分频)、ARR(周期)、CCR(占空比)。
HAL_TIM_PWM_Init→HAL_TIM_PWM_ConfigChannel→HAL_TIM_PWM_Start三步即可输出。
拓展应用
- LED 调光 / 呼吸灯(
__HAL_TIM_SET_COMPARE动态调占空比)。 - 舵机控制(50Hz PWM,0.5
2.5ms 脉宽对应 0180°)。 - 直流电机调速(配合 MOSFET/驱动芯片)。
- 蜂鸣器发声(不同频率 PWM 出不同音调);多路 PWM 做音乐。
- 高级用法:互补 PWM + 死区驱动半桥(见
TIM1_ComplementarySignals系列)。