ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:474.10KB ,
资源ID:8391011      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8391011.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(STM32F407通常定时器输入捕获.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

STM32F407通常定时器输入捕获.docx

1、STM32F407通常定时器输入捕获通用定时器输入捕获通用定时器作为输入捕获的使用。我们用TIM5的通道1(PA0)来做输入捕获,捕获PA0上高电平的脉宽(用KEY_UP按键输入高电平),通过串口来打印高电平脉宽时间。输入捕获模式可以用来测量脉冲宽度或者测量频率。 我们以测量脉宽为例,用一个简图来说明输入捕获的原理:如图所示,就是输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中t1t2时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道x为上升沿捕获,这样,t1时刻,就会捕获到当前的CNT值,然后立即清零CNT,并设置通道x为下降沿捕获,这样到t2时刻,又会发生

2、捕获事件,得到此时的CNT值,记为CCRx2。这样,根据定时器的计数频率,我们就可以算出t1t2的时间,从而得到高电平脉宽。在t1t2之间,可能产生N次定时器溢出,这就要求我们对定时器溢出,做处理,防止高电平太长,导致数据不准确。如图所示,t1t2之间,CNT计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以CNT的计数周期,即可得到t2-t1的时间长度,即高电平持续时间。 STM32F4的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能。STM32F4的输入捕获,简单的说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定

3、时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA等。这里我们用TIM5_CH1来捕获高电平脉宽。=捕获/比较通道(例如:通道 1 输入阶段)=接下来介绍我们需要用到的一些寄存器配置,需要用到的寄存器:TIMx_ARR、TIMx_PSC、TIMx_CCMR1、TIMx_CCER、TIMx_DIER、TIMx_CR1、TIMx_CCR1 (这里的x=5)。首先TIMx_ARR和TIMx_PSC,这两个寄存器用来设自动重装载值和TIMx的时钟分频。-捕获/比较模式寄存器1:TIMx_CCMR1,这个寄存器

4、在输入捕获的时候,非常有用:TIMx 捕获/比较模式寄存器 1 (TIMx_CCMR1)TIMx capture/compare mode register 1 偏移地址: 0x18 复位值: 0x0000当在输入捕获模式下使用的时候,对应图的第二行描述,从图中可以看出,TIMx_CCMR1是针对2个通道的配置,低八位7:0用于捕获/比较通道1的控制,而高八位15:8则用于捕获/比较通道2的控制,因为TIMx还有CCMR2这个寄存器,所以可以知道CCMR2是用来控制通道3和通道4(详见STM32F4xx中文参考手册435页,15.4.8节)。这里我们用到的是TIM5的捕获/比较通道1,我们重点

5、介绍TIMx_CCMR1的7:0位(其高8位配置类似),TIMx_CCMR1的7:0位详细描述见图所示:位7:4 IC1F:输入捕获1滤波器(Input capture 1 filter)此位域可定义TI1输入的采样频率和适用于TI1的数字滤波器带宽。数字滤波器由事件计数器组成,每N个事件才视为一个有效边沿:0000:无滤波器,按fDTS频率进行采样 1000:fSAMPLING=fDTS/8, N=6 0001:fSAMPLING=fCK_INT,N=2 1001:fSAMPLING=fDTS/8, N=8 0010:fSAMPLING=fCK_INT,N=4 1010:fSAMPLING=

6、fDTS/16,N=5 0011:fSAMPLING=fCK_INT,N=8 1011:fSAMPLING=fDTS/16,N=6 0100:fSAMPLING=fDTS/2, N=6 1100:fSAMPLING=fDTS/16,N=8 0101:fSAMPLING=fDTS/2, N=8 1101:fSAMPLING=fDTS/32,N=5 0110:fSAMPLING=fDTS/4, N=6 1110:fSAMPLING=fDTS/32,N=6 0111:fSAMPLING=fDTS/4, N=8 1111:fSAMPLING=fDTS/32,N=8 注意:在当前硅版本中,当ICxF3:

7、0= 1、2或3时,将用CK_INT代替公式中的fDTS。输入捕获1滤波器IC1F3:0,这个用来设置输入采样频率和数字滤波器长度。其中,fCK_INT是定时器的输入频率(TIMxCLK),一般为84Mhz/168Mhz(看该定时器在哪个总线上),而fDTS则是根据TIMx_CR1的CKD1:0的设置来确定的,如果CKD1:0设置为00,那么fDTS=fCK_INT。N值就是滤波长度,举个简单的例子:假设IC1F3:0=0011,并设置IC1映射到通道1上,且为上升沿触发,那么在捕获到上升沿的时候,再以fCK_INT的频率,连续采样到8次通道1的电平,如果都是高电平,则说明却是一个有效的触发,

8、就会触发输入捕获中断(如果开启了的话)。这样可以滤除那些高电平脉宽低于8个采样周期的脉冲信号,从而达到滤波的效果。这里,我们不做滤波处理,所以设置IC1F3:0=0000,只要采集到上升沿,就触发捕获。位3:2 IC1PSC:输入捕获1预分频器(Input capture 1 prescaler)此位域定义CC1输入(IC1)的预分频比。只要CC1E=0(TIMx_CCER寄存器),预分频器便立即复位。00:无预分频器,捕获输入上每检测到一个边沿便执行捕获01:每发生2个事件便执行一次捕获10:每发生4个事件便执行一次捕获11:每发生8个事件便执行一次捕获输入捕获1预分频器IC1PSC1:0,

9、我们是1次边沿就触发1次捕获,所以选择00。位1:0 CC1S:捕获/比较1选择 (Capture/Compare 1 selection)此位域定义通道方向(输入/输出)以及所使用的输入。00:CC1通道配置为输出01:CC1通道配置为输入,IC1映射到TI1上10:CC1通道配置为输入,IC1映射到TI2上11:CC1通道配置为输入,IC1映射到TRC上。此模式仅在通过TS位(TIMx_SMCR寄存器)选择内部触发输入时有效注意:仅当通道关闭时(TIMx_CCER中的CC1E = 0),才可向CC1S位写入数据。其中CC1S1:0,这两个位用于CCR1的通道配置,这里我们设置IC1S1:0

10、=01,也就是配置IC1映射在TI1上。-TIMx 捕获/比较使能寄存器 (TIMx_CCER)TIMx capture/compare enable register 偏移地址: 0x20 复位值: 0x0000位1 CC1P:捕获/比较1输出极性 (Capture/Compare 1 output Polarity)。CC1通道配置为输出:0:OC1高电平有效 1:OC1低电平有效CC1 通道配置为输入:CC1NP/CC1P位可针对触发或捕获操作选择TI1FP1和TI2FP1的极性。00:非反相/上升沿触发电路对TIxFP1上升沿敏感(在复位模式、外部时钟模式或触发模式下执行捕获或触发操作

11、),TIxFP1未反相(在门控模式或编码器模式下执行触发操作)。01:反相/下降沿触发电路对TIxFP1下降沿敏感 (在复位模式、外部时钟模式或触发模式下执行捕获或触发操作),TIxFP1反相(在门控模式或编码器模式下执行触发操作)。10:保留,不使用此配置。11:非反相/上升沿和下降沿均触发电路对TIxFP1上升沿和下降沿都敏感(在复位模式、外部时钟模式或触发模式下执行捕获或触发操作)位0 CC1E:捕获/比较1输出使能 (Capture/Compare 1 output enable)。CC1通道配置为输出:0:关闭OC1未激活 1:开启在相应输出引脚上输出OC1信号CC1通道配置为输入:

12、此位决定了是否可以实际将计数器值捕获到输入捕获/比较寄存器 1 (TIMx_CCR1) 中。0:禁止捕获 1:使能捕获所以要使能输入捕获,必须设置CC1E=1,而CC1P则根据自己的需要来配置。-接下来我们再看看DMA/中断使能寄存器:TIMx_DIER,该寄存器的各位描述见图TIMx_ DIER 寄存器各位描述我们需要用到中断来处理捕获数据,所以必须开启通道1的捕获比较中断,即CC1IE设置为1。-控制寄存器: TIMx_CR1,我们只用到了它的最低位,也就是用来使能定时器的。 控制寄存器1(TIMx_CR1)位 9:8 CKD:时钟分频 (Clock division)此位域指示定时器时钟

13、 (CK_INT) 频率与数字滤波器所使用的采样时钟(ETR、 TIx之间的分频比,00: tDTS = tCK_INT 01: tDTS = 2 tCK_INT 10: tDTS = 4 tCK_INT 11:保留-最后再来看看捕获/比较寄存器 1:TIMx_CCR1,该寄存器用来存储捕获发生时,TIMx_CNT的值,我们从TIMx_CCR1就可以读出通道1捕获发生时刻的TIMx_CNT值,通过两次捕获(一次上升沿捕获,一次下降沿捕获)的差值,就可以计算出高电平脉冲的宽度(注意,对于脉宽太长的情况,还要计算定时器溢出的次数)。=输入捕获库函数配置:1)开启TIM5时钟,配置PA0为复用功能(

14、AF2),并开启下拉电阻。要使用TIM5,我们必须先开启TIM5的时钟。同时我们要捕获TIM5_CH1上面的高电平脉宽,所以先配置PA0为带下拉的复用功能,同时,为了让PA0的复用功能选择连接到TIM5,所以设置PA0的复用功能为AF2,即连接到TIM5上面。开启 IM5时钟的方法为:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); /TIM5 时钟使能当然,这里我们也要开启PA0对应的GPIO的时钟。配置PA0为复用功能,所以我们首先要设置PA0引脚映射AF2,方法为:GPIO_PinAFConfig(GPIOA,GPIO_PinSour

15、ce0,GPIO_AF_TIM5); 最后,我们还要初始化GPIO的模式为复用功能,同时这里我们还要设置为开启下拉。方法为:GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /GPIOA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;/复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; /速度 100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; /推挽复用输出GPIO_InitStructure.GPIO_P

