社区导航

 

搜索
查看: 3377|回复: 11

[求助] MSP430F149 定时器A捕获功能测脉冲宽度 各位大神帮忙看看哪出了问题?程序如下

[复制链接]

14

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2015-8-6 08:08 | 显示全部楼层 |阅读模式
  1. /****测脉冲宽度并用1602显示出来****/

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

  4. #define  uint     unsigned int
  5. #define  uchar    unsigned char

  6. uint pwm_star,pwm_end;

  7. uint width;

  8. uint i=0;

  9. uchar *s="The width is :";

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

  11. uint m,n,p,q;

  12. void main(void)

  13. {
  14.     WDTCTL=WDTPW+WDTHOLD;
  15.    
  16.     P6DIR |= BIT2;P6OUT |= BIT2;        //关闭电平转换
  17.    
  18.     P6DIR |= BIT3;P6OUT |= BIT3;        
  19.    
  20.     BCSCTL1 &= ~XT2OFF;                 //打开XT2高频晶体振荡器
  21.     do
  22.     {
  23.         IFG1 &= ~OFIFG;                 //清除晶振失败标志
  24.         for (i = 0xFF; i > 0; i--);     //等待8MHz晶体起振
  25.     }
  26.     while ((IFG1 & OFIFG));             //晶振失效标志仍然存在?
  27.     BCSCTL2 |= SELM_2 + SELS;           //MCLK和SMCLK选择高频晶振
  28.    
  29.     P1DIR|=BIT2;
  30.     P1SEL|=BIT2;   //捕获源为P1.2
  31.    
  32.     TACTL=TACLR;   //定时器清零
  33.     TACTL |= TASSEL_2 + ID_3; //计数时钟选择SMLK=8MHz,1/8分频后为1MHz
  34.    
  35.     TACCTL1 =CM_3+SCS+CAP+CCIS_0+CCIE; //上升沿下降沿都同步捕获
  36.       
  37.     TACTL = MC_2; //定时器计数开始 连续计数模式
  38.    
  39.     _EINT();
  40.    
  41.     LcdReset();
  42.    
  43.     DispStr(0,0,s);     
  44.      
  45.    while(1)
  46.     {           
  47.    
  48.      m=width/1000;
  49.      n=(width/100)%10;
  50.      p=(width/10)%10;
  51.      q=width%10;
  52.    
  53.      Disp1Char(4,1,b[m]);
  54.      Disp1Char(5,1,b[n]);
  55.      Disp1Char(6,1,b[p]);
  56.      Disp1Char(7,1,b[q]);
  57.      
  58.     }
  59. }
  60.    
  61. /******定时器TA的CCR1的中断 用于检测脉冲上升沿和下降沿******/

  62. #pragma vector=TIMERA1_VECTOR
  63. __interrupt void Timer_A1(void)
  64. {
  65.   switch(TAIV)
  66.   { case 0x02:
  67.             if(CCI==1)
  68.             {
  69.               pwm_star = TACCR1;
  70.               break;
  71.             }
  72.             else
  73.             {
  74.               pwm_end = TACCR1;
  75.               break;
  76.             }
  77.          
  78.          default:
  79.             break;
  80.   }
  81.   
  82.   width = pwm_end-pwm_star;
  83.    
  84. }
复制代码

回复

使用道具 举报

1299

TA的帖子

4

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2015-8-6 09:37 | 显示全部楼层
我先说一下你的不可取之处吧,为什么你要用TACCR1而不是TA0R?到底是哪个在计数,到底是哪个才能确定时间?你说你要测脉宽,我就要问你了,你怎么确定你三次捕获的上升沿和下降沿和上升沿,或者下降沿和上升沿和下降沿是紧紧的靠在一起的而没有错位,而不是第一个上升沿和第二个下降沿和第三个上升沿?单片机的捕获也不是100%的准确,如何减小误差就需要好好思考
天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友

回复

使用道具 举报

14

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-8-6 09:59 | 显示全部楼层
ywlzh 发表于 2015-8-6 09:37
我先说一下你的不可取之处吧,为什么你要用TACCR1而不是TA0R?到底是哪个在计数,到底是哪个才能确定时间? ...

首先真的谢谢你,但我还是有一些不明白。在捕获模式,当满足捕获条件时,硬件不是自动将计数器TAR中的数据写到TACCRx中吗?至于如何减小误差,我没有考虑到这点。

回复

使用道具 举报

1299

TA的帖子

