您的位置 首页 解答

MSP430G2553捕获程序事例与经历共享

MSP430G2553捕获程序案例与经验分享-MSP430G2553单片机定时器A有3个捕获比较寄存器CCR0,CCR1,CCR2.捕获外部输入的信号的上升沿或下降沿或上升沿下降沿都捕捉,当捕捉发生时

  MSP430G2553单片机定时器A有3个捕获比较寄存器CCR0,CCR1,CCR2.。MSP430G2553捕获程序运用很广泛,电子工程师能够多加了解。

  所谓捕获,便是咱们来检测外围的信号跳变时间(此刻信号了解为数字信号,即脉冲),此信号乃为咱们捕获的目标,能够丈量信号的脉冲宽度,即频率等。

  捕获首要需求考虑的初始化作业

  1.设置BCS模块,确认体系时钟MCLK子体系时钟SMCLK

  把MCLK设置为8MHZ,SMCLK设置为1MHZ。

  2.捕获输入引脚的挑选

  挑选IO引脚时应查阅器材的手册,能够快速的查阅PDF材料找到正确的答案是一个程序员的基本素质。

  3.程序规划思路

  依据测频的原理,需求2次捕获才干丈量一次输入信号的频率。因而要界说2个变量保存2次捕获成果。变量是无符号的整数型变量(与捕获寄存器的字长匹配)。

  输入信号与CPU的作业是异步的,所以规划程序的时分是不知道什么时分才有捕获输入。

  程序处理何时发生了捕获的办法有2种

  一是查询的办法,定时器硬件在发生捕获事情后会置捕获中止表明CCIF为1,程序在主循环里不断的查询这个标志即可判别是否有捕获事情发生。

  二是定时器中止法,当发生捕获事情时必发生定时器中止,在中止中读取捕获寄存器即可。

  查询的办法不是好的程序规划办法,由于查询时要占用CPU,使得CPU不能再做其他使命。中止的办法对初学者有必定的困难。即中止程序怎么与主程序通讯(交流信息)。了解中止及规划中止服务程序要困难一些。

  捕获形式

  捕获外部输入的信号的上升沿或下降沿或上升沿下降沿都捕捉,当捕捉发生时,把TAR的值装载到TACCRx中,一起也能够进入中止,履行相应的操作。这样运用捕捉上升沿或下降沿就能够核算外部输入信号的周期,得出频率。运用捕捉上升沿和下降沿能够得出输入信号的高电平或低电平的持续时间。也能够算出占空比。下面是一个比如,是Timer_A捕获初始化的程序:

  void timer_init() //运用Timer1_A时要特别留意各个寄存器的写法,由于Timer0_A的寄存器都简写了,所以在写

  //Timer1_A的寄存器时,要特别留意与Timer0_A的不同

  {

  P1SEL |= BIT2; //挑选P12作为捕捉的输入端子 Timer0_A

  //TACCTL1 |=CM_3+SCS+CAP+CCIE; //上下沿都触发捕捉,用于测脉宽,同步形式、时能中止 CCI1A

  TACCTL1 |=CM_1+SCS+CAP+CCIE; //上升沿触发捕捉,同步形式、时能中止 CCI1A

  TACTL |= TASSEL1+MC_2; //挑选SMCLK时钟作为计数时钟源,不分频 增计数形式不可,有必要接连计数形式

  P2SEL |= BIT1; //挑选P21作为捕捉的输入端子 Timer1_A

  //TA1CCTL1 |=CM_3+SCS+CAP+CCIE; //上下沿都触发捕捉,用于测脉宽,同步形式、时能中止 CCI1A

  TA1CCTL1 |=CM_1+SCS+CAP+CCIE; //上升沿触发捕捉,同步形式、时能中止 CCI1A

  TA1CTL |= TASSEL1+MC_2; //挑选SMCLK时钟作为计数时钟源,不分频 增计数形式不可,有必要接连计数形式

  }

  相对应的中止函数如下:

  #pragma vector=TIMER0_A1_VECTOR //Timer0_A CC1 的中止向量

  __interrupt void Timer_A(void)

  {

  // CCI0A 运用的捕捉比较寄存器是TA0CCR0,TA0CCR0独自分配给一个

  //中止向量TIMER1_A0_VECTOR,所以进入中止后直接便是Timer0_A CC0发生的中止,不必通过相似

  //下面的办法判别中止源了 。

  //Timer0_A CC1-4, TA0共用一个中止向量 TIMER0_A1_VECTOR,所以进入了中止后还要用下面

  //的办法进行判别是哪一个中止源发生的中止

  switch(TAIV) //假如是Timer0_A CC1发生的中止

  {

  case 2:

  {

  flag=1;

  LPM1_EXIT; //退出低功耗形式

  // _BIC_SR_IRQ(LPM1_bits);

  //_bic_SR_register_on_exit(LPM1_bits);

  break;

  }

  case 4: break;

  case 10:break;

  }

  }

  #pragma vector=TIMER1_A1_VECTOR //Timer1_A CC1 的中止向量

  __interrupt void Timer_A1(void)

  {

  // P1OUT|=BIT0; //led调试用的

  // LPM1_EXIT; //退出低功耗形式 由于运用的是CCI0A 运用的捕捉比较寄存器是TA1CCR0,TA1CCR0独自分配给一个

  //中止向量TIMER1_A0_VECTOR,所以进入中止后直接便是Timer1_A CC0发生的中止,不必通过相似

  //下面注释掉的办法判别 。

  //而Timer1_A CC1-4, TA1则共用一个中止向量 TIMER1_A1_VECTOR,所以进入了中止后还要用下面

  //的办法进行判别是哪一个中止源发生的中止

  switch(TA1IV) //假如是Timer1_A CC1发生的中止

  {

  case 2:

  {

  flag=2;

  LPM1_EXIT; //退出低功耗形式

  // _BIC_SR_IRQ(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;

  }

  }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/179017.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部