×
嵌入式 > 技术百科 > 详情

MSP430捕获器简单实用

发布时间:2020-06-02 发布时间:
|

MSP430定时器A捕捉脉实例

  1. /*****************************************************************  

  2. //功能:利用定时器A的捕捉能测量脉冲信号的脉宽  

  3. //  

  4. //  

  5. //                MSP430F449  

  6. //             -----------------  

  7. //         /||              XIN|-  

  8. //          | |                 | 32kHz  

  9. //          --|RST          XOUT|-  

  10. //            |                 |  

  11. //            |        P1.5/ACLK|---+  

  12. //            |                 |   |  

  13. //            |         P2.0/TA2|

  14. //            |                 |  

  15. //            |                 |  

  16. //说明:ACLK要进行8分频(4K),并将其作为外部的要捕获的脉冲;  

  17. //MCLK=SMCLK=8M;  

  18. *****************************************************************/  

  19. #include    

  20. int pwm_start,pwm_end,pwm_wide=0;  

  21.  

  22. void main(void)  

  23. {  

  24.   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT  

  25.   P1DIR = 0x20;                   //  P1.5 输出  

  26.   P1SEL = 0x20;              // P1.5输出ACLK  

  27.    

  28.   P2SEL|=BIT0;                              //P2.0 CCI2A  

  29.    

  30.   SCFI0 |= FN_4;  

  31.   SCFQCTL = 121;                   // (121+1) ×32768 *2= 7.99Mhz  

  32.   FLL_CTL0=DCOPLUS+OSCCAP1;       //MCLK=SMCLK=8M  

  33.    

  34.   FLL_CTL1 |= FLL_DIV_8;                         //ACLK要进行8分频,ACLK=4K  

  35.    

  36.    

  37.   TACCTL2 =CAP+CM_3+CCIS_0+SCS+CCIE;  //捕获模式,上升和下降都捕获,选择CCI2A,同步,捕获中断开          

  38.                                       //Capture input select: 0 - CCI2A  

  39.   TACTL = TASSEL_2 + MC_2 ;    //SMCLK=8M,L连续计数模式  

  40.   _EINT();                 //开总中断  

  41.   LPM0;  

  42.   _NOP();  

  43.   pwm_wide=pwm_end-pwm_start;  

  44.  

  45.   while(1);  

  46. }  

  47.  

  48. // Timer_A3 Interrupt Vector (TAIV) handler  

  49. #pragma vector=TIMERA1_VECTOR  

  50. __interrupt void Timer_A(void)  

  51. {  

  52.    

  53.   switch(TAIV)  

  54.  {case 2:break;  

  55.   case 4:  

  56.      if(TACCTL2 & CCI)  

  57.         pwm_start=CCR2;    

  58.      else  

  59.         pwm_end=CCR2;  

  60.      //pwm_wide=pwm_end-pwm_start;  

  61.      break;  

  62.   case 10:  

  63.      break;  

  64.   }  

  65.   LPM0_EXIT;  

  66. }  


检验方法: 
在调试环境下,在watch 窗口观察pwm_end和pwm_start,然后相减! 
我计算了一下。在所给的例子中理论值pwm_end-pwm_start=976 
通过观察的结果是978,还是有点误差,可能是由于晶振的值原因,计算上的舍入有点偏差。

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
FPGA及CPLD应用领域不断拓展