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

发布者:vnerwb池塘边最新更新时间:2020-09-30 来源: elecfans关键字:MSP430G2553  捕获程序  捕获比较寄存器 手机看文章 扫描二维码
随时随地手机看文章

  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;

  }

  }

关键字:MSP430G2553  捕获程序  捕获比较寄存器 引用地址:MSP430G2553捕获程序案例与经验分享

上一篇:如何用水果电池驱动LCD?
下一篇:低功耗非接触式射频读写器的设计与实现

推荐阅读最新更新时间:2024-11-06 12:27

总结的MSP430G2553点亮1602例程
作为小白,总结了一些例程,希望对新手有用 main.c主程序 unsigned char *s1= welcome! ;这句话显示有警告,不知道是什么问题,不过也可以执行。 void main(void) { uchar i; WDTCTL=WDT_ADLY_250; LcdReset(); Dispstr(04,0,s1); LocateXY(0,9); LcdWriteCommand(0x07,1); //0x07表示n=1,s=1整屏左移。 for(i=12;i 0;i--) { LcdWriteData(0x20); IFG1 &=~ WDTIFG; while(!(IFG1 & WDTIFG)); IFG1 &
[单片机]
MSP430G2553默认的MCLK、SMCLK、ACLK时钟频率
摘要:   本文将介绍如何从手册中查找出G2553各个时钟的默认时钟频率,以及使用定时器中断方法测出各个时钟频率。实验所用平台是MSP-EXP430G2 LaunchPad,MCU为MSP430G2553。 1、查阅datasheet。   手册原文:After a PUC,MCLK and SMCLK are sourced from DCOCLK at ~1.1Mhz (see the device-specific data sheet for parameters) and ACLK is sourced from LFXT1CLK in LF mode with an internal load capacitance
[单片机]
msp430g2553按键控制LED亮灭
实现每按一次button,LED输出翻转一次。 仿真如下: 每按一次P1.3的button,p1.6连的LED翻转一次; 代码说明: 每按一次button,触发一次引脚中断,执行一次 P1_3ISR() 中断函数 #include msp430.h void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P1DIR = BIT6; //p1.0,p1.6外接LED为输出状态 P1OUT &= ~ BIT6; P1REN |= BIT3; //pull up P1OUT |= BIT3; P1IE |= BIT3; //P1.3中断使能 P1IES |= BIT3;
[单片机]
<font color='red'>msp430g2553</font>按键控制LED亮灭
分解MSP430G2553的定时器
  MSP430G2553有几个定时器   MSP430G2553具有两个16位的定时器: TI mer0_A TI mer1_A。分别具有三个捕捉/比较寄存器,具有输入捕捉,输出比较功能。可以产生定时中断,也可以产生PWM。分别有对应的寄存器控制。定时器有三种工作模式:1.连续计数模式 2.增计数模式3. 增减计数模式。   配置定时器时候,首先要选择相应的时钟源。在TACTL寄存器的TASSELx标志位控制,我们寻则SMCLK作为源(2MHz),然后进行一个2分频,最终震荡频率 1MHz。   定时器a图解         3.连续计数模式(产生一个中断标志)   计数器将直接计数到计数器所能计数的最大值0
[单片机]
分解<font color='red'>MSP430G2553</font>的定时器
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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