STM32定时器

定时器分类

定时器种类

位数

计数器模式

产生DMA请求

捕获/比较通道

互补输出

特殊应用场景

高级定时器

TIM1,TIM8)

16

向上,向下,向上/

可以

4

带死区控制盒紧急刹车,可应用于PWM电机控制

通用定时器(TIM2~TIM5

16

向上,向下,向上/

可以

4

通用。定时计数,PWM输出,输入捕获,输出比较

基本定时器

(TIM6,TIM7)

16

向上,向下,向上/

可以

0

主要应用于驱动DAC

STM3 的通用 TIMx (TIM2TIM3TIM4 和 TIM5)定时器功能

1、 位于低速的 APB1 总线上 (APB1)
2、 16  位向上、向下、向上 / 向下 ( 中心对齐 ) 计数模式,自动装载计数器( TIMx_CNT )。
3、 16  位可编程 ( 可以实时修改 ) 预分频器 ( TIMx_PSC ) ,计数器时钟频率的分频系数 为  1 65535  之间的任意数值。
 4 个独立通道( TIMx_CH1~4 ),这些通道可以用来作为: 
1、 输入捕获 
2、 输出比较
3、 PWM  生成 ( 边缘或中间对齐模式

           4、单脉冲模式输出

如下事件发生时产生中断 /DMA 6 个独立的 IRQ/DMA 请求生成器): 
更新:计数器向上溢出 / 向下溢出,计数器初始化 ( 通过软件或者内部 / 外部触发
触发事件 ( 计数器启动、停止、初始化或者由内部 / 外部触发计数
输入捕获 
输出比较 
支持针对定位的增量 ( 正交 ) 编码器和霍尔传感器电路 
触发输入作为外部时钟或者按周期的电流管理
STM32  的通用定时器可以被用于:测量输入信号的脉冲长度 ( 输入捕获 ) 或者产生输出波形 ( 输出比较和  PWM) 等。   
使用定时器预分频器和  RCC  时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。 STM32  的每个通用定时器都是完全独立的,没有互相共享的任何资源。

定时器计数模式

通用定时器可以向上计数、向下计数、向上向下双向计数模式。

①向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。

②向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。

③中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

定时器常用库函数:

1、定时器参数初始化

void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

typedef struct
{
  uint16_t TIM_Prescaler;    //预分频因子,取值范围为0x0000 到 0xFFFF,决定了定时器时钟频率。定 
                               时器时钟频率 = 定时器时钟源频率 / TIM_Prescaler。    
  uint16_t TIM_CounterMode;     //计数模式
  uint16_t TIM_Period;           //定时器的溢出上限值   ,定时器向上计数到TIM_Period或从 
                                    TIM_Period向下计数到0时溢出。注意这个值是自动重新装载的  
  uint16_t TIM_ClockDivision;     //仅用于定时器时钟源是“外部触发输入”(即之前说的第3个时钟源) 
                                   时的情况,它是“外部触发输入时钟”的分频系数。在定时器时钟源是 
                                   其他情况时(比如内部时钟72MHz)没有意义。
  uint8_t TIM_RepetitionCounter;   //这个只在高级定时器1和8中才有意义
} TIM_TimeBaseInitTypeDef; 

 2、定时器使能函数

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)

3、定时器中断使能函数

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

4、状态标志位获取和清除

FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

5、定时器中断实现步骤

能定时器时钟:  RCC_APB1PeriphClockCmd();

 初始化定时器,配置ARR,PSCTIM_TimeBaseInit();

开启定时器中断,配置 NVIC

      void TIM_ITConfig();

      NVIC_Init();

 使能定时器。TIM_Cmd();

 编写中断服务函数:TIMx_IRQHandler();

PWM概述

PWM工作原理:
PWM(脉宽调制)的原理:通过调节矩形脉冲的占空比,达到控制输出量大小(等效大小)的目的。如果占空比一直不变,常用来做亮度调整、电机速度调整等。如果占空比随时改变,常用来模拟正弦量等连续信号(逆变)。
定时器PWM的原理:
原理有输入捕获和输出比较两个部分。为了通过定时器实现PWM功能,指定了一个GPIO引脚为捕获/比较引脚,同时添加一个捕获/比较寄存器(CCR)。
输出比较原理:给捕获/比较寄存器一个值,这个值介于零与ARR之间。计数分频后的脉冲,当计数达到CCR的值时,捕获比较引脚的电平状态进行翻转,同时产生一个捕获比较事件(Capture Compare),脉冲计数继续进行。当脉冲计数达到ARR的值时,定时器清零,因定时器的值再次小于CCR所以捕获比较引脚状态再次翻转,同时产生一个更新事件(Updata)。
输入捕获原理:输入捕获有两种方法,T法与M法,都是用来测量外部输入的脉冲的频率的。
 

1、PWM工作过程

2、PWM输出库函数

1、结构体

typedef struct
{
  uint16_t TIM_OCMode;  //PWM模式1或者模式2
  uint16_t TIM_OutputState; //输出使能 OR失能
  uint16_t TIM_OutputNState;
  uint16_t TIM_Pulse; //比较值,写CCRx
  uint16_t TIM_OCPolarity; //比较输出极性
  uint16_t TIM_OCNPolarity; 
  uint16_t TIM_OCIdleState;  
  uint16_t TIM_OCNIdleState; 
} TIM_OCInitTypeDef;

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure. TIM_Pulse=100;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

2、设置比较级函数

void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Compare2);

3、使能输出比较预装载

void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

 4、u使能自动重装载的预装载寄存器允许位:

void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

示例(来自正点原子)

使用定时器3PWM功能,输出占空比可变的PWM波,用来驱动LED灯,从而达到LED【PB5]亮度由暗变亮,又从亮变暗,如此循环。

