历史上的今天
返回首页

历史上的今天

今天是:2024年09月30日(星期一)

正在发生

2020年09月30日 | MSP430G2553捕获程序案例与经验分享

2020-09-30 来源:elecfans

  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;

  }

  }

推荐阅读

史海拾趣

安森德(Ascend)公司的发展小趣事

安森德公司自创立之初,便以技术创新为核心竞争力。在半导体工艺领域,公司研发团队不断攻坚克难,成功研发出具有自主知识产权的超结MOSFET技术。这一技术的导通损耗和开关损耗均达到行业领先水平,为电源设备带来了更高的效率和更低的能源消耗。凭借这一技术突破,安森德的产品迅速在市场上获得认可,为公司的快速发展奠定了坚实基础。

Holy Stone公司的发展小趣事

在追求业务发展的同时,Holy Stone始终注重品质提升和环境管理。公司陆续通过了ISO9001、ISO14001、QS9000、ISO/TS16949等国际认证,确保了产品的高品质和环保性。这些认证不仅提升了公司的品牌形象和市场竞争力,还为客户提供了更加可靠的产品和服务。此外,公司还积极履行社会责任,在环境治理、社会参与等方面做出了具体贡献。

Doodle Labs公司的发展小趣事

在无线通信技术领域,Doodle Labs始终保持着领先地位。公司不断投入研发资源,积极探索新的技术方向和应用场景。近年来,Doodle Labs在5G、物联网安全等领域取得了重大突破,推出了一系列具有创新性的产品和技术解决方案。这些技术突破不仅提升了Doodle Labs的竞争力,也为客户带来了更多的价值和便利。

DOMINANT公司的发展小趣事

随着公司业务的不断发展,统明亮开始积极拓展全球市场。它通过与国内外知名企业的合作,不断提升自身的品牌影响力和市场竞争力。同时,统明亮还积极参加各类国际展会和交流活动,与全球各地的客户建立了紧密的合作关系。这些努力使得统明亮在全球LED市场中的份额不断扩大,其品牌影响力也得到了进一步提升。

请注意,由于篇幅限制,以上仅为三个简要故事。如果需要更多关于DOMINANT公司的发展故事,建议查阅相关报道和资料。

捷嘉电子(Chequers Electronic)公司的发展小趣事

随着市场需求的不断变化,捷嘉电子意识到只有不断创新才能保持竞争力。于是,公司投入大量资源进行技术研发,特别是在智能控制器PCBA制造及智能产品研发方面取得了显著成果。其中,公司研发的一款新型智能家居控制器,以其卓越的稳定性和易用性受到了市场的热烈欢迎。这款产品的成功,不仅提升了捷嘉电子的品牌知名度,也为其后续发展奠定了坚实的基础。

康奈特(CNNT)公司的发展小趣事

在光学镜片领域,产品质量是企业的生命线。康奈特深知这一点,因此从原材料采购到生产制造的每一个环节都建立了严格的品控体系。公司引进了先进的检测设备和技术手段,对每一片镜片都进行严格的检测和筛选。这种对质量的执着追求不仅赢得了消费者的信赖和认可,也为公司赢得了良好的口碑和市场份额。

问答坊 | AI 解惑

为何“安防示范城的电子眼成了睁眼瞎”

2009年年底安徽商报发表了一篇题为《安防示范城电子眼成了“睁眼瞎”》的报道。安徽潜山县近期发生了这样一个事情:潜山县梅城镇的赵潘节骑自行车回家途中,被一辆小货车撞倒在地,肇事车辆迅速向县城方向逃逸。然而,警方查看了全县的监控录像,却 ...…

查看全部问答>

台湾新茂(SyncMOS)与爱特梅尔(ATMEL) 8051内核单片机替换

台湾新茂(SyncMOS)与爱特梅尔(ATMEL)8051内核单片机替换表SM8952AC40PP/JP/QP=AT89S52-24PU/JP/AUSM8958AC40PP/JP=AT89C55WD-24PU/JPSM894051C25PP/SP=AT89C2051-24PU/SUSM894051C25PP/SP=AT89C4051-24PU/SU深圳市鼎尚电子有限公司,新茂大陆代理商 ...…

查看全部问答>

手机PCB可靠性的设计方案2

3.3.3 信号线布在电(地)层上 在多层印制板布线时,由于在信号线层没有布完的线剩下已经不多,再多加层数就会造成浪费也会给生产增加一定的工作量,成本也相应增加了,为解决这个矛盾,可以考虑在电(地)层上进行布线。首先应考虑用电源层,其次 ...…

查看全部问答>

人才招聘-Wince下BSP和App

公司在深圳宝安地区,计算机专业本科毕业生,或有相关工作经验1年以上。 peizhi78@126.com …

查看全部问答>

程序员聚贤庄

深圳程序员QQ群联盟成立两年多拥有三十个以上的QQ群,人数达二千多人,现在群雄云集,其中深程高级群更是高手云集,现有两名女成员都是计算机硕士两名.很多都是大公司的技术主干,现推介如下QQ群,如有兴趣速速加入:深程高级群:17538442c++:15195967 .NET ...…

查看全部问答>

【求】高手帮忙画个NEC720114做USB hub的电路图

【求】高手帮忙画个NEC720114做USB hub的电路图 因为我觉得这个IC比较稳定吧,所以希望坛子里面有用过这个ic的朋友帮忙画个图。 报酬详谈。我的联系方式:sz19943@126.com 最好是深圳的朋友,呵呵。…

查看全部问答>

用人体功效学分析白光LED在室内照明中的应用

作为一种具有巨大发展潜力的光源,LED的长寿命、牢固的结构、较低的功耗和灵活的外形尺寸等优点受到了人们越来越多的关注,近几年,LED特别是单色LED被广泛地应用于大屏幕、信号灯和景观照明中。随着LED技术的不断发展,白光LED的光效、显色性、色 ...…

查看全部问答>

lpc1114的定时器同时用问题

我用lpc1114的32位定时器及16位定时器,16位定时器是26us的无限中断,32位是按键 然后进行20ms的中断,我发现,当32位计数的时间内,16位中断完全没用,等32位搞完了,16位再接着中断,什么情况,中断不能嵌套么? 求高手解答!…

查看全部问答>

msp430f149的抗干扰问题

用msp430f149做了个电路,运转一两个小时就死机。我是在电路上接了个电磁铁,不知是不是它在干扰?…

查看全部问答>