MSP430定时器A捕捉脉实例[调试通过,很好用]
运行代码
复制代码
-
- /*****************************************************************
- //功能:利用定时器A的捕捉能测量脉冲信号的脉宽
- //
- //
- // MSP430F449
- // -----------------
- // /|\| XIN|-
- // | | | 32kHz
- // --|RST XOUT|-
- // | |
- // | P1.5/ACLK|---+
- // | | |
- // | P2.0/TA2|<--+
- // | |
- // | |
- //说明:ACLK要进行8分频(4K),并将其作为外部的要捕获的脉冲;
- //MCLK=SMCLK=8M;
- *****************************************************************/
- #include <msp430x44x.h>
- int pwm_start,pwm_end,pwm_wide=0;
-
- void main(void)
- {
- WDTCTL = WDTPW + WDTHOLD; // Stop WDT
- P1DIR = 0x20; // P1.5 输出
- P1SEL = 0x20; // P1.5输出ACLK
-
- P2SEL|=BIT0; //P2.0 CCI2A
-
- SCFI0 |= FN_4;
- SCFQCTL = 121; // (121+1) ×32768 *2= 7.99Mhz
- FLL_CTL0=DCOPLUS+OSCCAP1; //MCLK=SMCLK=8M
-
- FLL_CTL1 |= FLL_DIV_8; //ACLK要进行8分频,ACLK=4K
-
-
- TACCTL2 =CAP+CM_3+CCIS_0+SCS+CCIE; //捕获模式,上升和下降都捕获,选择CCI2A,同步,捕获中断开
- //Capture input select: 0 - CCI2A
- TACTL = TASSEL_2 + MC_2 ; //SMCLK=8M,L连续计数模式
- _EINT(); //开总中断
- LPM0;
- _NOP();
- pwm_wide=pwm_end-pwm_start;
-
- while(1);
- }
-
- // Timer_A3 Interrupt Vector (TAIV) handler
- #pragma vector=TIMERA1_VECTOR
- __interrupt void Timer_A(void)
- {
-
- switch(TAIV)
- {case 2:break;
- case 4:
- if(TACCTL2 & CCI)
- pwm_start=CCR2;
- else
- pwm_end=CCR2;
- //pwm_wide=pwm_end-pwm_start;
- break;
- case 10:
- break;
- }
- LPM0_EXIT;
- }
-
检验方法:
在调试环境下,在watch 窗口观察pwm_end和pwm_start,然后相减!
我计算了一下。在所给的例子中理论值pwm_end-pwm_start=976
通过观察的结果是978,还是有点误差,可能是由于晶振的值原因,计算上的舍入有点偏差。
|