stm32使用定时器PWM

发布于:2025-06-20 ⋅ 阅读:(21) ⋅ 点赞:(0)

1、定时器TIM
在这里插入图片描述
在这里插入图片描述
PSC-Prescaler-预分频器
CNT-Counter-计数器
ARR-Auto Reload Register-自动重装寄存器
RCR-Repetition Counter Register-重复计数器

1、时钟来源:晶振提供频率,时钟树这些才提供时钟
在这里插入图片描述
在这里插入图片描述
分频系数
在这里插入图片描述
计数
在这里插入图片描述
在这里插入图片描述
3、实例
在这里插入图片描述
上面展示了假设使用外部石英晶振提供32.768K,经过32767+1分频后为1Hz,自动重装ARR设置为59+1,没60秒重装一次,如果设置重复计数器为0+1,也就是每1个60秒出现一次事件,如果RCR设置为4+1,也就是每5个60秒出现一次事件
4、定时器输出比较
在这里插入图片描述

举例:想要通过定时器实现PWM
在这里插入图片描述
设置比较寄存器CCR的值为4,也就是CNT小于CCR时是高电平,大于CCR时是低电平
在这里插入图片描述
实际就是CCR决定了占空比
修改CCR的值改变占空比
在这里插入图片描述

在这里插入图片描述

1、配置定时器通道功能为PWM

在这里插入图片描述

在这里插入图片描述
PWM的占空比计算主要看下面这个图还有后面的占空比计算公式
在这里插入图片描述
假设这里的时钟源为72MHz,设置PSC为71,那么降频后为72/(71+1) = 1MHz,计数器CNT获取前面降频后的时钟频率,也就是1MHz,一秒钟计数1000000次,也就是1us的频率,设置自动重装寄存器ARR的值为1000
CNT和ARR的关系是什么呢?假设CNT设置工作模式向上增加,也就是从0往上递增,当CNT的值增加到与ARR相等时,就会重装,也就是CNT变为0,这里设置ARR为1000,那么CNT从0递增到1000,就会重新计数
后面设置PWM,是CNT的值和CCR比较寄存器的值比较,小就是高电平,大就是低电平,一直到CNT的值增长到ARR的值,再次重0开始计数,这就是下一个周期了

在这里插入图片描述
pulse那里填的0就是这里的CCRx,代表占空比多少,如果填了100,那就是100/1000=0.1的占空比,这里主要看ARR的值,占空比也就是CCRx / ARR
后面修改占空比修改的就是CCRx的值

在这里插入图片描述
stm32定时器2的三个通道的引脚PA15、PB3、PB2分别接LED灯的正极,LED灯的负极接GND

2、HAL库函数说明

  1. 配置定时器:HAL_TIM_PWM_ConfigChannel
HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim,
const TIM_OC_InitTypeDef *sConfig,
uint32_t Channel);
功能:配置某个定时器占空时间及输出通道
参数:
htim:指定要配置的定时器对象的指针
Channel:哪个通道,取值有TIM_CHANNEL_1到TIM_CHANNEL_4,TIM_CHANNEL_ALL
sConfig:要进行配置的具体参数的结构体:
typedef struct
{
   
    uint32_t OCMode; /* 模式,通常设置为 TIM_OCMODE_PWM1 即计数值小于CRR值时输出有效电平*/
        TIM_OCMODE_TIMING         记数
        TIM_OCMODE_ACTIVE         当CNT == CRR时 输出有效电平
        TIM_OCMODE_INACTIVE       当CNT == CRR时 输出无效电压
        TIM_OCMODE_TOGGLE         当CNT == CRR时输出电压翻转一次
        TIM_OCMODE_PWM1           CNT 

网站公告

今日签到

点亮在社区的每一天
去签到