打印

430F149定时器B捕获PWM表现异常

[复制链接]
742|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tonyhasadream|  楼主 | 2017-3-26 18:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tonyhasadream 于 2017-3-26 19:00 编辑

是这样的,手头上有几个输出为方波的传感器,现在需要使用MSP430F149来解析这个方波。
由于传感器数目多了,所以为了避免麻烦只能使用定时器B的捕获组单元。

但奇怪的是,同一套代码使用定时器A能够很好地解析方波(程序是测占空比的)

但是一旦运用到定时器B上去,就发生了异常,也不知道是不是和锁存器有关系

以下是我的代码:


#include  <msp430x14x.h>

unsigned int tem=0;
unsigned long start=0,temp=0,end=0,overflow=0,hold,length;
double per;

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P2DIR = 0XFF;                            // 流水灯是P2组IO口
  P2OUT = 0XFF;
  TBCTL = TBSSEL_2 + MC_2 + TBIE;           // SMCLK, contmode, interrupt
  TBCCTL1=CM_1+SCS+CAP+CCIE+CCIS_0;
  P4DIR&=~BIT1;                        //P4.1为输入
  P4SEL|=BIT1;
  /*
  TACTL = TASSEL_2 + MC_2 + TAIE;           // SMCLK, contmode, interrupt
  TACCTL1=CM_1+SCS+CAP+CCIE+CCIS_0;
  P1DIR&=~BIT2;                        //P1.2为输入
  P1SEL|=BIT2;
  */
  while(1)
  {
    length=overflow*65535+temp-start;
    per=hold/1.0/length;
    _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
  }
}

// Timer_B7 Interrupt Vector (TBIV) handler
#pragma vector=TIMERB1_VECTOR
__interrupt void Timer_B(void)
{
switch( TBIV )//(TBIV)
{
   case  2:

         if(TBCCTL1&CM_1)                       //上升沿
         {
           P2OUT |= BIT1;
           tem++;
           if(tem==1)                             //一个周期的开始
           {
             TBCCTL1=(TBCCTL1&(~CM_1))|CM_2;       //更变设置为下降沿触发
             start=TBCCR1;                     //记录初始时间(捕捉产生start)
             overflow=0;                       //溢出计数变量复位
           }
           else if(tem==2)                    //一个完整周期的结束+另一个新周期的开始
           {
             P2OUT ^= BIT2;
             tem=0;
             temp=TBCCR1;                      //把捕获/比较寄存器里的值记录下来
             _DINT();                          //关中断
             LPM0_EXIT;                         //从低功耗0模式退出
           }
         }
          else if(TBCCTL1&CM_2)                  //下降沿
         {  
            P2OUT &= ~BIT1;
            TBCCTL1=(TBCCTL1&(~CM_2))|CM_1;        //更变设置为上升沿触发           
            end=TBCCR1;                        //用start,end,overflow计算脉冲宽度
            hold=overflow*65535+end-start;         
         }

     /*
         if(TACCTL1&CM_1)                       //上升沿
         {
           P2OUT |= BIT1;
           tem++;
           if(tem==1)
           {
             TACCTL1=(TACCTL1&(~CM_1))|CM_2;       //更变设置为下降沿触发
             start=TACCR1;                     //记录初始时间(捕捉产生start)
             overflow=0;                       //溢出计数变量复位
           }
           else if(tem==2)
           {
             P2OUT ^= BIT2;
             tem=0;
             temp=TACCR1;                      //把捕获/比较寄存器里的值记录下来
             _DINT();                          //关中断
             LPM0_EXIT;                         //从低功耗0模式退出
           }
         }
          else if(TACCTL1&CM_2)                  //下降沿
         {  
            P2OUT &= ~BIT1;
            TACCTL1=(TACCTL1&(~CM_2))|CM_1;        //更变设置为上升沿触发           
            end=TACCR1;                        //用start,end,overflow计算脉冲宽度
            hold=overflow*65535+end-start;         
         }
     */
         break;
   case  4: break;                        
   case 14: overflow++;
            P2OUT ^= BIT0;                  // overflow
            break;
}
}


我在三个位置设置了LED灯来观察程序运行的状态。

定时器A和B的溢出中断(对应流水灯P2.0)都是正常的,定时器A的周期开始标志灯P2.1和完整周期结束灯P2.2表现正常数据正确;

但是定时器B的周期开始标志灯和完整周期结束灯抖得像穿了滑板鞋一样,当然数据也是不对的,请问这是为啥啊?

相关帖子

沙发
dirtwillfly| | 2017-3-26 20:55 | 只看该作者
定时器B和A有一些差异,这个资料说的比较清楚,你可以看看https://wenku.baidu.com/view/78b9c693e45c3b3566ec8bb5.html

使用特权

评论回复
板凳
uptown| | 2017-3-26 21:42 | 只看该作者
地板
uptown| | 2017-3-26 21:45 | 只看该作者
5
tonyhasadream|  楼主 | 2017-3-27 16:57 | 只看该作者
dirtwillfly 发表于 2017-3-26 20:55
定时器B和A有一些差异,这个资料说的比较清楚,你可以看看https://wenku.baidu.com/view/78b9c693e45c3b356 ...

后来仔细查看了一下原理图,这个锁存器是比较模块激活时才有用的;
从原理图上看,有一个二选一选择器,锁存器在0号线路上,而捕获模块在1号线路上,应该是不会影响到捕获工作的。
如果我有理解错还希望能纠正。

使用特权

评论回复
6
tonyhasadream|  楼主 | 2017-3-27 17:03 | 只看该作者
uptown 发表于 2017-3-26 21:45
http://download.csdn.net/download/yinxinerbian/3505874

我采用定时器A捕获已经能完美解析出PWM的参数(数据正确);
定时器B和A采用的是同一套代码,从代码来看,工作模式的配置也是相同的;
采用你提供的第一个链接的定时器B捕获程序肯定有结果,因为我的程序也能进入ISR,但是测出来的数据是错的。

使用特权

评论回复
7
tonyhasadream|  楼主 | 2017-3-27 17:07 | 只看该作者
我在三个地方设置了流水灯,P2.0的流水灯对应溢出,P2.1对应一个周期开始的两个沿,P2.2对应一个完整周期的结束;
采用定时器A的时候,P2.1和P2.2亮暗分明且有规律;
相同的程序、相同的配置、相同的信号采用定时器B来测量,P2.1和P2.2却亮暗不分明且无规律跳变。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