OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 21880|回复: 22

分享:定时器和外部中断完成输入捕获功能,并计算频率和占空比。

[复制链接]

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
发表于 2012-3-5 10:04:30 | 显示全部楼层 |阅读模式

其实这样的功能只要用一个定时器就可以完成了,不过为了更深地了解定时器输入捕获的功能,我自己设置了用定时器分开定时,外部中断读取信号的方法。只供参考学习。

程序说明:1、定时器2用于产生PWM信号 PA2

               2、定时器3用于定时计算PWM信号的频率和占空比

             3、串口发送数值      

 这里声明一下,如果你要捕获的PWM信号不在ARR,PSC计算的范围内,请自己先计算再使用本程序。

#include "stm32f10x_lib.h"
#include "sys.h"
#include "delay.h" //延时子函数
#include "usart.h"
#include "led.h"

#define Input1 PBin(0)// PB0

u16 Counter1;
u16 Counter2; 
void EXTIX_Init(void);
void Timer2_Init(u16 arr,u16 psc); //定时器2用于产生PWM信号 PA2
void Timer3_Init(u16 arr,u16 psc);//定时器3用于定时计算PWM信号的频率和占空比  ,这里7200-1=10K

int  main(void)
 {
   Stm32_Clock_Init(9); //系统时钟设置
   delay_init(72);//延时函数初始化
   uart_init(72,9600);
   LED_Init();
   EXTIX_Init();//外部中断初始化PB0
   Timer2_Init(6000,720-1); //定时器2用于产生PWM信号 PA2
   Timer3_Init(6000,7200-1); //定时器3用于定时计算PWM信号的频率和占空比  ,这里7200-1=10K
   while(1)
   {
  printf("counter1 = %d \r\n",(Counter1*100)/Counter2); //计算出占空比
     printf("counter2 = %d \r\n",10000/Counter2);//计算出频率
 
   }
 }

/*外部中断用于PWM输入口*/
void EXTIX_Init(void)
{
 RCC->APB2ENR|=1<<3;     //使能PORTB时钟

 GPIOB->CRL&=0XFFFFFFF0;//PB0设置成输入  
 GPIOB->CRL|=0X00000008;       
 GPIOB->ODR|=1<<0;    //PB0上拉

 Ex_NVIC_Config(GPIO_B,0,3);//上升下降沿触发

 MY_NVIC_Init(2,1,EXTI0_IRQChannel,2);//抢占2,子优先级1,组2   
}

//外部中断15~10服务程序
void EXTI0_IRQHandler(void)
{     
   if(Input1 ==0)//先是上升沿触发中断
 { 
    Counter1 = TIM3->CNT;//读取高电平时间   
 }
 if(Input1 ==1)//第二次中断是下降沿
 {
    Counter2 = TIM3->CNT;//读取总时间
    delay_us(5);//这里要延时一点点再清计算器
    TIM3->CNT = 0;//请计数器   
 } 
 EXTI->R=1<<0;     //清除LINE0上的中断标志位 
}

/*定时器2用于产生PWM信号*/
void Timer2_Init(u16 arr,u16 psc) //定时器2用于adc采样
{
 //此部分需手动修改 IO口设置
 RCC->APB1ENR|=1<<0;       //TIM2 时钟使能 
 RCC->APB2ENR|=1<<0;    //   
 RCC->APB2ENR|=1<<2;    //使能PORTA时钟
   

 GPIOA->CRL&=0XFFFFF0FF;//PA2输出 
 GPIOA->CRL|=0X00000B00;//复用功能输出      
 GPIOA->ODR|=1<<2;//PA2 上拉 

 TIM2->ARR=arr;//设定计数器自动重装值  
 TIM2->SC=psc;//预分频器不分频 


 //PWM
 TIM2->CCMR2|=7<<4;  //CH3 PWM2模式     
 TIM2->CCMR2|=1<<3; //CH3 预装载使能   
 TIM2->CCER|=1<<8;  //OC3  输出使能     
 TIM2->CR1=0x0080;   //ARPE使能

 //TIM2->CR1|=0x01;    //使能定时器 3

 TIM2->CR1|=1<<0; //使能定时器 2
 TIM2->CCR3   = 3000;  //占空比初值 =  1440*50% = 720
            
}
/*定时器3用于产后PWM信号*/
void Timer3_Init(u16 arr,u16 psc)
{
 RCC->APB1ENR|=1<<1;//TIM2时钟使能   
  TIM3->ARR=arr;  //设定计数器自动重装值//刚好1ms   
 TIM3->SC=psc;  //预分频器,

 TIM3->DIER|=1<<0;   //允许更新中断    
 TIM3->DIER|=1<<6;   //允许触发中断   
 TIM3->CR1|=0x01;    //使能定时器3
   MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//抢占1,子优先级3,组2         
}

