STM32呼吸灯实验手册(TIM定时器)
一、实验目标
- 使用TIM定时器的PWM模式控制LED亮度
- 实现LED渐亮渐灭的呼吸灯效果
- 掌握HAL库的TIM配置方法
二、硬件准备
- 开发板:STM32F103C8T6
- LED模块:LED串联220Ω电阻两组
- USB-TTL调试器
- 硬件连接
三、软件配置(STM32CubeMX)
- 打开STM32CubeMX
- 选择MCU型号:STM32F103C8T6
- 设置SYS调试接口:Serial Wire(SWD)
- 设置TIM参数
对照参数设置
按设置生成的波形
- 设置RCC参数
- 生成项目
四、代码编写
在生成代码的mian函数中编写如下代码
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL1);//启动PWM正常输出
HAL_TIMEx_PWM_Start(&htim1,TIM_CHANNEL1);//启动PWM互补输出
while(1){//修改
float t = HAL_GetTick() * 0.001;//获取当前时间
float duty = 0.5 * sin(2*3.14*t) + 0.5;//计算占空比
uint16_t arr = __HAL_TIM_GET_AUTORELOAD(&htim1);//获取ARR寄存器的值
uint16_t ccr = duty * (arr + 1);//计算CRR寄存器的值
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,ccr);//将计算结果写入CCR
}
五、代码解析
关键函数说明
HAL_TIM_PWM_Start
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
功能作用
此函数用于启动定时器(TIM)的指定通道输出PWM信号。其核心操作包括:
- 使能定时器的计数器(
TIMx->CR1 |= TIM_CR1_CEN
) - 启用指定通道的PWM输出(配置通道的CCxE位,如
TIMx->CCER |= TIM_CCER_CC1E
)
参数解析
参数 | 类型 | 说明 |
---|---|---|
htim | TIM_HandleTypeDef* | 指向TIM外设的句柄(包含定时器配置信息,如预分频、计数模式等) |
Channel | uint32_t | 指定PWM输出的通道号(TIM_CHANNEL_1 到 TIM_CHANNEL_4 ) |
HAL_TIMEx_PWM_Start
HAL_StatusTypeDef HAL_TIMEx_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
功能作用
此函数是HAL库中针对高级定时器(TIM1/TIM8)或复杂PWM场景的扩展函数,用于启动定时器的PWM输出。与HAL_TIM_PWM_Start
的主要区别在于:
- 支持高级定时器的互补通道(如CH1N、CH2N等)
- 包含刹车(Break)和死区时间(Dead Time)控制逻辑
- 适用于电机控制、逆变器等需要安全保护的场景
参数解析
参数 | 类型 | 说明 |
---|---|---|
htim | TIM_HandleTypeDef* | 指向高级定时器(TIM1/TIM8)的句柄 |
Channel | uint32_t | 支持互补通道的选项:TIM_CHANNEL_1 TIM_CHANNEL_1N |
HAL_TIM_GET_AUTORELOAD
#define HAL_TIM_GET_AUTORELOAD(__HANDLE__)
功能作用
此宏用于直接读取定时器自动重装载寄存器(AutoReload Register, ARR)的当前值。
核心功能:
- 获取定时器的周期设定值(决定PWM频率或定时溢出时间)
- 适用于动态调整定时参数时的参数校验
- 调试时验证配置是否生效
参数 | 类型 | 说明 |
---|---|---|
__HANDLE__ | TIM_HandleTypeDef* | 指向TIM外设的句柄(包含定时器配置信息) |
HAL_TIM_SET_COMPARE
#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__)
功能作用
此宏用于直接设置定时器的捕获/比较寄存器(CCRx)值,从而控制PWM占空比或定时触发点。
核心功能:
- 动态调整PWM输出的占空比(如呼吸灯、电机调速)
- 设置输入捕获的触发阈值
- 配置输出比较模式的匹配值
参数 | 类型 | 说明 |
---|---|---|
__HANDLE__ | TIM_HandleTypeDef* | 指向TIM外设的句柄(包含定时器配置信息) |
__CHANNEL__ | uint32_t | 指定通道:TIM_CHANNEL_1 -TIM_CHANNEL_4 |
__COMPARE__ | uint32_t | 比较值(0 ≤ COMPARE ≤ AutoReload) |
关于CCR的值
在while循环中我们要向外输出一个PWM信号, 满足呼吸灯的现象可以用一个正弦波来做输出
占空比是CCR和ARR+1的比值
我们想得到CCR的值根据上述公式可以得到
那么就得到CCR的表达式
uint16_t ccr = duty * (arr + 1);//计算CRR寄存器的值
六、实验现象
烧录程序后,LED呈现渐变呼吸效果