3271|3

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

430两路捕获计时问题 [复制链接]

我用P1.2,1.3口捕获两个输入方波信号,均上升沿促发。两个捕获计数值差值得出时间差。但是计数差值很不稳定。。一段时间较为正常,一千多。一段时间突然保持在-几万。求助

#include  
long int cap1=0;
long int cap2=0;
long int cap1_array[16];
long int cap2_array[16];
unsigned char flag_cap1=0,flag_cap2=0;
int cap_diff=0;
long int captime_array[16];                // RAM array for differences
unsigned int capture_array[16];             // RAM array for captures
unsigned char index=0,index1=0,index2=0;
unsigned int time=0;
void InitSys()
{
  unsigned int iq0;   //使用XT2 振荡器
  BCSCTL1 &= ~XT2OFF; //打开XT2 振荡器
  do
  {
    IFG1 &= ~OFIFG;   //清除振荡器失效标志
    for(iq0=0xFF;iq0>0;iq0--);  //延时,等待XT2 起振
  }
  while ((IFG1 & OFIFG)!= 0);   //判断XT2 是否起振
  BCSCTL2=SELM_2+SELS+DIVS_3; //选择MCLK、SMCLK 为XT2/8
  
}
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  InitSys();
  
  P1DIR &= ~(BIT2+BIT3);                             // Set 1.2,3 input dir
  P1SEL |= (BIT2+BIT3);                             // Set P1.2,3 cap
  CCTL1 |= CM_1 + SCS + CCIS_0 + CAP + CCIE; // Rising edge + CCI0A (P1.1)
  CCTL2 |= CM_1 + SCS + CCIS_0 + CAP + CCIE;                                          // + //Capture Mode + Interrupt
  CCR0=10000;
  TACTL = TASSEL_2 + MC_1+TAIE;                  // SMCLK + Continuous Mode
  _EINT();//打开全局中断控制,若不需要打开,可以屏蔽本句
  while(1);
}

#pragma vector=TIMERA1_VECTOR
__interrupt void TimerA(void)
{
  switch (TAIV)
  {
    case 2:
      //捕获/比较1 中断
      cap1 =time*10000+TACCR1;
      cap1_array[index1++]=cap1;
             if (index1 == 16)
       {
         index1 = 0;
         //P1OUT ^= 0x01;                         // Toggle P1.0 using exclusive-OR
       }
      flag_cap1=1;
      break;
   
    case 4:
      //捕获/比较2 中断
      cap2 =time*10000+TACCR2;
            cap2_array[index2++]=cap2;
             if (index2 == 16)
       {
         index2 = 0;
         //P1OUT ^= 0x01;                         // Toggle P1.0 using exclusive-OR
       }
      flag_cap2=1;
      break;
   
    case 10:
      //TAIFG 定时器溢出中断
      time++;//tar增加到ccr0时产生一次中断
      break;
  }
  
    if((flag_cap1==1)&&(flag_cap2==1))
    {
       captime_array[index++] =cap2-cap1;            // record
       if (index == 16)
       {
         index = 0;
         //P1OUT ^= 0x01;                         // Toggle P1.0 using exclusive-OR
       }
       time=0;
       flag_cap1=0;
       flag_cap2=0;
    }
     
  
  
}

最新回复

有没有人做出来啊?   详情 回复 发表于 2015-4-23 20:40
 
点赞 关注

回复
举报

182

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
个人觉得你程序存在较大问题,首先CCR0对应的是一个独立的中断向量TIMERA0_VECTOR(即TIMER0_A0_VECTOR),另外cap1_array[16]和cap2_array[16]中存储的值根本没用到(是不是你后面还有程序没粘上啊?),“_EINT();//打开全局中断控制,若不需要打开,可以屏蔽本句
”这句话也有问题,全局中断是一定要开的,不然进不了中断服务程序的!还有不知道进中断后time++而后又清0是干吗用的~ 我也是新手,不知说的对不对~最近也在做用捕获来测两路方波的相位差,目前仍在纠结中~

点评

你做出来了吗  详情 回复 发表于 2013-9-6 21:27
 
 

回复

42

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发重邮king 的帖子

你做出来了吗
 
 
 

回复

37

帖子

2

TA的资源

一粒金砂(中级)

4
 
有没有人做出来啊?
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表