剛寫好的測頻程序,帶自動換擋,0.1到1M
#include"MSP430G2553.h" #include"TCA6416A.h" #include"HT1621.h" #include"LCD_128.h"
voidtimer0_capture(); /** * main.c */ float n1=0 ; //統計每秒的周期數 float n2=0; //統計每個周期時鐘數 float begin_counter=0; float time_frequency=0; float k=0; //狀態轉化 float n_max=181; //分界點 float m=0; //統計溢出數 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; //測周法頻率轉化
if(time_frequency>n_max) //閾值電壓,高低頻轉化 { n= time_frequency; } else { n=m1; } } return 0; } voidtimer0_capture(void) //捕獲定時器 { P1DIR &=~BIT2; P1SEL |=BIT2; TA0CTL=TASSEL_1+MC_1+TAIE+TACLR; //外部晶振,連續計數模式,使能計數器中斷,計數器清零 TA0CCTL1 |=CM_1+SCS+CAP+CCIS_0+CCIE;//上升沿捕獲,同步捕獲,CCI0A輸入,使能捕獲中斷 TA0CCR0=32768; //產生秒脈沖 } void timer1_init() //測周法定時器 {
TA1CTL=TASSEL_2+MC_2+TAIE+TACLR; //外部晶振,上升計數,使能計數器中斷,計數器清零
} #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; //高頻計數 n2=m*65536+TA1R-begin_counter; //低頻時鐘沿個數 begin_counter=TA1R; m=0; } voidTA0_interrupt(void) { time_frequency=n1; //高頻信號個數 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; }
|