//定时器3中断服务程序 
void TIM3_IRQHandler(void)
{                 
 if(TIM3->SR&0X0001)//溢出中断
 {
  LED0=~LED0;               
 }      
 TIM3->SR&=~(1<<0);//清除中断标志位     
}


 

     

?成功只是最后一小步的坚持!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-3-5 10:06:09 | 显示全部楼层
suqingxiao 
 玩定时器很熟了啊。呵呵。什么时候来个定时器应用大全的资料?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
 楼主| 发表于 2012-3-5 10:14:27 | 显示全部楼层
一般般了,熟悉还有一段距离。学得还是不够深。不过我还会继续深入。以后做项目多了,经验会丰富一点。
?成功只是最后一小步的坚持!
回复 支持 反对

使用道具 举报

18

主题

158

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
400
金钱
400
注册时间
2011-11-23
在线时间
0 小时
发表于 2012-3-6 14:48:46 | 显示全部楼层
回复【3楼】suqingxiao:
---------------------------------定时器2只是作为了一个脉冲的输入信号,而定时器3利用了脉冲捕获来计算定时器2的频率和占空比,中断时间到时,就会利用PB0的引脚变化,外部中断去发送频率和占空比的值,我现在疑惑的是!
定时器2输入的PWM,其实应该已经知道了,你现在利用的是定时器3去计算这个值,楼主里面最精彩的莫过于你对定时器寄存器的参数配置,上升沿和下降沿触发的中断的时间,和最好你要发送的信息,这里面的配置,是需要相当的功底的,希望楼主能解释下,谢谢了~
回复 支持 反对

使用道具 举报

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
 楼主| 发表于 2012-3-6 16:53:26 | 显示全部楼层
楼上过奖了,程序中还有不妥的地方,我愿意是计算高电平时间和信号的周期,中断两个边沿进入。我在if(Input1 ==1)//第二次中断是下降沿,这里是不妥的,因为上升源进去应该是高电平,不过我在这里清CNT,得出来的确实是周期。只是呢,我后来想了想,还是在if(Input1 ==1)时读高电平,if(Input1 ==0)读周期再清CNT.
?成功只是最后一小步的坚持!
回复 支持 反对

使用道具 举报

11

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2012-2-13
在线时间
0 小时
发表于 2012-3-6 18:23:35 | 显示全部楼层
回复【楼主位】suqingxiao:
---------------------------------
问下你的占空比初值的计算依据的是什么?1440是自己拟定的值么?
回复 支持 反对

使用道具 举报

57

主题

431

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
886
金钱
886
注册时间
2011-12-25
在线时间
12 小时
发表于 2012-3-6 20:54:04 | 显示全部楼层
回复【5楼】suqingxiao:
---------------------------------楼主,你的程序我验证后,行不痛,占空比是对了,但是频率差了太远了,希望楼主解释一下。。还有占空比按楼主的程序是计算低电平的。。。
很喜爱电子行业
回复 支持 反对

使用道具 举报

20

主题

562

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
670
金钱
670
注册时间
2012-2-28
在线时间
0 小时
发表于 2012-3-6 20:59:41 | 显示全部楼层

