A/Dコンバータ ADS1015(I2C)を利用しA/D変換を行う

〔マイコン使用による電子部品の使い方に戻る〕


前の記事でMCP3208を使いA/D変換の話は書きました、これは12ビットで8チャンネル入力のSPI接続でした。
今度はADS1015を使った記事で、12ビットで4チャンネル入力のI2C接続A/Dコンバータです。

ADS1015の特徴は、入力にアンプを内蔵しているのでゲイン選択が出来ます、
又、閾値を用いたアラート出力が可能となっています。

でぇ、結構使い勝手が良さげぇ何ですがぁ、ちょっとぉお値段がぁお高めなんですよねぇ....
ADS1015モジュールはこちらの秋月通商で購入しています。 データシートはこちらからどうぞ。
PS. *1)
2020/03/04現在、上記モジュール(Adafruit)は秋月通商では販売されていません、
代わりにこちらのモジュールがお安く(540円)なって販売されています、ピンの配置は同じです。
Adafruitのモジュールが良いならスイッチサイエンスで販売しているようです。

《レジスタについて》

レジスタは全部で4個有り2バイト(16ビット)単位のアクセスとなり、
通信はHIGHバイトLOWバイトの順番に送受信を行います。

Conversion register:address=0x00
 アナログ値を変換した結果が格納されるレジスタです。
 下図の様に頭詰めでセットされます。

ビット 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
名前 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0

Config register:address=0x01
 デバイスが動作する為の情報を設定するレジスタです。

ビット 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
名前 OS MUX PGA MODE DR CMODE CPOL CLAT CQUE
 OS: シングル・ショット変換の開始指示ビット
     変換指示を行う場合は"1"をセットする、だがこのビットを読み出す場合は意味が異なります。
     1=変換の準備が出来た(準備完了はALERT/RDYピンに出力も可能)
     0=変換の実行中

 MUX: 入力するチャンネルの切り換え指示ビット
      (差動入力)                 (シングル・エンド)
      000 : AINP = AIN0 and AINN = AIN1  100 : AINP = AIN0 and AINN = GND
      001 : AINP = AIN0 and AINN = AIN3  101 : AINP = AIN1 and AINN = GND
      010 : AINP = AIN1 and AINN = AIN3  110 : AINP = AIN2 and AINN = GND
      011 : AINP = AIN2 and AINN = AIN3  111 : AINP = AIN3 and AINN = GND
      デフォルトは"000"です。

 PGA: 入力アンプのゲインを選択するビット
      000 : FS = ±6.144V(2/3倍)  100 : FS = ±0.512V(8倍)
      001 : FS = ±4.096V(1倍)   101 : FS = ±0.256V(16倍)
      010 : FS = ±2.048V(2倍)   110 : FS = ±0.256V(16倍)
      011 : FS = ±1.024V(4倍)   111 : FS = ±0.256V(16倍)
      デフォルトは"010"です。 FS=フルスケール
      0-6.144Vならカウント値(0〜2047)となり、±1.024V(-2047〜0〜2047)です。

 MODE: デバイスの変換動作を選択するビット
       0=連続で変換するモード
       1=1回変換したらパワーダウンに移行するシングル・ショットモード(デフォルト)

 DR: 変換時のデータレートを選択するビット
     変換には0.3ms掛かります、残った時間は低省電力モードに移行します。
     000 : 128SPS  100 : 1600SPS
     001 : 250SPS  101 : 2400SPS
     010 : 490SPS  110 : 3300SPS
     011 : 920SPS  111 : 3300SPS
     デフォルトは"100"です。 SPS=samples per second(秒あたりのサンプル)

 CMODE: 閾値と変換値を比較するモードを選択するビット
        0=ヒステリシス付きの伝統的なコンパレータモード(デフォルト)
         H閾値越えでONして、L閾値を下回ったらOFFにALERT/RDYピンが出力されます。
        1=ウインドウコンパレータモード
         L閾値からH閾値の範囲を外れたらONします。

 CPOL: ALERT/RDYピンの出力極性を選択するビット
       0=アクティブLOW(デフォルト)  1=アクティブHIGH

 CLAT: ALERT/RDYピンの出力をラッチするか否かの有無を選択するビット
       ラッチする場合は、出力がONしたら解除するまでON状態です、解除はデータを読出すか、
       "SMBus ALERT Response"の特別なI2C電文を送ります。
       0=ラッチしない(デフォルト)  1=ラッチする

 CQUE: 閾値データの使い方を指示するビット
       11 : 閾値データは使わない(コンパレータOFF/ALERTピン出力無)(デフォルト)
       00 : 閾値を比較した結果、1回ONしたらALERTピンを出力する(毎回出力)
       01 : 閾値を比較した結果、2回ONしたらALERTピンを出力する(2回カウント後に出力)
       10 : 閾値を比較した結果、4回ONしたらALERTピンを出力する(4回カウント後に出力)

