まごころせいじつ堂

浜町庄金 研究開発  マイコンで遊んでばっかりで

LM35

LM35DZを複数つないだ時の問題 お詫びとハードでの解決

前回の続き。
温度センサLM35DZを複数Arduinoに繋いだ時のトラブル

こちらの方がADCの動作を考慮した読み捨ての回数を記事にされていた。
Arduino:温度センサー Processing + Firmata LM61BIZとLM35DZとDS18B20のメモ[マイコン風雲録]

ログを分析しようとしててあっと気付いた。
 for(int i=0;i<=NUM_LM35;i++) {
 だめだ……チャネルは6個しかないのに7個目読んでる……

 というわけでADC読み取りの最後が順番によらず跳ね上がるのは私のプログラムが原因でした。未定義のチャネル読んでる。申し訳ありません。

 ところで、チャネル読み込みの初回が順序に関わらず少し上がる現象は間違いなく起こっている。これを改善できるかどうか、以前も参考にした
■AVR(Arduino)にLM35温度センサをつなげた場合に正しくA/D変換出来ないトラブル(2012年2月15日)[SIESTA HOMEPAGE]
を参考に、LM35DZの出力に10KΩをぶら下げた。テスタでちゃんと信号-GND間が10KΩ程度か確認。
2012_10Kohm

 これで一晩ランニング。
比較のため前回とまったく同じヘボいコード(ADC0〜6まで読んでしまうもの)で実施。
この結果、最初に読んだチャネルが跳ね上がるという現象はなくなった。

□前回の生ログ(Arduino Leonardo、3V3リファレンス版) ※間違ったADCの7番目は除去
60702 72 73 74 74 73 74
121405 72 73 74 73 73 74
182107 72 73 73 73 73 73
242809 72 73 74 73 73 73
303512 72 73 73 73 73 73
364215 72 73 73 73 73 73
424918 72 73 73 72 73 73
485620 105 73 73 73 72 73
546323 71 73 73 73 72 73
607026 128 73 73 73 73 73
667727 72 73 73 73 73 74
728430 72 73 73 73 72 73
789133 72 73 73 73 72 73
849836 71 72 73 72 73 73

□今回の生ログ(Arduino Uno R3、1V1リファレンス版)
1759184 135 127 136 122 124 125 
1760387 135 128 136 122 124 124 
1761589 134 128 136 121 125 124 
1762791 135 127 136 122 125 124 
1763994 135 127 136 121 124 124 
1765196 134 127 135 122 125 123 
1766398 134 128 136 121 124 124 
1767602 135 127 136 122 125 124 
1768804 135 128 136 122 124 124 
1770006 134 127 135 122 124 124 
1771209 135 128 136 122 124 124 
1772411 135 128 136 122 125 124 
1773614 134 127 136 122 125 124 
1774816 135 128 136 122 125 124 

 LM35DZ直結の時は最初のADC読み取りで跳ね上がる現象が見られたが、10KΩをぶら下げることによりなくなった。しかし、各センサの値にむらがあるように見える。ADC0とADC2が値が大きい。

・今後の調査方針
(1)温度センサを束ねて同じ条件に
(2)ログをしっかり取ってawkで分析
(3) マイコン風雲録さんのanalogReadEx()で確認
 
 うう、デジタル温度センサに逃げたくなった……

温度センサLM35DZを複数Arduinoに繋いだ時のトラブル

※プログラムに誤りがありました。ADC0〜ADC5までなのにADC6相当を読んでいた。
続き↓
LM35DZを複数つないだ時の問題 お詫びとハードでの解決


環境:
Arduino UNO R3,Leonardo / IDE 1.0.1

 前回、LM35DZの動作確認をしたのでArduinoのアナログポートに複数個接続してみた所、測定値が時々跳ね上がる現象が発生。
LM35DZはA0〜A5に約50cmのケーブルで接続。パソコン筐体内の複数箇所の温度を測定するつもりで作った。

温度センサを同じ所にまとめて動作確認をした時に以下の現象が発生。

現象:時々、A0ポートに接続したLM35DZが6℃、A5ポートに接続したのが330℃を表示。測定間隔は約1分。
最初、Arduino Leonardo(ATmega 32U4)で確認したがArduino UNO R3(ATmega328)でも再現。こちらで調査開始。
アナログポートに接続したLM35DZを入れ替えても現象同じ。センサ個別についてまわる問題ではない。

 以前見かけたこの記事が詳しい。これに当たったようだ。これがなければわからなかっただろう。

// LM35DN x6 Thermal Logger

// http://arduino.cc/en/Reference/AnalogReference

unsigned int t,c;
float sc;
unsigned long time;
#define NUM_LM35 6
int LM35[NUM_LM35];
int Shuffle[NUM_LM35] ; // shuffle LM35 port 0-5 

// initialize the library with the numbers of the interface pins
///LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

float temp5v(int ain) {  // analog 0-1023 10mV/Celsius ,5V*100/1024
  return ain*5.0*100/1024;
}

float temp3v3(int ain) {  // analog 0-1023 10mV/Celsius,3.3V*100/1024
  return ain*3.3*100/1024;
}

float temp2v56(int ain) {  // analog 0-1023 10mV/Celsius,2.56V*100/1024
  return ain*2.56*100/1024;
}

float temp1v1(int ain) {  // analog 0-1023 10mV/Celsius,1.1V*100/1024
  return ain*1.1*100/1024;
}

void setup() {
  // set up the LCD's number of columns and rows: 
  // lcd.begin(16, 2);
  Serial.begin(9600);
  // External Aref(3.3V)
  // analogReference(EXTERNAL);//3.3V
  // Internal Aref(1.1V) ATmega328 ???
  analogReference(INTERNAL);
/*
  Shuffle[0]=A0;
  Shuffle[1]=A1;
  Shuffle[2]=A2;
  Shuffle[3]=A3;
  Shuffle[4]=A4;
  Shuffle[5]=A5;
*/
/*
  Shuffle[0]=A4;
  Shuffle[1]=A2;
  Shuffle[2]=A5;
  Shuffle[3]=A0;
  Shuffle[4]=A3;
  Shuffle[5]=A1;
*/
//  for (int i=0; i<=NUM_LM35;i++) LM35[i]=Shuffle[i] ;
/*
  LM35[0]=A0;
  LM35[1]=A1;
  LM35[2]=A2;
  LM35[3]=A3;
  LM35[4]=A4;
  LM35[5]=A5;
*/
  LM35[0]=A4;
  LM35[1]=A2;
  LM35[2]=A5;
  LM35[3]=A0;
  LM35[4]=A3;
  LM35[5]=A1;
}

void loop() {
    time=millis();Serial.print(time);Serial.print(" ");

    for(int i=0;i<=NUM_LM35;i++) {
      t=analogRead(LM35[i]); // (0...1023)
      sc=temp3v3(t); // Selcius
      // Serial.print(sc);
      // Serial.print(":");
      Serial.print(t);
      if (i<NUM_LM35) Serial.print(" ");
      delay(100);
    }
    Serial.println("");
    delay(60000); // 1000
} 
(1)A/Dコンバータ(ADC)のリファレンス電圧による違い→ 3.3Vより1.1Vの方が発生頻度が上がる
analogReference(EXTERNAL); // 3.3VをAREF端子に接続
analogReference(INTERNAL); // 1.1V内部リファレンス

(2)測定間隔による違い→1分間隔よりも1秒間隔の方が頻度が下がる(が発生)

(3)チャネルによる違い
A0,A1,A2,A3,A4,A5の順にリード→ A0で少し下がり、A5で大きく跳ね上がる
A4,A2,A5,A0,A3,A1の順にリード→ A4で少し下がり、A1で大きく跳ね上がる
つまり、ポートに関係なく読み出し順の最初と最後で異常。

(4)チャネルによる違いその2
  Shuffle[0]=A4;
  Shuffle[1]=A2;
  Shuffle[2]=A5;
  Shuffle[3]=A0;
  Shuffle[4]=A3;
  Shuffle[5]=A1;
  for (int i=0; i<=NUM_LM35;i++) LM35[i]=Shuffle[i] ;

として analogRead(LM35[i]);とやってみたら再現しなくなった。Shuffle[i]に代入するポート番号をA0〜A5に整列させても発生しない。

ATmega32U4のデータシートを見てみると、ADCの実体は1つで入力ポートを切り替えている。

きょうはここまで。

記事検索
プロフィール

hardyboy

カテゴリ別アーカイブ
月別アーカイブ
QRコード
QRコード
  • ライブドアブログ