回复【2楼】正点原子:
---------------------------------
问一下原子大哥:
定时器有捕捉比较功能,这个和中断那个更快呢???
定时器捕获的时候如楼上将定时器的频率设置的特别低,那么这样捕获的频率应该不准的,那为何不把频率设置高一点呢???希望原子回复一下,也希望与楼主探讨一下
努力,前进。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-3-6 21:11:44 | 显示全部楼层
回复【8楼】5498折戟沉沙:
---------------------------------
捕捉和中断,我觉得速度应该是差不多的,只是中断需要CPU处理,捕捉的话,可以自动处理.
频率低不一定不准.所以我让楼主测试一下最快能多高频率.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
 楼主| 发表于 2012-4-9 12:37:58 | 显示全部楼层
最高能捕捉的频率我自己也没有去验证过,这个我也段定不了,看哪天有空的时候认真研究一下。因为这些都是工作之余的好爱。大家可以相互学习一下。
?成功只是最后一小步的坚持!
回复 支持 反对

使用道具 举报

36

主题

150

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
349
金钱
349
注册时间
2012-1-21
在线时间
12 小时
发表于 2012-9-2 16:27:41 | 显示全部楼层
回复【10楼】suqingxiao:
---------------------------------
我刚测了,20K,测的20408
回复 支持 反对

使用道具 举报

2

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2013-3-16
在线时间
7 小时
发表于 2013-3-29 00:40:34 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

9

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2013-3-16
在线时间
0 小时
发表于 2013-3-29 08:27:21 | 显示全部楼层
MARK
回复 支持 反对

使用道具 举报

43

主题

152

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-8-11
在线时间
57 小时
发表于 2013-8-19 12:22:41 | 显示全部楼层
楼主,有问题 TIM3->DIER|=1<<6;   //允许触发中断   。。DIER寄存器的1到7位不是保留的么
回复 支持 反对

使用道具 举报

4

主题

84

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2013-10-17
在线时间
9 小时
发表于 2014-4-23 16:57:40 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2014-6-11
在线时间
0 小时
发表于 2014-6-11 18:56:09 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,请问可以用TIM同时捕获4路PWM么?怎么捕获呢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-6-11 20:54:59 | 显示全部楼层
回复【16楼】wang123:
---------------------------------
一个TIM最多同时捕获1路PWM
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2014-6-11
在线时间
0 小时
发表于 2014-6-11 21:31:15 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
不使用PWM输入捕获模式也不能捕获么?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-6-11 21:33:02 | 显示全部楼层
回复【18楼】wang123:
---------------------------------
不使用PWM输入捕获模式,可以同时产生4路输入捕获,可以支持4路PWM的捕获了.不过PWM速度过快的话,估计也够呛.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2014-5-10
在线时间
0 小时
发表于 2014-6-17 10:12:42 | 显示全部楼层
虽然说普通模式下四个通道都可以捕获,但貌似行不通,普通模式下也是一个定时器只有一路捕获,还有的人说自己试验过高级定时器可以实现两路PWM输入捕获,和手册上写的都有出入  这些我没有试验过,是看论坛上的坛友们讨论的,看来需要自己动手试验一下了
回复 支持 反对

使用道具 举报

7

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
177
金钱
177
注册时间
2014-9-2
在线时间
20 小时
发表于 2015-5-31 11:12:48 | 显示全部楼层
#include "stm32f10x_lib.h"想问下这个头文件是什么 ,为什么在原子哥的例程里都没有看到,或者可以用什么替代么
回复 支持 反对

使用道具 举报

20

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2016-9-26
在线时间
59 小时
发表于 2017-1-2 11:10:33 | 显示全部楼层
这个程序真的是很厉害呀,特别是外部中断处理那一段的确碉堡了。
回复 支持 反对

使用道具 举报

5

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
265
金钱
265
注册时间
2019-4-19
在线时间
44 小时
发表于 2020-4-6 15:52:16 | 显示全部楼层
占空比100%的时候是怎么解决的?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 23:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表