STM32 HAL库 STM32CubeMX -- TIM(定时器输入捕获)

这篇具有很好参考价值的文章主要介绍了STM32 HAL库 STM32CubeMX -- TIM(定时器输入捕获)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、输入捕获

输入捕获可以对输入的信号的上升沿、下降沿或者双边沿进行捕获,常用的有测量输入信号的脉宽测量PWM 输入信号的频率占空比这两种。

输入捕获的原理就是,当捕获到信号的跳变沿的时候,把计数器CNT 的值锁存到捕获寄存器CCR 中,把前后两次捕获到的CCR 寄存器中的值相减,就可以算出脉宽或者频率。
如果捕获的脉宽的时间长度超过你的捕获定时器的周期,就会发生溢出,这个就需要做额外的处理。

二、输入捕获功能框图

STM32 HAL库 STM32CubeMX -- TIM(定时器输入捕获)

输入通道

需要被测量的信号从定时器的外部引脚TIMx_CH1/2/3/4 进入,通常叫TI1/2/3/4,在后面的捕获讲解中对于要被测量的信号我们都以TIx 为标准叫法。

输入滤波器和边沿检测器

当输入的信号存在高频干扰的时候,我们需要对输入信号进行滤波,即进行重新采样;

根据采样定律,采样的频率必须大于等于两倍的输入信号。比如输入的信号为1M,又存在高频的信号干扰,那么此时就很有必要进行滤波,我们可以设置采样频率为2M,这样可以在保证采样到有效信号的基础上把高于2M 的高频干扰信号过滤掉。

滤波器的配置由CR1 寄存器的位CKD[1:0] 和CCMR1/2 的位ICxF[3:0] 控制。从ICxF 位的描述可知,采样频率fSAMPLE 可以由fCK_INT 和fDTS 分频后的时钟提供,其中是fCK_INT 内部时钟,fDTS是fCK_INT 经过分频后得到的频率,分频因子由CKD[1:0] 决定,可以是不分频,2 分频或者是4分频。

边沿检测器用来设置信号捕获模式:上升沿,下降沿,或双边沿,具体的由CCER 寄存器的位CCxP 和CCxNP 决定。

捕获通道

捕获通道就是图中的IC1/2/3/4,每个捕获通道都有相对应的捕获寄存器CCR1/2/3/4,当发生捕获的时候,计数器CNT 的值就会被锁存到捕获寄存器中。

输入通道是用来输入信号的,捕获通道是用来捕获输入信号的通道;

预分频器

ICx 的输出信号会经过一个预分频器,用于决定发生多少个事件时进行一次捕获。具体的由寄存器CCMRx 的位ICxPSC 配置,如果希望捕获信号的每一个边沿,则不分频。

例如:
每2个事件触发一次捕获,如上升沿捕获时,连续获取到两个上升沿后才会触发计数
每4个事件触发一次捕获
每8个事件触发一次捕获

捕获寄存器

经过预分频器的信号ICxPS 是最终被捕获的信号,当发生捕获时(第一次),计数器CNT 的值会被锁存到捕获寄存器CCR 中,还会产生CCxI 中断,相应的中断位CCxIF(在SR 寄存器中)会被置位,通过软件或者读取CCR 中的值可以将CCxIF 清0。

如果发生第二次捕获(即重复捕获:CCR 寄存器中已捕获到计数器值且CCxIF 标志已置1),则捕获溢出标志位CCxOF(在SR 寄存器中)会被置位,CCxOF 只能通过软件清零。

三、STM32Cube MX配置

基础STM32Cube MX 的配置,参考这篇博客:STM32 CubeMx教程 – 基础知识及配置使用教程

配置RCC,选择使用外部晶振模式

STM32 HAL库 STM32CubeMX -- TIM(定时器输入捕获)

配置SYS,debug模式选择使用Serial Wire

STM32 HAL库 STM32CubeMX -- TIM(定时器输入捕获)

配置一个串口,用于输出调试信息

STM32 HAL库 STM32CubeMX -- TIM(定时器输入捕获)

配置定时器,配置TIM,
将时钟源配置为内部时钟源;
配置通道1为输入捕获模式;

STM32 HAL库 STM32CubeMX -- TIM(定时器输入捕获)

