定时器A捕获功能测脉冲宽度的问题

[复制链接]
869|10
手机看帖
扫描二维码
随时随地手机跟帖
Soraka|  楼主 | 2017-12-27 11:14 | 显示全部楼层 |阅读模式
MSP430F149 定时器A捕获功能测脉冲宽度 各位大神帮忙看看哪出了问题?

/****测脉冲宽度并用1602显示出来****/

#include <msp430x14x.h>
#include "cry1602.c"

#define  uint     unsigned int
#define  uchar    unsigned char

uint pwm_star,pwm_end;

uint width;

uint i=0;

uchar *s="The width is :";

uchar b[]={'0','1','2','3','4','5','6','7','8','9'};

uint m,n,p,q;

void main(void)

{
    WDTCTL=WDTPW+WDTHOLD;
   
    P6DIR |= BIT2;P6OUT |= BIT2;        //关闭电平转换
   
    P6DIR |= BIT3;P6OUT |= BIT3;        
   
    BCSCTL1 &= ~XT2OFF;                 //打开XT2高频晶体振荡器
    do
    {
        IFG1 &= ~OFIFG;                 //清除晶振失败标志
        for (i = 0xFF; i > 0; i--);     //等待8MHz晶体起振
    }
    while ((IFG1 & OFIFG));             //晶振失效标志仍然存在?
    BCSCTL2 |= SELM_2 + SELS;           //MCLK和SMCLK选择高频晶振
   
    P1DIR|=BIT2;
    P1SEL|=BIT2;   //捕获源为P1.2
   
    TACTL=TACLR;   //定时器清零
    TACTL |= TASSEL_2 + ID_3; //计数时钟选择SMLK=8MHz,1/8分频后为1MHz
   
    TACCTL1 =CM_3+SCS+CAP+CCIS_0+CCIE; //上升沿下降沿都同步捕获
      
    TACTL = MC_2; //定时器计数开始 连续计数模式
   
    _EINT();
   
    LcdReset();
   
    DispStr(0,0,s);     
     
   while(1)
    {           
   
     m=width/1000;
     n=(width/100)%10;
     p=(width/10)%10;
     q=width%10;
   
     Disp1Char(4,1,b[m]);
     Disp1Char(5,1,b[n]);
     Disp1Char(6,1,b[p]);
     Disp1Char(7,1,b[q]);
     
    }
}
   
/******定时器TA的CCR1的中断 用于检测脉冲上升沿和下降沿******/

#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1(void)
{
  switch(TAIV)
  { case 0x02:
            if(CCI==1)
            {
              pwm_star = TACCR1;
              break;
            }
            else
            {
              pwm_end = TACCR1;
              break;
            }
         
         default:
            break;
  }
  
  width = pwm_end-pwm_star;
   
}

相关帖子

Garen2| | 2017-12-27 11:27 | 显示全部楼层
为什么你要用TACCR1而不是TA0R?到底是哪个在计数,到底是哪个才能确定时间?

使用特权

评论回复
Ryze| | 2017-12-27 11:42 | 显示全部楼层
怎么确定你三次捕获的上升沿和下降沿和上升沿,或者下降沿和上升沿和下降沿是紧紧的靠在一起的而没有错位,而不是第一个上升沿和第二个下降沿和第三个上升沿?

使用特权

评论回复
Varus| | 2017-12-27 11:50 | 显示全部楼层
单片机的捕获也不是100%的准确,如何减小误差就需要好好思考

使用特权

评论回复
Snow7| | 2017-12-27 12:41 | 显示全部楼层
在捕获模式,当满足捕获条件时,硬件不是自动将计数器TAR中的数据写到TACCRx中吗?

使用特权

评论回复
android2| | 2017-12-27 12:51 | 显示全部楼层
关于减小误差,用状态机试试

使用特权

评论回复
dirtwillfly| | 2017-12-27 17:44 | 显示全部楼层
官网有类似的例程,建议楼主参考一下。或者在例程的基础上修改

使用特权

评论回复
拉克丝| | 2017-12-27 17:46 | 显示全部楼层
输入的方波必须要满足3V到5V的峰峰值,如果给我500mv的信号,肯定是捕获不到的,再者就是看中断是不是进去了,怎么看?你不是有又1602的显示吗,你可以在中断函数里加进去一句无关的程序,比如在其他地方显示个无关的字符,主要是看中断进去没,你可以一步一步放这句程序,可以知道程序走在哪。还有一个就是你显示的更新频率是不是过快而导致显示0

使用特权

评论回复
lefeng| | 2017-12-27 17:54 | 显示全部楼层
参考一下
#pragma vector = TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR (void)
{
  switch(__even_in_range(TA0IV,0x0A))
  {
      case  TA0IV_NONE: break;              // Vector  0:  No interrupt
      case  TA0IV_TACCR1:                   // Vector  2:  TACCR1 CCIFG
        if (TA0CCTL1 & CCI)                 // Capture Input Pin Status
        {
            // Rising Edge was captured
            if (!Count)
            {
                REdge1 = TA0CCR1;
                Count++;
            }
            else
            {
                REdge2 = TA0CCR1;
                Count=0x0;
                __bic_SR_register_on_exit(LPM0_bits + GIE);  // Exit LPM0 on return to main
            }

            if (First_Time)
                First_Time = 0x0;
        }
        else
        {
            // Falling Edge was captured
            if(!First_Time)
            {
                FEdge = TA0CCR1;
            }
        }
        break;
      case TA0IV_TACCR2: break;             // Vector  4:  TACCR2 CCIFG
      case TA0IV_6: break;                  // Vector  6:  Reserved CCIFG
      case TA0IV_8: break;                  // Vector  8:  Reserved CCIFG
      case TA0IV_TAIFG: break;              // Vector 10:  TAIFG
      default:         break;
  }
}

使用特权

评论回复
CaLipton| | 2017-12-27 18:37 | 显示全部楼层
这个例程不完整,Count 、First_Time这两个变量的作用不是很明白,是要减小误差?

使用特权

评论回复
Rospiers| | 2017-12-27 18:46 | 显示全部楼层
我觉得楼主这段程序好像并没有计脉冲数啊~最近也在用1602显示频率数

使用特权

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

本版积分规则

178

主题

865

帖子

5

粉丝