16、uPd = GPIO_PuPd_DOWN; /下拉GPIO_Init(GPIOA,&GPIO_InitStructure); /初始化 PA0跟上一讲PWM输出类似,这里我们使用的是定时器5的通道 1,所以我们从STM32F4对应的数据手册可以查看到对应的IO口为PA0:2)初始化TIM5,设置TIM5的ARR和PSC。在开启了TIM5的时钟之后,我们要设置ARR和PSC两个寄存器的值来设置输入捕获的自动重装载值和计数频率。 这在库函数中是通过TIM_TimeBaseInit函数实现的, TIM_TimeBaseStructure.TIM_Prescaler=psc; /定时器分频TIM_Ti

17、meBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; /向上计数模式TIM_TimeBaseStructure.TIM_Period=arr; /自动重装载值TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);/初始化TIM53)设置TIM5的输入捕获参数,开启输入捕获。TIM5_CCMR1寄存器控制着输入捕获1和2的模式,包括映射关系,滤波和分频等。这里我们需要设置通道1为输入模式,且IC1映射到T

18、I1(通道1)上面,并且不使用滤波器(提高响应速度)。 库函数是通过TIM_ICInit函数来初始化输入比较参数的:void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)同样,我们来看看参数设置结构体 TIM_ICInitTypeDef 的定义:typedef structuint16_t TIM_Channel; /通道uint16_t TIM_ICPolarity; /捕获极性uint16_t TIM_ICSelection;/映射uint16_t TIM_ICPrescaler;/分频系数uint16

