2端子温度センサLMT01を試す(10)多チャンネル化・続き
2016-02-18
LMT01のデータシートFig..33に複数のLMT01をつなぐ方法が載せられてます。

注意すべき点は使わないLMT01のVPはローレベルにするのではなくフローティングにすることです。
ローレベルにすると逆バイアスされるからです。
絶対最大定格です。逆バイアス許容値は0.3V、これは低いですねぇ。

Arduinoでポートをフローティングにするには
pinMode(N , INPUT)
とします、Nはポート番号です。
ここでは2つのLMT01をつないで見ましたが、プログラムとしては
2つのポートをフローティングにしておく。
1つのポートを出力モードにしてHレベルを出力する、これで計測が開始されます。
温度測定が終わったらポートをフローティングにする。
他のポートも同様にして測定する。
の繰り返し。
とりあえずのスケッチです。
実験なのでパルス数も表示してます。

注意すべき点は使わないLMT01のVPはローレベルにするのではなくフローティングにすることです。
ローレベルにすると逆バイアスされるからです。
絶対最大定格です。逆バイアス許容値は0.3V、これは低いですねぇ。

Arduinoでポートをフローティングにするには
pinMode(N , INPUT)
とします、Nはポート番号です。
ここでは2つのLMT01をつないで見ましたが、プログラムとしては
2つのポートをフローティングにしておく。
1つのポートを出力モードにしてHレベルを出力する、これで計測が開始されます。
温度測定が終わったらポートをフローティングにする。
他のポートも同様にして測定する。
の繰り返し。
とりあえずのスケッチです。
実験なのでパルス数も表示してます。
// LMT01をArduinoにつなぐ
// edy
//
// 2016/02/13:内部コンパレータを使う
// 2016/02/14:内部基準電圧を使う
// 2016/02/16:2つのLMT01を使う
//
//参考にしたサイト:コンパレータ割り込み minori246さん
//http://minori246.blog.fc2.com/blog-entry-15.html
//
//参考にしたサイト:パルス列終了検出 ラジオペンチさん
//http://radiopench.blog96.fc2.com/blog-entry-640.html
//
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) //clear
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) //set
#endif
#include <LiquidCrystal.h>
LiquidCrystal lcd(4, 3, 8, 9, 10, 11); //LiquidCrystal(rs, enable, d4, d5, d6, d7)
volatile unsigned int count = 0;
unsigned int LASTcount = 0;
char s[16];
float temp;
void setup()
{
pinMode(5, INPUT);
pinMode(6, INPUT);
lcd.begin(16, 2);
initComp();
lcd.setCursor(0, 0);
lcd.print("Start LMT01");
delay(1000);
lcd.setCursor(0, 0);
lcd.print(" ");
}
void loop()
{
pinMode(5, OUTPUT);
digitalWrite(5, 1); // D5をオンにしてLMT01-no.1をスタート
delay(1);
countpulse();
dtostrf(count, 6, 0, s); // パルス数表示
lcd.setCursor(0, 0) ;
lcd.print(s) ;
temp = count / 16.0 - 50.0; // 温度表示
dtostrf(temp, 6, 1, s);
lcd.setCursor(0, 1) ;
lcd.print(s) ;
lcd.print("c") ;
pinMode(5, INPUT); // D5をオフ(フロート状態)にしてLMT01-no.1をストップ
delay(1);
pinMode(6, OUTPUT);
digitalWrite(6, 1); // D6をオンにしてLMT01-no.2をスタート
delay(1);
countpulse();
dtostrf(count, 6, 0, s); // パルス数表示
lcd.setCursor(8, 0) ;
lcd.print(s) ;
temp = count / 16.0 - 50.0; // 温度表示
dtostrf(temp, 6, 1, s);
lcd.setCursor(8, 1) ;
lcd.print(s) ;
lcd.print("c") ;
pinMode(6, INPUT); // D6をオフ(フロート状態)にしてLMT01-no.2をストップ
delay(1);
}
void initComp()
{
cbi(ACSR, ACD); // Analog Comparator Disable : コンパレータを使う設定にする
sbi(ACSR, ACBG); // Analog Comparator Bandgap Select : 内部基準電圧(1.1V)を使う設定にする
sbi(ACSR, ACIE); // Analog Comparator Interrupt Enable : コンパレータ割り込みを許可する
cbi(ACSR, ACIC); // Analog Comparator Input Capture Enable
sbi(ACSR, ACIS1); // Analog Comparator Interrupt Mode Select1 : コンパレータの立下りで割り込み設定
cbi(ACSR, ACIS0); // Analog Comparator Interrupt Mode Select0 : コンパレータの立下りで割り込み設定
sbi(PRR, PRADC); // オリジナルではcbi(PRR0, PRADC);だったがエラーになった。
cbi(ADCSRB, ACME); //Analog Comparator Multiplexer Enable : コンパレータ反転入力をAIN1にする
}
void countpulse()
{
count = 0;
LASTcount = 0;
while (count == 0) {}
if (count != 0) {
// カウンタがゼロではない場合、つまりカウント中なら
while (count != LASTcount) { // もし数値が変わっていたらまだ測定中なので以下を繰り返す
LASTcount = count; // 次回の比較用に値を保存
delay(1); // ちょっと待つ
}
}
}
ISR(ANALOG_COMP_vect) {
count++;
}
- 関連記事
-
- 2端子温度センサLMT01を試す(13) (2016/03/06)
- 2端子温度センサLMT01を試す(12)延長してみると・・・。 (2016/02/22)
- 2端子温度センサLMT01を試す(11)電源投入時の始動電流 (2016/02/20)
- 2端子温度センサLMT01を試す(10)多チャンネル化・続き (2016/02/18)
- 2端子温度センサLMT01を試す(9)多チャンネル化 (2016/02/16)
- 2端子温度センサLMT01を試す(8)Arduinoとの接続・最終編(多分) (2016/02/14)
- 2端子温度センサLMT01を試す(7)Arduinoとの接続・内臓コンパレータを使う (2016/02/13)
スポンサーサイト
コメント
コメントの投稿
トラックバック
この記事へのトラックバックURL
http://edycube.blog2.fc2.com/tb.php/872-105f52b3