Lo_thresh register:address=0x02
 LOW側の閾値を設定するレジスタです。(デフォルト値は0x8000)

ビット 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
名前 L11 L10 L9 L8 L7 L6 L5 L4 L3 L2 L1 L0 0 0 0 0

Hi_thresh register:address=0x03
 HIGH側の閾値を設定するレジスタです。(デフォルト値は0x7FFF)

ビット 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
名前 H11 H10 H9 H8 H7 H6 H5 H4 H3 H2 H1 H0 1 1 1 1

※ Hi_threshのMSBを"1"にし、Lo_threshのMSBを"0"にしたらALERT/RDYピンにシングル・ショットの
   変換準備完了を出力出来るらしいが、このページでは連続変換モードしか対応していません。

《配線図》

実態配線図  このADS1015モジュールは、フェライトビーズが
 取付けて有るのでノイズ対策も考慮されている
 見たいですね。 (゚∇^d)goodジョブぅ

 "SCL","SDA","ALRT"のピンには10KΩ抵抗で
 プルアップが取付けて有ります、"ADDR"ピンは
 10KΩ抵抗でプルダウンされています。

 このモジュールの電源は2-5.5Vで、左は5Vでの
 実験ですが、Arduino ZERO(M0) PROで3.3Vの
 実験も行っています。

 半固定抵抗を"A1"ピン(1チャンネル)に配線
 しています。

ADDRピンについて

ADDRピンを下表の様に繋ぐ事によりスレーブアドレスを4個から選択出来ます。
尚、10KでGNDに配線して有るので何処にも繋が無い場合は0x48。(上図は繋いでいない)
ADDRピン アドレス
GND 0x48
VDD 0x49
SDA 0x4A
SCL 0x4B

《ダウンロードスケッチ》

↓ここからArduino用サンプルスケッチファイルをダウンロードして下さい。
skADS101x.zip(2016/01/30)

解凍すると下の様に展開されます。
[skADS101x]─┬─[examples]───[analogRead]----- analogRead.ino
       ├ skADS101x.cpp
       ├ skADS101x.h
       └ keywords.txt
ライブラリの登録方法は、ここのページの登録方法1を参照してインストールしましょう。

analogRead.ino  ・・・・・・本体のサンプルスケッチ
skADS101x.cpp ・・・・・・ADコンバータ(ADS1015)関数ライブラリソース
skADS101x.h ・・・・・・・・ヘッダファイル
keywords.txt ・・・・・・・・キーワードファイル

analogRead.ino

analogRead.inoを開くには、
IDEを起動して、メニューバーの「ファイル」→「スケッチの例」→「skADS101x」→[analogRead]
をクリック操作すればファイルが開かれます。
次に、IDEツールバーの「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを行います。

このサンプルは、ADS1015のチャンネル1に繋いだ半固定抵抗の値をIDEの[シリアルモニター]に
表示させる物です。

skADS101x.h

ADコンバータ(ADS1015)関数のヘッダファイルです。
関数ライブラリを利用する場合は、メニューバーの「スケッチ」→「ライブラリを使用」→「skADS101x」を
クリック操作すれば、"#include <skADS101x.h>"がスケッチに追加されます。
まぁ、手動でキー入力しても良いんですけどね。

skADS101x.cpp

まず利用する場合は下記2行をスケッチの最初に記述します。
#include <Wire.h>
#include <skADS101x.h>

setup( )関数内で下の様にI2Cを使用する為の初期化処理を記述します。
Wire.begin() ;   // マスターとする

※ センサのI2C通信速度は400KHz(Hs mode=3.4MHz)までの様ですがArduinoは100KHzで初期化
  されます。
※ このライブラリは、"Arduino UNO"と"Arduino ZERO(M0) PRO"で確認を行っています。

ADコンバータ(ADS1015)関数の使い方を説明します。