19、_t TIM_ICFilter; /滤波器长度 TIM_ICInitTypeDef;参数TIM_Channel很好理解,用来设置通道。我们设置为通道1,为TIM_Channel_1。参 数TIM_ICPolarit是用来设置输入信号的有效捕获极性,这里我们设置为TIM_ICPolarity_Rising,上升沿捕获。同时库函数还提供了单独设置通道1捕获极性的函数为:TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);这表示通道1为上升沿捕获,我们后面会用到,同时对于其他三个通道也有一个类似的函数,使用的时候一定要分清楚使用的是哪个通道该调用哪个

20、函数,格式为TIM_OCxPolarityConfig()。参数TIM_ICSelection是用来设置映射关系,我们配置IC1直接映射在TI1上,选择TIM_ICSelection_DirectTI。参 数TIM_ICPrescaler用来设置输入捕获分频系数,我们这里不分频,所以选中TIM_ICPSC_DIV1,还有2,4,8分频可选。参数TIM_ICFilter设置滤波器长度,这里我们不使用滤波器,所以设置为0。我们的配置代码是:TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; /选择输入端IC1 映射到TI1上TIM5_ICInitSt

21、ructure.TIM_ICPolarity = TIM_ICPolarity_Rising; /上升沿捕获TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; /映射到TI1上TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; /配置输入分频,不分频TIM5_ICInitStructure.TIM_ICFilter = 0x00;/IC1F=0000 配置输入滤波器不滤波TIM_ICInit(TIM5, &TIM5_ICInitStructure);4)使能捕

