[其他ST产品] STM32F4_定时器输入捕获详解

[复制链接]
1887|38
 楼主| 铁血丹心LLLL 发表于 2023-10-28 18:46 | 显示全部楼层 |阅读模式
输入捕获简介
        STM32定时器可以分为相关时钟、时基单元、输入捕获、输出比较。在上一节我们已经学习了STM32的输出PWM比较功能,本节我们将学习STM32的输入捕获功能。

        输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32F4系列拥有14个定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能。

        输入捕获功能就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如说上升沿/下降沿)的时候,将当前定时器的值TIMx_CNT存放到对应通道的捕获/比较寄存器TIMx_CCRx里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA等。

58132653ce67379fce.png

 楼主| 铁血丹心LLLL 发表于 2023-10-28 18:46 | 显示全部楼层
输入捕获框图
62393653ce68358d8d.png
 楼主| 铁血丹心LLLL 发表于 2023-10-28 18:46 | 显示全部楼层
 楼主| 铁血丹心LLLL 发表于 2023-10-28 18:52 | 显示全部楼层
输入捕获的过程:输入阶段对TIx输入进行采样,通过滤波器生成一个滤波信号TIxF,然后通过一个带有极性选择的边沿检测器(极性选择就是确定高电平有效还是低电平有效)生成一个信号(TIxFPx),信号一方面可以用作模式控制器的触发输入,另一方面可以捕获命令,通过分频器分频以后传给捕获/比较寄存器。
 楼主| 铁血丹心LLLL 发表于 2023-10-28 18:52 | 显示全部楼层
输入捕获模式
        在输入捕获模式下,当相应的ICx信号( ICx称作输入捕获、OCx称作输出比较 )检测到跳变沿(上升沿、下降沿)后,将会使用TIMx_CCRx捕获/比较寄存器来存储这一时候计数器的值。发生捕获事件时,会将状态寄存器TIMx_SR的CCXIF位置1,并且这一时刻在使能的状态下可以发送中断或者DMA请求。如果发生捕获事件时CCxIF标志已经处于高位1,那么会将重复捕获标志状态寄存器的CCxOF位置1。可以通过写程序的方式给CCxIF位写入0来将CCxIF位清0,或者读取存储在TIMx_CCRx寄存器中的已捕获数据。
 楼主| 铁血丹心LLLL 发表于 2023-10-28 18:52 | 显示全部楼层
发生输入捕获时:

        发生有效跳变沿时,TIMx_CCR1寄存器会获取计数器的值,保存下来。

        将CC1IF标志位置1。如果至少发生了两次连续捕获,但CC1IF标志未被清0,则CC1OF捕获溢出标志位会被置1。

        根据CC1IE位生成中断。

        根据CC1DE位生成DMA请求。

 楼主| 铁血丹心LLLL 发表于 2023-10-28 18:54 | 显示全部楼层
输入捕获测量脉宽的原理:

75450653ce87121f18.png
 楼主| 铁血丹心LLLL 发表于 2023-10-28 18:54 | 显示全部楼层
     假定定时器工作在向上计数模式,图中的t1~t2时间,就是我们要测量的高电平时间;首先设置定时器通道x为上升沿捕获,这样在t1时刻会进行第一次捕获,记为CCRx1,记录当前计数器CNT的值;立即清0 CNT,设置定时器通道x为下降沿捕获,在t2时刻,会进行第二次捕获,记录这时的计数器值,记为CCRx2,这样,根据时钟值得到计数器的计数频率,就能算出t1~t2的时间,从而得到高电平脉宽。

        如图,在t1到t2之间,可能会产生N次定时器溢出,为了防止高电平太长,导致数据不准确,需要计算CNT计数的次数:N*ARR+CCRx2,用计数次数乘以CNT的计数周期,就可以得到t2~t1的时间长度。
 楼主| 铁血丹心LLLL 发表于 2023-10-28 18:54 | 显示全部楼层
相关寄存器
4.1 TIMx_ARR、TIMx_PSC
这两个寄存器在过去学习定时器功能时,常常用到;分别是自动重装载值寄存器和时钟预分频寄存器。
 楼主| 铁血丹心LLLL 发表于 2023-10-28 18:55 | 显示全部楼层
