MSP430之频率测量,误差1Hz
1 #include "timerHz.h" 2 #include "msp430g2553.h" 3 4 #define _DEBUG_TIMERHZ_ 5 6 unsigned int capArray[16] = {0}; 7 unsigned char index = 2, flag = 0; 8 float hz = 0; 9 10 /* 11 * 绝对值 12 */ 13 int abs(int x) 14 { 15 return x>0?x:-x; 16 } 17 18 /* 19 * 系统初始化 20 */ 21 void HZ_Init() 22 { 23 P1SEL |= BIT1; //P1.1复用 24 P1DIR &= ~BIT1; //P1.1输入 25 // P1SEL |= BIT2; //P1.2复用 26 // P1DIR &= ~BIT2; //P1.2输入 27 28 CCTL0 = CM_1 + SCS + CCIS_0 + CAP + CCIE; //上升沿捕获,同步,信号源设置,捕获功能,允许捕获中断 29 TACTL = TASSEL_2 + MC_2; //定时器的时钟源选择SMCLK(16M),连续计数 30 } 31 32 /******************中断服务程序*****************************/ 33 #pragma vector=TIMER0_A0_VECTOR 34 __interrupt void TIME0_A0_ISR(void) 35 { 36 capArray[index--] = TA0CCR0; 37 if(index == 0) 38 { 39 index = 2; 40 TA0CCR0 = 0; // 清零计数器 41 flag = 1; 42 } 43 } 44 45 #ifdef _DEBUG_TIMERHZ_ 46 #include "12864.h" 47 #include "sys.h" 48 49 void main() 50 { 51 double temp = 213.456; 52 // unsigned char i; 53 54 System_Init(); 55 LCD_Init(); 56 HZ_Init(); 57 58 LCD_Show_String("Measure freq:"); 59 LCD_Set_Pos(1,0); 60 LCD_Show_Deci(temp); 61 LCD_Set_Pos(1,5); 62 LCD_Show_String("Hz"); 63 LCD_Set_Pos(1,0); 64 65 _EINT(); 66 while(1) 67 { 68 if (flag == 1) 69 { 70 // for (i = 0; i<=2; i += 2) 71 // temp += abs(capArray[i+1] - capArray[i]); 72 temp = abs(capArray[1] - capArray[2]); 73 hz = ((double )(1000000))/temp; //1MHZ,1/1000000s = 1us 74 LCD_Set_Pos(1,0); 75 LCD_Show_Deci(hz); //显示 76 flag = 0; 77 } 78 } 79 } 80 #endif