3、输入捕获工作过程

 

 工作步骤:

1、设置输入捕获滤波器(通道1为例)

2、设置输入捕获极性(通道1为例)

3、设置输入捕获映射通道(通道1为例)

4、设置输入捕获分频器(通道1为例)

5、捕获到有效信号可以开启中断

输入捕获通道初始化函数

 

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct);

typedef struct
{
  uint16_t TIM_Channel; //捕获通道1-4   
  uint16_t TIM_ICPolarity; //捕获极性
  uint16_t TIM_ICSelection; //映射关系
  uint16_t TIM_ICPrescaler; //分频系数
  uint16_t TIM_ICFilter;  //滤波器
} TIM_ICInitTypeDef;

TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; 
TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM5_ICInitStructure.TIM_ICFilter = 0x00;
TIM_ICInit(TIM5, &TIM5_ICInitStructure);

2、通道极性设置独立函数:

void TIM_OCxPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);

3、 获取通道捕获值

uint32_t TIM_GetCapture1(TIM_TypeDef* TIMx);

输入捕获的一般配置过程(正点原子)

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32中进行脉冲计数可以使用定时器的捕获功能。通过配置定时器的输入捕获通道,可以实现对脉冲的计数。例如,可以使用ETR引脚进行时钟计数,或者使用其他捕获功能进行计数。\[2\]在代码中,可以使用循环来进行脉冲计数。例如,可以使用for循环来控制计数的次数,并在每次计数时触发相应的操作。\[3\]通过统计输入的脉冲次数,可以计算出相应的频率或其他相关参数,如湿度。\[1\]具体的实现方法可以参考相关的资料和示例代码。 #### 引用[.reference_title] - *1* [STM32CubeMX应用 -- 定时器输入脉冲计数](https://blog.csdn.net/m0_37845735/article/details/105399892)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32定时器使用(三)外部脉冲计数](https://blog.csdn.net/guijiaqing/article/details/102636644)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [使用STM32的定时器进行输入脉冲的计数](https://blog.csdn.net/whw8007/article/details/8991773)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值