/***************************************************************** //功能:利用定時器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連續(xù)計數(shù)模式 _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; } |