4

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2015-8-6 10:03 | 显示全部楼层
好吧,我以前是习惯性的用TAR,这样让我更我理解,是我搞忘了也谢谢你跟我指出来,关于减小误差,我们老师用的是状态机,建议你也试试
天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友

回复

使用道具 举报

14

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-8-6 10:18 | 显示全部楼层
ywlzh 发表于 2015-8-6 10:03
好吧,我以前是习惯性的用TAR,这样让我更我理解,是我搞忘了也谢谢你跟我指出来,关于减小误差,我们老师 ...

状态机?不知道啊 刚百度了一下 感觉不会用 ,有时间再看看吧。现在我将程序下载到单片机后,输入一个方波信号,1602显示的数值一直为0, 真的不知道为什么。

点评

出错了,那我就跟你讲讲我调试的方法吧,输入的方波必须要满足3V到5V的峰峰值,如果给我500mv的信号,肯定是捕获不到的,再者就是看中断是不是进去了,怎么看?你不是有又1602的显示吗,你可以在中断函数里加进去一  详情 回复 发表于 2015-8-6 15:32

回复

使用道具 举报

1299

TA的帖子

4

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2015-8-6 15:32 | 显示全部楼层
qignsi2015 发表于 2015-8-6 10:18
状态机?不知道啊 刚百度了一下 感觉不会用 ,有时间再看看吧。现在我将程序下载到单片机后,输入一个方 ...

出错了,那我就跟你讲讲我调试的方法吧,输入的方波必须要满足3V到5V的峰峰值,如果给我500mv的信号,肯定是捕获不到的,再者就是看中断是不是进去了,怎么看?你不是有又1602的显示吗,你可以在中断函数里加进去一句无关的程序,比如在其他地方显示个无关的字符,主要是看中断进去没,你可以一步一步放这句程序,可以知道程序走在哪。还有一个就是你显示的更新频率是不是过快而导致显示0

点评

好吧,谢谢 我试试  详情 回复 发表于 2015-8-6 15:37
天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友

回复

使用道具 举报

14

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-8-6 15:37 | 显示全部楼层
ywlzh 发表于 2015-8-6 15:32
出错了,那我就跟你讲讲我调试的方法吧,输入的方波必须要满足3V到5V的峰峰值,如果给我500mv的信号,肯 ...

好吧,谢谢 我试试

点评

我刚才看了下,你编程现在没有个好的习惯,一个好的编程习惯可以省去很多麻烦,我给你找了个例程: #pragma vector = TIMER0_A1_VECTOR __interrupt void TIMER0_A1_ISR (void) { switch(__even_in_range(TA0I  详情 回复 发表于 2015-8-6 16:09

回复

使用道具 举报

1299

TA的帖子

4

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2015-8-6 16:09 | 显示全部楼层
qignsi2015 发表于 2015-8-6 15:37
好吧,谢谢 我试试

我刚才看了下,你编程现在没有个好的习惯,一个好的编程习惯可以省去很多麻烦,我给你找了个例程:
#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;
  }
}

你看看是不是一看就很清晰,哪个向量,到底是哪个引起的中断,一看就知道,调试就很方便

点评

嗯嗯 在用到多个中断时这样详细的中断向量会很方便的调试的。这个例程不完整,Count 、First_Time这两个变量的作用不是很明白,是要减小误差?也就是你说的状态机?  详情 回复 发表于 2015-8-6 18:54
天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,2060347305,添加说明EEworld好友

回复

使用道具 举报

14

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

 楼主| 发表于 2015-8-6 18:54 | 显示全部楼层
ywlzh 发表于 2015-8-6 16:09
我刚才看了下,你编程现在没有个好的习惯,一个好的编程习惯可以省去很多麻烦,我给你找了个例程:
#pra ...

嗯嗯 在用到多个中断时这样详细的中断向量会很方便的调试的。这个例程不完整,Count 、First_Time这两个变量的作用不是很明白,是要减小误差?也就是你说的状态机?

回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-7-20 10:53 | 显示全部楼层
想问一楼主这个程序完善了吗,可不可以解析一下啊

回复

使用道具 举报

2

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-7-20 10:54 | 显示全部楼层
我觉得楼主这段程序好像并没有计脉冲数啊~最近也在用1602显示频率数

回复

使用道具 举报

4

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-8-14 19:19 | 显示全部楼层
楼主,问题解决了吗,解决就分享一下

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-6-2 15:34 , Processed in 0.431720 second(s), 34 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表