22、获和更新中断(设置TIM5的DIER寄存器)因为我们要捕获的是高电平信号的脉宽,所以,第一次捕获是上升沿,第二次捕获时下降沿,必须在捕获上升沿之后,设置捕获边沿为下降沿,同时,如果脉宽比较长,那么定时器就会溢出,对溢出必须做处理,否则结果就不准了,不过,由于STM32F4的TIM5是32位定时器,假设计数周期为1us,那么需要4294秒才会溢出一次,这基本上是不可能的。这两件事,我们都在中断里面做,所以必须开启捕获中断和更新中断。这里我们使用定时器的开中断函数TIM_ITConfig即可使能捕获和更新中断:TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,

23、ENABLE);/允许更新中断和捕获中断5)设置中断优先级,编写中断服务函数因为我们要使用到中断,所以我们在系统初始化之后,需要先设置中断优先级分组,这里方法跟我们前面讲解一致,调用NVIC_PriorityGroupConfig()函数即可,我们系统默认设置都是分组2。 设置中断优先级的方法前面多次提到这里我们不做讲解,主要是通过函数 NVIC_Init()来完成。设置优先级完成后,我们还需要在中断函数里面完成数据处理和捕获设置等关键操作,从而实现高电平脉宽统计。在中断服务函数里面,跟以前的外部中断和定时器中断实验中一样,我们在中断开始的时候要进行中断类型判断,在中断结束的时候要清除中断标志

24、位。使用到的函数在上面的实验已经讲解过,分别为TIM_GetITStatus()函数和TIM_ClearITPendingBit()函数。if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)/判断是否为更新中断if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)/判断是否发生捕获事件TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update);/清除中断和捕获标志位在我们实验的中断服务函数中,我们还使用到了一个设置计数器值的函数为:TIM_SetCounter

25、(TIM5,0);上面语句的意思是将TIM5的计数值设置为0。这个相信是比较好理解的。6)使能定时器(设置TIM5的CR1寄存器)最后,必须打开定时器的计数器开关, 启动TIM5的计数器,开始输入捕获。TIM_Cmd(TIM5,ENABLE ); /使能定时器 5通过以上6步设置,定时器5的通道1就可以开始输入捕获了,同时因为还用到了串口输出结果,所以还需要配置一下串口。我们在timer.c和timer.h 中主要是添加了输入捕获初始化函数TIM5_CH1_Cap_Init 以及中断服务函数 TIM5_IRQHandler。接下来我们来看看timer.c文件中,我们添加的两个函数的内容:TIM

26、_ICInitTypeDef TIM5_ICInitStructure;/定时器5通道1输入捕获配置/arr:自动重装值(TIM2,TIM5 是 32 位的!) psc:时钟预分频数void TIM5_CH1_Cap_Init(u32 arr,u16 psc)GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);

27、/TIM5 时钟使能RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); /使能 PORTA 时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /GPIOA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;/复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; /速度 100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; /推挽复用输出GPIO_InitSt

28、ructure.GPIO_PuPd = GPIO_PuPd_DOWN; /下拉GPIO_Init(GPIOA,&GPIO_InitStructure); /初始化 PA0GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); /PA0 复用位定时器 5TIM_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_TimeBaseStructure);TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; /选择输入端 IC1 映射到 TI1 上TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; /上升

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1