MSP430捕获器简单实用

MSP430定时器A捕捉脉实例[调试通过,很好用]

运行代码  复制代码
  1.  
  2. /*****************************************************************  
  3. //功能:利用定时器A的捕捉能测量脉冲信号的脉宽  
  4. //  
  5. //  
  6. //                MSP430F449  
  7. //             -----------------  
  8. //         /|\|              XIN|-  
  9. //          | |                 | 32kHz  
  10. //          --|RST          XOUT|-  
  11. //            |                 |  
  12. //            |        P1.5/ACLK|---+  
  13. //            |                 |   |  
  14. //            |         P2.0/TA2|<--+  
  15. //            |                 |  
  16. //            |                 |  
  17. //说明:ACLK要进行8分频(4K),并将其作为外部的要捕获的脉冲;  
  18. //MCLK=SMCLK=8M;  
  19. *****************************************************************/  
  20. #include  <msp430x44x.h>  
  21. int pwm_start,pwm_end,pwm_wide=0;  
  22.  
  23. void main(void)  
  24. {  
  25.   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT  
  26.   P1DIR = 0x20;                   //  P1.5 输出  
  27.   P1SEL = 0x20;              // P1.5输出ACLK  
  28.    
  29.   P2SEL|=BIT0;                              //P2.0 CCI2A  
  30.    
  31.   SCFI0 |= FN_4;  
  32.   SCFQCTL = 121;                   // (121+1) ×32768 *2= 7.99Mhz  
  33.   FLL_CTL0=DCOPLUS+OSCCAP1;       //MCLK=SMCLK=8M  
  34.    
  35.   FLL_CTL1 |= FLL_DIV_8;                         //ACLK要进行8分频,ACLK=4K  
  36.    
  37.    
  38.   TACCTL2 =CAP+CM_3+CCIS_0+SCS+CCIE;  //捕获模式,上升和下降都捕获,选择CCI2A,同步,捕获中断开          
  39.                                       //Capture input select: 0 - CCI2A  
  40.   TACTL = TASSEL_2 + MC_2 ;    //SMCLK=8M,L连续计数模式  
  41.   _EINT();                 //开总中断  
  42.   LPM0;  
  43.   _NOP();  
  44.   pwm_wide=pwm_end-pwm_start;  
  45.  
  46.   while(1);  
  47. }  
  48.  
  49. // Timer_A3 Interrupt Vector (TAIV) handler  
  50. #pragma vector=TIMERA1_VECTOR  
  51. __interrupt void Timer_A(void)  
  52. {  
  53.    
  54.   switch(TAIV)  
  55.  {case 2:break;  
  56.   case 4:  
  57.      if(TACCTL2 & CCI)  
  58.         pwm_start=CCR2;    
  59.      else  
  60.         pwm_end=CCR2;  
  61.      //pwm_wide=pwm_end-pwm_start;  
  62.      break;  
  63.   case 10:  
  64.      break;  
  65.   }  
  66.   LPM0_EXIT;  
  67. }  

检验方法: 
在调试环境下,在watch 窗口观察pwm_end和pwm_start,然后相减! 
我计算了一下。在所给的例子中理论值pwm_end-pwm_start=976 
通过观察的结果是978,还是有点误差,可能是由于晶振的值原因,计算上的舍入有点偏差。
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值