skADS101x
 ADコンバータ(ADS1015)用関数ライブラリを使用する為に必要な宣言(初期化)を行います。
 skADS101x ADS(address) ;
  address :デバイス(スレーブ)のI2Cアドレス(7ビット)を指定します(0x48/0x49/0x4A/0x4B)
 "ADS"の名前は任意に変更可能ですが、"ADC"は使えません。
 例)
 #define ADS1015_ADRS 0x48 // デバイスのアドレス(ADDR=GND)  skADS101x ADS(ADS1015_ADRS) ; 以下はこの宣言例で記述します。
ans = ADS.Init(chan,gain)
 デバイスの初期値設定を行う処理です。
 初期化は、変換動作モードは"連続変換"、サンプリングレートは"1600SPS"、
 ALERT/RDYピンの極性は"アクティブLOW"、ALERT/RDYピンの出力は"ラッチしない"
 閾値の比較方法は"ヒステリシス"、閾値データは利用しない(ALERTは機能させない)

  chan  :アナログ入力を行うチャンネルを指定します(A0=4,A1=5,A2=6,A3=7)
  gain   :ゲインを指定します(2/3倍=0,1倍=1,2倍=2,4倍=3,8倍=4,16倍=5)
  ans    :戻り値   0=正常終了、それ以外はI2C通信エラーです
             1=送ろうとしたデータが送信バッファのサイズを超えた(32バイトMAX)
             2=スレーブ・アドレスを送信し、NACKを受信した
             3=データ・バイトを送信し、NACKを受信した
             4=その他のエラー
             5=データ受信エラー
  例) 
     int ans ;

     // デバイスの初期化(アナログチャンネルはA1、ゲインは1倍)
     ans = ADS.Init(ADS_CHA1,ADS_GAIN_4_096V) ;
     if (ans == 0) Serial.println("Initialization success!") ;
     else {
          Serial.print("Initialization Failed!  ans=") ;
          Serial.println(ans) ;
     }
 ※ シングル・エンド入力のみ実験しています、差動入力は未実験。
   又、連続変換モードのみ対応で、シングル・ショット変換モードは未対応となります。

ans = ADS.Read(chan,*data)
 アナログのデータを読み込む処理です。
 指定したチャンネルが前回読み込んだチャンネルと異なれば新たにチャンネルを設定します。

  chan   :アナログ入力を行うチャンネルを指定します(A0=4,A1=5,A2=6,A3=7)
  *data  :読み込んだデータの格納先を指定します(±2047)
  ans     :戻り値、0=正常終了 それ以外Init( )のans値を参照
  例) 
     int16_t dt ;

     // チャンネル0からアナログ値を読み取る
     ADS.Read(ADS_CHA0,&dt) ;
     // アナログ値を表示する
     Serial.println(dt) ;
ans = ADS.ComparatorON(mode,lat,lo,hi)
 コンパレータ機能の開始処理です。
 閾値の範囲に入ったら毎回ALERT(ALERT/RDYピンの出力)を発行します。
 出力の解除は、modeでの動作によりますが、Read( )関数でデータを呼び出せばすぐ解除されます。

  mode:閾値の比較方法を設定(0=ヒステリシスモード,1=ウィンドウモード)
  lat    :ALERTの出力方法を設定(0=ラッチしない,1=ラッチする)
  lo     :閾値のLOW側を指定します(±2047)
  hi     :閾値のHIGH側を指定します(±2047)
  ans   :戻り値、0=正常終了 それ以外Init( )のans値を参照

  例) 
  #define ALERT_PIN  2  // ALERT/RDYに接続しているピン番号

     // デバイスの初期化(アナログチャンネルはAIN1、ゲインは1倍)
     ans = ADS.Init(ADS_CHA1,ADS_GAIN_4_096V) ;
     // ALERTピンの出力はラッチしない、閾値の比較はヒステリシスで設定する
     ADS.ComparatorON(ADS_CMODE_TRAD,ADS_CLAT_NOLATCH,900,1000) ;

     if (digitalRead(ALERT_PIN) == LOW) Serial.println("指定値を超えました!") ;

《その他》

通常、アドレスピンが1本の場合GND/VDD配線で2種類のアドレス選択だったがぁ、
このICは何と、SDA/SCLにも配線出来4種類から選択可能となっています、
他のメーカさんも真似れば良いのにねぇ。



リンク切れ見直し(*1) 2020/03/04


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.