智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1445|回复: 2
打印 上一主题 下一主题

[调试类] 定时器多通道输入捕捉

[复制链接]

13

主题

47

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1000
威望
550
贡献
288
兑换币
335
注册时间
2013-12-3
在线时间
81 小时
毕业学校
上海工程技术大学
跳转到指定楼层
1#
发表于 2018-3-28 15:50:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
尝试使用XS128定时器的输入捕捉采集正脉宽的时间,目前开启了CH0、CH1输入捕捉但是中断只响应CH0,但是单独没各通道输入捕捉功能正常。不知道为什么望有经验的大牛对症下药。

  1. #include <hidef.h>      /* common defines and macros */
  2. #include "derivative.h"      /* derivative-specific definitions */

  3. /*********************************
  4.     *   TIM 输入捕捉 Input Capture
  5.     *   线路连接:PT0接PA4
  6.     *    LED循环闪烁
  7. *********************************/


  8. uint time1 = 0,time2 = 0,delaytime0 = 0,time11 = 0,time21 = 0,delaytime1 = 0;

  9. int Plug = 0;

  10. void IC_Init()
  11. {  
  12.         TSCR1 = 0x80;   //模块使能
  13.          
  14.         TIOS_IOS0 = 0;  //选择0通道为输入捕捉
  15.         TIOS_IOS1 = 0;  //选择1通道为输入捕捉
  16.          
  17.         //TCTL4 = 0X05; //上升沿捕捉
  18.         TCTL4_EDG0A = 0x01;
  19.         TCTL4_EDG0B = 0x00;
  20.         
  21.         TCTL4_EDG1A = 0x01;
  22.         TCTL4_EDG1B = 0x00;
  23.         
  24.         TIE_C0I = 0x01;   //允许中断
  25.         TIE_C1I = 0x01;
  26.          
  27.         //TSCR2 = 0X07; //总线时钟:8MHZ TIM时钟周期:1/(8/2^7)=16us
  28.         TSCR2 = 0X03; //总线时钟:8MHZ TIM时钟周期:1/(8/2^3)=1us
  29.             
  30.         TFLG1 = 0xff; //清除标志位  
  31.         TFLG2 = 0xff;  
  32. }  
  33. void IO_Init()
  34. {   
  35.         DDRB = 0xff;  //B口为输出  
  36.         DDRA = 0xff;  //A口为输出  
  37.         PORTB = 0xff; //初始灯全灭  
  38. }


  39. #pragma CODE_SEG __NEAR_SEG NON_BANKED

  40. interrupt 8 void ICI0_ISR(void)
  41. {  
  42.       static int log = 0;

  43.       //if(TFLG1_C0F==1)  
  44.       TFLG1_C0F = 1;   //清除标志位
  45.       
  46.       time1 = time2;
  47.       time2 = TC0;

  48.       log++;
  49.       if(log > 1)
  50.       {
  51.          log = 0;
  52.          TCTL4 = 0X01; //上升沿捕捉  
  53.       }else
  54.       {
  55.          TCTL4 = 0X02; //下降沿捕捉
  56.       }
  57.          
  58.       
  59.       delaytime0 = time2 - time1;  //可用于显示或其他作用,时间:delaytime*16us  
  60.       PORTB_PB1 = ~PORTB_PB1;
  61.       
  62. }

  63. interrupt 9 void ICI1_ISR(void)
  64. {
  65.      static int log = 0;
  66.      
  67.      //EnableInterrupts;
  68.      TFLG1_C1F = 1;   //清除标志位
  69.      
  70.      log++;
  71.      if(log > 1)
  72.      {
  73.          log = 0;
  74.          TCTL4 = 0X04; //上升沿捕捉  
  75.      }else
  76.      {
  77.          TCTL4 = 0X08; //下降沿捕捉
  78.      }
  79.       
  80.      time11 = time21;
  81.      time21 = TC1;
  82.      
  83.      delaytime1 = time21 - time11;  //可用于显示或其他作用,时间:delaytime*16us
  84.      PORTB_PB3 = ~PORTB_PB3;
  85. }
  86. #pragma CODE_SEG DEFAULT


  87. void Delay_ms(uint ms)
  88. {  //16MHZ ms级延时  
  89.         uint i,j;  
  90.        if (ms<1) ms=1;  
  91.        for(i=0;i<ms;i++)  
  92.          for(j=0;j<1335;j++);  
  93. }

  94. void main(void) {
  95.   /* put your own code here */
  96.   
  97.   IO_Init();  
  98.   IC_Init();

  99.         EnableInterrupts;

  100.   
  101.   for(;;)
  102.   {  
  103.         
  104.       PORTB_PB0 = ~PORTB_PB0;//提供脉冲源  
  105.       Delay_ms(100);  
  106.       _FEED_COP();
  107.       
  108.   }
  109.   /* please make sure that you never leave main */
  110. }
  111.    
  112.    
复制代码


回复

使用道具 举报

8

主题

280

帖子

0

精华

知名人物

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
37979
威望
11560
贡献
3701
兑换币
2372
注册时间
2014-11-1
在线时间
11359 小时
2#
发表于 2018-3-29 11:25:21 | 只看该作者
问题代码如下:
  1.       if(log > 1)
  2.       {
  3.          log = 0;
  4.          TCTL4 = 0X01; //上升沿捕捉  
  5.       }else
  6.       {
  7.          TCTL4 = 0X02; //下降沿捕捉
  8.       }
复制代码


  1.      if(log > 1)
  2.      {
  3.          log = 0;
  4.          TCTL4 = 0X04; //上升沿捕捉  
  5.      }else
  6.      {
  7.          TCTL4 = 0X08; //下降沿捕捉
  8.      }
复制代码


在两个中断中改变触发中断跳变沿时,直接赋值改变了整个TCTL4 寄存器,但是实际需要改变的只是两个bit,反应在代码中就是在在其中一个通道中断内将另一个通道的两个跳变沿控制位置为0了,即“禁止”状态,结果就是其中一个中断触发,另一个就被禁止无法进入了。
修改寄存器使用与/或操作即可解决这个问题,写1用或,置0用与。就是只修改控制当前通道的bit,其它bit保持原样。
回复 支持 反对

使用道具 举报

8

主题

280

帖子

0

精华

知名人物

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
37979
威望
11560
贡献
3701
兑换币
2372
注册时间
2014-11-1
在线时间
11359 小时
3#
发表于 2018-3-29 11:32:16 | 只看该作者
本帖最后由 铝、不想生锈 于 2018-3-29 11:34 编辑

另外,按照你现在的代码逻辑,delaytime0/delaytime1是两个跳变沿之间的时间差,即一会儿是正脉宽的时间长度,一会儿是负脉宽的时间长度,而不是你想的正脉宽的时间长度。
正脉宽的时间长度是下降沿的时间-上升沿的时间(不考虑计数器值溢出)。
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-5 16:27 , Processed in 0.129467 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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