2016-09-26 4 views
-1

LM35温度センサをAN1のアナログチャネルに接続し、PIC16F887のシリアルRS232を通して温度を送信しました。私は温度値を読み取っているが、値はしばしば31と32のように変化し、またLM35の温度が32,33などのように非常に急激に変化するときに一定の温度値を制御する方法。ここに私のコードは、誰でも助けてください。PIC16F887のADCの問題LM35の温度値が頻繁に変化する

#include <htc.h> 
void main(void) 
{ 
    TRISA1 = 1; 
    ANS1 = 1; 
    OSCCON = 0x78; // OSCILLATOR CONTROL REGISTER 
    TXSTA = 0x26; 
    RCSTA = 0x90; 
    SPBRG = 10; 
    ADCON1 = 0x80; 
    unsigned int current_temp, initial_temp = temperature(); 
    transmit_char(initial_temp); 
    flag = 0; 

    while (1) 
    { 
      current_temp = temperature(); 
      if((current_temp == (initial_temp + 1)) || (current_temp == (initial_temp - 1))) 
      { 
       flag = 1; 
      } 
      if(flag == 1) 
      { 
       flag = 0; 
       transmit_char(current_temp); 
       initial_temp = current_temp; 
      } 
    } 
} 

int temperature(void) 
{ 
    ADCON0 = 0xC5; 
    GODONE = 1; 
    while(GODONE); 
    int temp; 
    temp = (ADRESH << 8) + ADRESL; 
    temp = temp/2; 
    return temp; 
} 
+0

いくつかのバリエーションは正常です。データシートを読み、ハードウェアが正しいことを確認してください(ノイズなど)。説明から、これはソフトウェアの問題ではありません。 – Olaf

答えて

0

はこれを行い、 は10 ADCデータを収集し、 はその値から最小値と最大値を削除します。 残りの8つのADC値を合計し、値を8で割ります。 これは10個のサンプルごとに平均して連続プロセスでなければなりません 注:サンプリングと平均化は、1〜10、次の2〜11および3〜12です。すべての読書であなたはADC値を取得します。突然の変動もここでフィルタリングされます。

幸いです。幸運です。

関連する問題