配置TIM里面 GPIO模式;
配置为输入模式(input mode);
配置为上拉模式(Pull - up),上拉模式模式初始电平为高电平;
按键另一端接地,初始化按键另一边为高电平,当按键按下的时候,就可以检测到低电平;

STM32 HAL库 STM32CubeMX -- TIM(定时器输入捕获)

配置打开定时器中断

STM32 HAL库 STM32CubeMX -- TIM(定时器输入捕获)

配置TIM详细参数;
预分频系数为7199,重装载值 99;
检测周期 Tout = (7199+1)*(99+1) / 72 000 000 = 10ms

GPIO初始为高电平,按键按下成为低电平,所以触发模式设置为下降沿模式

STM32 HAL库 STM32CubeMX -- TIM(定时器输入捕获)

配置时钟树

STM32 HAL库 STM32CubeMX -- TIM(定时器输入捕获)

四、代码详解

涉及的HAL库函数

	HAL_TIM_Base_Start_IT(&htim2);  		//开启定时器2溢出中断

	HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);    //开启输入捕获中断

	HAL_TIM_IC_Stop_IT(&htim2, TIM_CHANNEL_2)      //关闭输入捕获中断
       

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);	//定时器溢出回调函数

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);		//捕获中断回调函数

测量低电平的持续时间,先下降沿后上升沿,记录计数值,最终输出us单位。

代码示例:

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

//变量存储
typedef struct 
{   
    uint8_t   flg; 						//0为未开始,1已经开始,2为结束
    uint16_t  num;						//计数值
    uint16_t  num_period;			//溢出次数
}COUNT_TEMP;
 
COUNT_TEMP count_temp={0};
/* USER CODE END PD */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

	HAL_TIM_Base_Start_IT(&htim2);  		//开启定时器2溢出中断

	HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);    //开启输入捕获中断
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		
		if(count_temp.flg == 2 )		//等待测量
	{
    //计数计数值,0xFFFF为最大计数
    uint32_t ulTime = (uint32_t)count_temp .num_period * 0xFFFF + count_temp .num;
    //输出测量的值
    printf ( "low time :%d us\n",ulTime); 
    count_temp .flg = 0;     //复位测量       
	}
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/* USER CODE BEGIN 4 */

/* 每隔10ms进入一次定时器中断函数,每按下一次按键都会进入一次捕获中断函数 */
/* 捕获中断设置为下降沿捕获,因为初始电平设置的高电平 */
/* 没按下一次按键,也就是经过一个下降沿,就进入一次捕获中断函数 */
/* 进入捕获中断函数以后,开始计时,并且设置为上升沿触发下一次捕获中断 */
/* 当按键拿起,重回高电平,也就是捕获一次上升沿高电平,再次进入捕获中断函数 */
/* 进入捕获中断函数,获取记录的时间,并设置为下降沿触发中断,如此往复 */
//捕获中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
      //判断定时器2
        if(TIM2 == htim->Instance){
            if ( count_temp.flg == 0 )
            {   
                // 清零定时器计数
                __HAL_TIM_SET_COUNTER(htim,0); 
                //设置上升沿触发
                __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
                count_temp .flg = 1;    //设置已经开始    
                count_temp .num_period = 0;    //溢出计数清零        
                count_temp .num = 0; //计数清零
            }        
            else
            {
                // 获取定时器计数值
                count_temp .num = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);
                //设置下降沿触发
                __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);
                count_temp .flg = 2;
            }
        }
}    
 
//定时器溢出回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(TIM2 == htim->Instance){
    //每次溢出时间为65536us
    if(count_temp.flg==1)//还未成功捕获
    {
                if(count_temp.num_period==0XFFFF)//电平太长了
                {
                    count_temp.flg=2;        //标记成功捕获了一次
                    count_temp .num=0XFFFF;
                }else count_temp .num_period ++;
    }
    }
}
/* USER CODE END 4 */

附录

本文涉及到的代码:STM32 HAL库 定时器输入捕获文章来源地址https://www.toymoban.com/news/detail-412762.html

