剛寫好的測頻程序,帶自動換擋,0.1到1M
#include"MSP430G2553.h" #include"TCA6416A.h" #include"HT1621.h" #include"LCD_128.h"
voidtimer0_capture(); /** * main.c */ float n1=0 ; //統(tǒng)計每秒的周期數(shù) float n2=0; //統(tǒng)計每個周期時鐘數(shù) float begin_counter=0; float time_frequency=0; float k=0; //狀態(tài)轉(zhuǎn)化 float n_max=181; //分界點 float m=0; //統(tǒng)計溢出數(shù) float m1=0; float n=0; int main(void) { WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer //時鐘配置 BCSCTL1=CALBC1_16MHZ; DCOCTL=CALDCO_16MHZ; //BCSCTL3=LFXT1S1; timer0_capture(); //捕獲定時器配置 timer1_init(); //測周法定時器配置 _enable_interrupts(); while(1) { m1=16000000/n2; //測周法頻率轉(zhuǎn)化
if(time_frequency>n_max) //閾值電壓,高低頻轉(zhuǎn)化 { n= time_frequency; } else { n=m1; } } return 0; } voidtimer0_capture(void) //捕獲定時器 { P1DIR &=~BIT2; P1SEL |=BIT2; TA0CTL=TASSEL_1+MC_1+TAIE+TACLR; //外部晶振,連續(xù)計數(shù)模式,使能計數(shù)器中斷,計數(shù)器清零 TA0CCTL1 |=CM_1+SCS+CAP+CCIS_0+CCIE;//上升沿捕獲,同步捕獲,CCI0A輸入,使能捕獲中斷 TA0CCR0=32768; //產(chǎn)生秒脈沖 } void timer1_init() //測周法定時器 {
TA1CTL=TASSEL_2+MC_2+TAIE+TACLR; //外部晶振,上升計數(shù),使能計數(shù)器中斷,計數(shù)器清零
} #pragmavector=TIMER0_A1_VECTOR __interrupt voidTIMER0_A1_ISR(void) { switch(TA0IV) { case 2: TA0CCR1_interrupt(); break; //捕獲中段 case 10: TA0_interrupt(); break; //溢出中斷 default: break; } } voidTA0CCR1_interrupt(void) { n1=n1+1; //高頻計數(shù) n2=m*65536+TA1R-begin_counter; //低頻時鐘沿個數(shù) begin_counter=TA1R; m=0; } voidTA0_interrupt(void) { time_frequency=n1; //高頻信號個數(shù) n1=0; } #pragmavector=TIMER1_A1_VECTOR __interrupt void TIMER1_A1_ISR(void) { switch(TA1IV) { case 10: TA1_interrupt(); break; //溢出中斷 default: break; } } voidTA1_interrupt() { m=m+1; }
|