《基于STM32定时器输入捕获解析.doc》由会员分享,可在线阅读,更多相关《基于STM32定时器输入捕获解析.doc(4页珍藏版)》请在三一文库上搜索。
1、基于STM32定时器输入捕获解析输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能。STM32的输入捕获,简单的说就是通过检测TIMx_CHx上的边沿信号,在边 沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存(TIMx_CCRx)里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA 等例如:我们用到TIM5_CH1来捕获高电平脉宽,也就是要先设置输入捕获为上升沿检测,记录发生上升沿的时候TIM5_CNT的值。然后配置捕获信号为下降沿捕获,当下降沿到来时,发
2、生捕获,并记录此时的TIM5_CNT值。这样,前后两次TIM5_CNT之差,就是高电平的脉宽,同时TIM5的计数频率我们是知道的,从而可以计算出高电平脉宽的准确时间。首先TIMx_ARR和TIMx_PSC,这两个寄存器用来设自动重装载值和TIMx的时钟分频。再来看看捕获/比较模式寄存器1:TIMx_CCMR1,这个寄存器在输入捕获的时候,非常有用;TIMx_CCMR1明显是针对2个通道的配置,低八位7:0用于捕获/比较通道1的控制,而高八位15:8则用于捕获/比较通道2的控制,因为TIMx还有CCMR2这个寄存器,所以可以知道CCMR2是用来控制通道3和通道4。这里用到TIM5的捕获/比较通道
3、1,我们重点介绍TIMx_CMMR1的7:0位(其实高8位配置类似)。再来看看捕获/比较使能寄存器:TIMx_CCER;接下来我们再看看DMA/中断使能寄存器:TIMx_DIER,我们需要用到中断来处理捕获数据,所以必须开启通道1的捕获比较中断,即CC1IE设置为1。控制寄存器:TIMx_CR1,我们只用到了它的最低位,也就是用来使能定时器的;最后再来看看捕获/比较寄存器1:TIMx_CCR1,该寄存器用来存储捕获发生时,TIMx_CNT的值,我们从TIMx_CCR1就可以读出通道1捕获发生时刻的TIMx_CNT值,通过两次捕获(一次上升沿捕获,一次下降沿捕获)的差值,就可以计算出高电平脉冲的
4、宽度。使能捕获和更新中断(设置TIM5的DIER寄存器)因为我们要捕获的是高电平信号的脉宽,所以,第一次捕获是上升沿,第二次捕获时下降沿,必须在捕获上升沿之后,设置捕获边沿为下降沿,同时,如果脉宽比较长,那么定时器就会溢出,对溢出必须做处理,否则结果就不准了。这两件事,我们都在中断里面做,所以必须开启捕获中断和更新中断。1 void init_tim2_cam(u16 psc, u16 arr, u8 way, u8 dir)2 3 RCC-APB1ENR |= 1 0; /使能定时器2时钟4 RCC-APB2ENR |= 1 2; /使能PortA56 switch (way)7 8 cas
5、e 1:9 GPIOA-CRL 10 GPIOA-CRL |= 0x00000008;11 break;12 case 2:13 GPIOA-CRL 14 GPIOA-CRL |= 0x00000088;15 break;16 case 3:17 GPIOA-CRL 18 GPIOA-CRL |= 0x00000888;19 break;20 case 4:21 GPIOA-CRL 22 GPIOA-CRL |= 0x00008888;23 break;24 2526 TIMER-PSC = psc;27 TIMER-ARR = arr;2829 switch (way)30 31 case
6、4:32 TIMER-CCMR2 |= 1 8;33 if (dir = 0)34 TIMER-CCER |= 1 13; /下降沿捕获35 else36 TIMER-CCER /上升沿捕获37 TIMER-CCER |= 1 12;38 TIMER-DIER |= 1 4;39 case 3: /CCR3 PA240 TIMER-CCMR2 |= 1 0;41 if (dir = 0)42 TIMER-CCER |= 1 9; /下降沿捕获43 else44 TIMER-CCER /上升沿捕获45 TIMER-CCER |= 1 8;46 TIMER-DIER |= 1 3;47 case
7、2: /CCR2 PA148 TIMER-CCMR1 |= 1 8; /CCR2配置通道方向:输入49 if (dir = 0)50 TIMER-CCER |= 1 5; /下降沿捕获51 else52 TIMER-CCER /上升沿捕获53 TIMER-CCER |= 1 4; /CCR2通道捕获使能54 TIMER-DIER |= 1 2; /CCR2通道允许捕获中断55 case 1: /CCR1 PA056 TIMER-CCMR1 |= 1 0; /CCR1配置通道方向:输入57 if (dir = 0)58 TIMER-CCER |= 1 1; /下降沿捕获59 else60 TIMER-CCER /上升沿捕获61 TIMER-CCER |= 1 0; /CCR1捕获使能62 TIMER-DIER |= 1 1; /CCR1通道允许捕获中断63 break;64 65 TIMER-DIER |= 1 0; /允许更新中断66 MY_NVIC_Init(1, 2, TIM2_IRQChannel, 2); /中断67 TIMER-CR1 = 0x01; /使能定时器68 TIMER-SR 69
链接地址:https://www.31doc.com/p-3412148.html