到了这里,关于STM32 HAL库 STM32CubeMX -- TIM(定时器输入捕获)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32CubeMX系列06——定时器(定时、PWM、输入捕获)

    ==== 文章汇总(有代码汇总) ==== 正点原子Mini板,主控 STM32F103RCT6. 定时器简介 这里主要讨论通用定时器(系统嘀嗒定时器、看门狗定时器、RTC定时器不考虑在内) 对于STM32F103RCT6 单片机: 2个基本定时器。分别是 TIM6 、 TIM7 。只能16位向上计数、没有IO口,没有捕获和比较通

    2024年02月01日
    浏览(27)
  • STM32单片机(六)TIM定时器 -> 第六节:TIM输入捕获练习(输入捕获模式测频率和PWMI模式测频率占空比)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月09日
    浏览(16)
  • STM32 CubeMX学习实验13:定时器输入捕获获取PWM频率

    使用定时器5作为输入捕获定时器,将通道1(PA0)设置为输入捕获,设置预分频器和计数值,这里设置为1us计数一次,最大可以捕获周期为0xFFFFFFFFus的PWM,所以一般不需要考虑溢出的问题,使能自动重装载。 使能定时器中断,选择合适的优先级,   将引脚设置下拉,保证没

    2024年03月14日
    浏览(39)
  • STM32 HAL库定时器输入捕获SlaveMode脉宽测量

    📓SlaveMode模式简介 ✨SlaveMode复位模式:在发生一个触发输入事件时,计数器和它的预分频器能够重新被初始化;同时,如果TIMx_CR1寄存器的URS位为低,还会产生一个更新事件UEV;然后所有的预装载寄存器(TIMx_ARR, TIMx_CCRx)都会被更新。 🔖当所测频率低于最小定时器捕获频率

    2024年02月16日
    浏览(20)
  • STM32 hal库使用笔记(三)定时器—输入捕获和计数脉冲

    目录 一、简介 1.定时器简介 2.输入捕获简介 3.原理介绍 二、HAL库配置 1.时钟树的设置 2.定时器时钟源选择 2.1 计数脉冲(代码对应3.1) 2.2 输入捕获(对应代码3.2)  三、代码编写 实验目的:利用定时器输入捕获实现LED翻转;按键充当外部时钟源,实现LED翻转 实验平台:正

    2024年02月04日
    浏览(31)
  • STM32学习笔记(六)丨TIM定时器及其应用(输入捕获丨测量PWM波形的频率和占空比)

    ​  本次课程采用单片机型号为STM32F103C8T6。 ​  课程链接:江科大自化协 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试丨OLED的使用   STM32学习笔记(三)丨中断系统丨EXTI外部中断

    2023年04月19日
    浏览(24)
  • 基于HAL库的STM32的单定时器的多路输入捕获测量脉冲频率(外部时钟实现)

    目录 写在前面 一般的做法(定时器单通道输入捕获) 以外部时钟的方式(高低频都适用) 测试效果 STM32的定时器本身有输入捕获的功能。可选择双端捕获,上升沿捕获或者是下降沿捕获。对应捕获频率来说,连续捕获上升沿或下降沿的时间间隔就是其脉冲的周期. 定时器设置频率

    2024年02月08日
    浏览(20)
  • STM32 通过PWM输出一个方波并通过定时器输入捕获模式测量方波的周期(cubeMX+keil配置)

    前言:本文章用cubeMX和keil来进行代码编写,实现STM32的相应功能 本文章使用的STM32核心板是STM32H743VIT6,如果使用的是其他的核心板操作过程类似,可以尝试使用此教程。 (1)首先点击左侧的Timers  (2)选择一个定时器配置PWM 我选择的是TIM5,如上图 点击TIM5 Mode的配置如下

    2024年02月19日
    浏览(18)
  • STM32CubeMX教程5 TIM 定时器概述及基本定时器

    开发板(STM32F407G-DISC1) STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 逻辑分析仪nanoDLA 使用STM32CubeMX软件配置STM32F407开发板 使用基本定时器TIM6实现每500ms控制绿灯状态变化一次,基本定时器TIM7实现每1s控制红灯状态变化一次 STM32F407拥有2个基础定时器、

    2024年02月03日
    浏览(24)
  • 基于HAL库的STM32单定时器多路输入捕获测量PWM的频率和占空比实现(状态机方式实现)

    目录  写在前面 先回顾下定时器的单路捕获PWM 多路捕获PWM的频率和占空比(状态机实现) 我的思路: 状态图 配置 给出示例代码 测试效果         先有了这篇文章实现了单定时器的多通道测量频率,以外部时钟的方式可测量任意频率的方波),奈何不能多路测试PWM波的频率,

    2024年02月12日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包