微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > MSP430G2553捕获程序案例与经验分享

MSP430G2553捕获程序案例与经验分享

时间:07-04 来源: 点击:

RQ(LPM1_bits);

  //_bic_SR_register_on_exit(LPM1_bits);

  break;

  }

  case 4:break;

  case 10:break;

  }

  }

  //如果要测量更低频率的信号的话,可以在中断中判断溢出中断发生的次数,这样就可以得到溢出的次数,从而可以测量更

  //低频率的信号

  程序例子---利用捕获功能测一个正弦波信号的频率

  1.在进行测量之前,你需要对正弦波进行转换,把它变为方波。这个很简单的电路。

  2.测频率,下面的代码是我自己写的,可以测到100K。精确度0.01HZ。总的来说,用TIEMEA产生一个2S的中断,2S后去去读计算频率。TIMERA0是对脉冲宽度的测量,TIMERA1是对定时器timerA中断的处理

  void Init_Capture(void)

  {

  P1DIR&=~BIT1;

  P1SEL|=BIT1;

  BCSCTL2 |= SELS; // SMCLK=XT2=16M

  BCSCTL2 |= divS_1; //SMCLK 2分频,即SMCL=8MHZ

  TACTL |=TASSEL_1+TAIE+TACLR; //8分频,选择ACLK为timerA的时钟源(ACLK),开中断,增计数模式

  TACCTL0 |=CM_1+SCS+CAP+CCIS_0+CCIE; //上升沿捕获+同步捕获+开捕获+timerA为捕获+打开捕获中断

  TACTL |=MC_2;

  }

  int main()

  {

  Init_Capture();

  while(1)

  {

  if(global_a.Conver==1)//捕获频率

  {

  _DINT();

  global_a.Conver=0;

  global_a.CapCount=(float)((32768.0*global_a.pulse)/global_a.time);//计算频率,注意理解!

  Print_Fre();//显示频率

  _EINT();

  }

  }

  }

  #pragma vector=TIMERA0_VECTOR

  __interrupt void timer_A(void)

  {

  if(global_a.Cap_Tar==0)

  {

  global_a.Cap_First = TACCR0;

  global_a.Cap_Tar++;

  }

  else

  {

  global_a.Cap_Last = TACCR0;

  global_a.Cap_Tar++;

  }

  }

  #pragma vector=TIMERA1_VECTOR

  __interrupt void timeA1(void)

  {

  switch(TAIV)

  {case 2:

  break;

  case 4:

  break;

  case 10: if(global_a.Cap_Tar==0)

  global_a.pulse=0;

  else

  {

  global_a.pulse=global_a.Cap_Tar-1;

  global_a.time = global_a.Cap_Last-global_a.Cap_First;

  global_a.Cap_Tar=0;

  TACTL &=~BIT0;

  // BIC_SR_IRQ(LPM3_bits);

  global_a.Conver=1;

  _DINT();

  }

  break;

  }

  }

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top