4.2 捕获/比较寄存器1:TIMx_CCMR1
捕获/比较寄存器1:TIMx_CCMR1(capture/compare mode register 1)
96394653ce88e63a34.png
 楼主| 铁血丹心LLLL 发表于 2023-10-28 18:55 | 显示全部楼层
在PWM输出中,已经介绍了该寄存器的输出位配置;这次我们着重看输入部分:也就是第二行ICxx;

第二行的输入部分的高8位是2通道IC2x;低8位是1通道IC1x;3 4通道显然是TIMx_CCMR2捕获/比较寄存器2控制的。

位1:0  捕获/比较1选择  00:CC1通道配置为输出    01:CC1通道配置为输入,IC1映射到TI1上 这里我们配置01,因为框图上通道1对应IC1

                                     10:CC1通道配置为输入,IC1映射到TI2上     11:CC1通道配置为输入,IC1映射到TRC上。


 楼主| 铁血丹心LLLL 发表于 2023-10-28 18:55 | 显示全部楼层
 楼主| 铁血丹心LLLL 发表于 2023-10-28 19:00 | 显示全部楼层
IC1PSC输入捕获1预分频器配置为 00:1次边沿就触发一次捕获。

IC1F是用来设置输入采样频率和数字滤波器长度的。
 楼主| 铁血丹心LLLL 发表于 2023-10-28 19:01 | 显示全部楼层
4.3 捕获/比较使能寄存器 TIMx_CCER
捕获/比较使能寄存器 TIMx_CCER(capture/compare enable register) 69955653ce9fa5c9dc.png
 楼主| 铁血丹心LLLL 发表于 2023-10-28 19:11 | 显示全部楼层
 楼主| 铁血丹心LLLL 发表于 2023-10-28 19:11 | 显示全部楼层
CC1P位配置为输入时,由输入捕获的框图可得:1通道CH1对应TI1,又对应TI1PF1/TI1PF2;配置极性就是高电平有效,还是低电平有效。

CC1E位配置为输入时,捕获/比较1输出使能。
 楼主| 铁血丹心LLLL 发表于 2023-10-28 19:13 | 显示全部楼层
4.4 中断使能寄存器 TIMx_DIER
中断使能寄存器 TIMx_DIER(DMA/Interrupt enable register)

94386653cecf6c4845.png

位1 CC1IE: 捕获/比较1中断使能

                0:禁止CC1中断

                1:使能CC1中断
 楼主| 铁血丹心LLLL 发表于 2023-10-28 19:14 | 显示全部楼层
库函数配置输入捕获高电平脉冲宽度
本程序获取TIM5的1通道上高电平脉冲宽度;

1. 开启TIM5时钟,配置PA0为复用功能(AF2),并开启下拉电阻

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);  //TIM5时钟使能

GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); //GPIOA0复用位定时器5

…………………………………………………………………………

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;//下拉

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;//模式设置为复用模式

GPIO_Init(GPIOA,&GPIO_InitStructure);//GPIOA初始化
 楼主| 铁血丹心LLLL 发表于 2023-10-28 19:14 | 显示全部楼层
初始化TIM5,设置TIM5的ARR和PSC

TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM5,&TIM_TimeBaseInitStructure);
 楼主| 铁血丹心LLLL 发表于 2023-10-28 19:15 | 显示全部楼层
设置TIM5的输入捕获参数,开启输入捕获

定时器有输出比较函数,对应的就有输入捕获函数;

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)   //  输入捕获初始化

  1. typedef struct
  2. {  
  3. uint16_t TIM_Channel; //通道  有1 2 3 4 通道供选择
  4. uint16_t TIM_ICPolarity; //捕获极性  有上升沿捕获和下降沿捕获选择
  5. uint16_t TIM_ICSelection;//映射  //每一个通道都对应一个映射关系,1通道对应映射TI1
  6. uint16_t TIM_ICPrescaler;//分频系数  有0 2 4 8供选择
  7. uint16_t TIM_ICFilter; //滤波器长度 不使用滤波器,默认选择滤波器长度为0
  8. } TIM_ICInitTypeDef;


  9. 对于第二个结构体成员变量:捕获极性  有单独的
  10. TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);//通道1捕获极性函数

  11. 有TIM_OCxPolarityConfig()。x对应2 3 4 通道选择。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

76

主题

543

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部