msp430f5529內部運算的奇怪現象...

51 views
Skip to first unread message

喜同學

unread,
Aug 9, 2016, 11:48:40 PM8/9/16
to [LaunchPad互動裝置] TI MSP430 LaunchPad 使用者討論區
先簡單說一下動作。利用msp430f5529內部的溫度傳感器,量測電壓後
,經過ADC轉換,在經公式轉換數值,最後顯示在4和1共陽極7段顯示器上。

希望能夠幫助也在研究MSP430的朋友,也希望有人能回答我的問題!
有錯請指正。

#include <msp430f5529.h>
volatile unsigned int temp;
volatile unsigned int degC;
int i;
int seg[]= {0x80,0xf1,0x48,0x60,0x31,0x24,0x05,0xf0,0x00,0x30}; // 7段顯示器用的陣列,這跟你接的PIN角有關,小數點不用 

 void main(void) {
    WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer                                
    ADC12CTL0 &= ~ADC12ENC;                                                                            //    以下是ADC12的程式,ADC內核採用ACLK,以TimerA控制採樣頻率
    REFCTL0 &= ~REFMSTR;
    ADC12CTL0 = ADC12SHT0_5+ ADC12ON+ADC12REFON+ADC12REF2_5V;         //   打開內部參考電壓,選2.5V,選擇採樣保持時間
    ADC12CTL1 =ADC12SHS_1+ADC12CONSEQ_2+ADC12SSEL_1+ADC12SHP;       //  選擇單通道連續採樣模式,採樣頻率以TimerA控制
    ADC12CTL2=ADC12RES_2;                                                                                //  轉換精度12位
    ADC12MCTL0 =ADC12INCH_10+ADC12SREF_1;                                                 //   選擇參考電壓及轉換通道
    ADC12IE=BIT0;                                                                                                 //     使能ADC12IFG0
    _delay_cycles(200);

    UCSCTL4=SELA_2; //ACLK=refoclk 32768HZ
   // UCSCTL5=DIVA_5; //32

    TA0CTL = MC_1+TASSEL_1+TACLR;  //ACLK                   //   不解釋
    TA0CCTL1=OUTMOD_3;
    TA0CCR1 =59950;
    TA0CCR0 =60000;

    P2DIR = 0xff;                                                                //   7段顯示器角位設定
    P2DS= 0xff;
    P3DIR =BIT5+BIT6;

    P4DIR = BIT1+BIT2;
    P4OUT &= ~BIT1;
    P4OUT &= ~BIT2;
    P2OUT=0xff;

    ADC12CTL0 |= ADC12ENC ;
    _BIS_SR(GIE);                                                                                                //   打開全局使能
    while(1)
    {

    ADC12CTL0 |=  ADC12SC;                                                                           //  開始轉換,ADC轉換完成前,不斷掃描顯示器
     degC=(271*temp-302200);                                                                           // 將ADC12的數值做公式運算,得到溫度
     i=degC/1000;
         P3OUT &= ~BIT5;
                  P3OUT &= ~BIT6;
     P4OUT = BIT1;
     P2OUT = seg[ i%10]; //個位
     _delay_cycles(20);
          P2OUT= 0xff;
     _delay_cycles(5);

      P4OUT = BIT2;
      P2OUT = seg[( i%100)/10]; //十位
       _delay_cycles(20);
       P2OUT=0xff;
      _delay_cycles(5);

     P4OUT &=~(BIT1+BIT2);
     P3OUT =BIT5;
     P2OUT = seg[( i%1000)/100]; //百位
     _delay_cycles(20);
     P2OUT=0xff;
     _delay_cycles(5);

     P3OUT =BIT6;
     P2OUT = seg[ i/1000]; //千位
     _delay_cycles(20);
     P2OUT=0xff;
     _delay_cycles(5);

    }

}

#pragma vector = ADC12_VECTOR                                  //ADC12轉換完成,觸發中斷
 __interrupt void ADC12ISR(void)
 {
 switch(__even_in_range(ADC12IV,34))
 {
 case 0:break;
 case 2:break;
 case 4:break;
 case 6:
        temp = ADC12MEM0;                                               //將轉換結果寫入temp中

 case 8:break;
 case 10:break;
 case 12:break;
 case 14:break;
 case 16:break;
 case 18:break;
 case 20:break;
 case 22:break;
 case 24:break;
 case 26:break;
 case 27:break;
 case 28:break;
 case 30:break;
 case 32:break;
 case 34:break;
 default:break;
}

}

問題來了,本來我是寫  degC=(271*temp-302200)/1000
後面直接除1000,但是測試時都無法計算出正確值,值會很大。
所以只好再轉另一個變數/1000。
問題在哪裡呢?
還有個感想是,算式裡最好不要出現小數,否則運算速度會超慢。

Reply all
Reply to author
Forward
0 new messages