打印
[其他ST产品]

STM32F4_定时器输入捕获详解

[复制链接]
865|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
输入捕获简介
        STM32定时器可以分为相关时钟、时基单元、输入捕获、输出比较。在上一节我们已经学习了STM32的输出PWM比较功能,本节我们将学习STM32的输入捕获功能。

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

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



使用特权

评论回复
沙发
铁血丹心LLLL|  楼主 | 2023-10-28 18:46 | 只看该作者
输入捕获框图

使用特权

评论回复
板凳
铁血丹心LLLL|  楼主 | 2023-10-28 18:46 | 只看该作者

使用特权

评论回复
地板
铁血丹心LLLL|  楼主 | 2023-10-28 18:52 | 只看该作者
输入捕获的过程:输入阶段对TIx输入进行采样,通过滤波器生成一个滤波信号TIxF,然后通过一个带有极性选择的边沿检测器(极性选择就是确定高电平有效还是低电平有效)生成一个信号(TIxFPx),信号一方面可以用作模式控制器的触发输入,另一方面可以捕获命令,通过分频器分频以后传给捕获/比较寄存器。

使用特权

评论回复
5
铁血丹心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寄存器中的已捕获数据。

使用特权

评论回复
6
铁血丹心LLLL|  楼主 | 2023-10-28 18:52 | 只看该作者
发生输入捕获时:

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

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

        根据CC1IE位生成中断。

        根据CC1DE位生成DMA请求。

使用特权

评论回复
7
铁血丹心LLLL|  楼主 | 2023-10-28 18:54 | 只看该作者
输入捕获测量脉宽的原理:

使用特权

评论回复
8
铁血丹心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的时间长度。

使用特权

评论回复
9
铁血丹心LLLL|  楼主 | 2023-10-28 18:54 | 只看该作者
相关寄存器
4.1 TIMx_ARR、TIMx_PSC
这两个寄存器在过去学习定时器功能时,常常用到;分别是自动重装载值寄存器和时钟预分频寄存器。

使用特权

评论回复
10
铁血丹心LLLL|  楼主 | 2023-10-28 18:55 | 只看该作者
4.2 捕获/比较寄存器1:TIMx_CCMR1
捕获/比较寄存器1:TIMx_CCMR1(capture/compare mode register 1)

使用特权

评论回复
11
铁血丹心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上。


使用特权

评论回复
12
铁血丹心LLLL|  楼主 | 2023-10-28 18:55 | 只看该作者

使用特权

评论回复
13
铁血丹心LLLL|  楼主 | 2023-10-28 19:00 | 只看该作者
IC1PSC输入捕获1预分频器配置为 00:1次边沿就触发一次捕获。

IC1F是用来设置输入采样频率和数字滤波器长度的。

使用特权

评论回复
14
铁血丹心LLLL|  楼主 | 2023-10-28 19:01 | 只看该作者
4.3 捕获/比较使能寄存器 TIMx_CCER
捕获/比较使能寄存器 TIMx_CCER(capture/compare enable register)

使用特权

评论回复
15
铁血丹心LLLL|  楼主 | 2023-10-28 19:11 | 只看该作者

使用特权

评论回复
16
铁血丹心LLLL|  楼主 | 2023-10-28 19:11 | 只看该作者
CC1P位配置为输入时,由输入捕获的框图可得:1通道CH1对应TI1,又对应TI1PF1/TI1PF2;配置极性就是高电平有效,还是低电平有效。

CC1E位配置为输入时,捕获/比较1输出使能。

使用特权

评论回复
17
铁血丹心LLLL|  楼主 | 2023-10-28 19:13 | 只看该作者
4.4 中断使能寄存器 TIMx_DIER
中断使能寄存器 TIMx_DIER(DMA/Interrupt enable register)



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

                0:禁止CC1中断

                1:使能CC1中断

使用特权

评论回复
18
铁血丹心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初始化

使用特权

评论回复
19
铁血丹心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);

使用特权

评论回复
20
铁血丹心LLLL|  楼主 | 2023-10-28 19:15 | 只看该作者
设置TIM5的输入捕获参数,开启输入捕获

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

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

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


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

有TIM_OCxPolarityConfig()。x对应2 3 4 通道选择。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

488

帖子

1

粉丝