OpenEdv-开源电子网

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

关于外部中断和定时器完成输入捕获功能,计算占空比的问题

[复制链接]

2

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2014-5-10
在线时间
0 小时
发表于 2014-6-17 15:41:28 | 显示全部楼层 |阅读模式
5金钱
      最近需要完成两路PWM波形的捕获,之前想用定时器的PWM输入捕获模式,但是一个定时器只能捕获1路PWM,就算是用普通模式,好多人也说只能捕获1路,所以最后我就选择用外部中断和定时器这种方式了。我参考了坛子里的一位坛友很早之前写过的分享http://www.openedv.com/posts/list/0/3070.htm#198368
但是我发现这个程序有些问题
//外部中断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上的中断标志位  
}


   上面这段程序,后来坛友说改成先是if(Input1 ==1)//这样才是上升沿触发,之后再是if(Input1 ==0) 我也觉得是这样。但是呢这其中有个问题,如果一开始的时候上升沿没来的话,按照程序这样就直接开始判断为下降沿了,这样的话程序就不对了,我想程序中应该加上上升沿没来的时候应该要怎么操作,但是我又不知道这样的话要怎么计算占空比了,我只能写到下面这样就不知道要怎么做了,希望高手们来看看帮我解决一下
void EXTI0_IRQHandler(void)
{      
   if(Input1 ==1)//先是上升沿触发中断
 {  
    Counter1 = TIM3->CNT;//读取高电平时间    
 }
  else if(Input1 ==0)//上升沿没有到来时

 {
    下面不知道怎么写了,没有思路  
 } 
 EXTI->R=1<<0;     //清除LINE0上的中断标志位  
}

最佳答案

查看完整内容[请看2#楼]

回复【3楼】fairytalegao: --------------------------------- 你做试验测试下吧。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-17 15:41:29 | 显示全部楼层
回复【3楼】fairytalegao:
---------------------------------
你做试验测试下吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-17 23:25:34 | 显示全部楼层
Input1 应该是有个初始化赋值的,根据你的初值来,就不会出错了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-6-18 09:04:13 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
这个Input1应该是外部中断引脚的状态,也就是Input=GPIOReadInputDataBit(GPIOB,GPIO_Pin_0),初值的话赋值为0,实际上我的思路是下面这样的
u8 Input=0;
void EXTI0_IRQHandler(void)
{  
   Input=GPIOReadInputDataBit(GPIOB,GPIO_Pin_0);     
   if(Input1 ==1)
 {  
    Counter1 =TIM_GetCounter(TIM3); 
    GPIOSetBits(GPIOB,GPIO_Pin_0); 
 }
  if(Input1 ==0)
 {
   Counter2 =TIM_GetCounter(TIM3); 
   delay_us(5);
   TIM_Cmd(TIM3,DISABLE);  
   GPIOResetBits(GPIOB,GPIO_Pin_0); 
 } 
 EXTI_ClearFlag(EXTI_Line0);     //清除LINE0上的中断标志位  
}
我还有疑问的是,这种思路的话最后Counter1*100/Counter2得出来的值是占空比吗 ?
备注:原子站长,谢谢你那么晚还回复我,我现在发觉自己远远还不够努力,向你学习,不过我不会熬夜的,女的熬夜多了老得快哈哈哈哈,我尽量早起
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-6-22 16:46:07 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
好的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-7 01:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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