5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (35) A-Dコンバータの利用10 I2C ADS1110

小型基準電源内蔵16ビット

 ADS1110は小さなパッケージに入っているので、実装するときに面積が少なくて済みます。基準電圧も電源からではなく内蔵されているので、単独で高い分解能が得られます。

 ボード化されたADS1110は、ebayで購入しました(執筆時400円)。Digi-KeyでICは約500円です。

 

ADS1110のスペック

  •  ビット数;16
  •  チャネル数;1
  •  基準電圧;2.048V ±0.05%、ドリフト5ppm/℃
  •  電源電圧; 2.7~5.5V
  •  消費電流;240µA
  •  入力;差動、シングルエンド
  •  変換方式;ΔΣ型
  •  データ・レート;15SPS(16ビット)
  •  インターフェース;I2C
  •  I2C転送速度;最大3.4MHz
  •  スレーブ・アドレス;発注時に指定できる。表面にED0の印字は0x48
  •  プログラマブル・ゲイン・アンプ;1/2/4/8倍が設定できる

接続

 プルアップ抵抗10kΩがSDA/SCLに入っているので、取り去ります。次のように接続しました。シングルエンドの入力時はVin-をGNDに接続し、Vin+から入力します。

ADS1110 ラズパイ
SDA 3番ピン
SCL 5番ピン
GND 6番ピン
Vcc 1番ピン 3.3V
Vin- -
Vin+ -

 i2cdetect -y 1 で接続を確認しました。スレーブ・アドレスは0x48です。

レジスタ

◆設定レジスタ デフォルト b10001100

 b7 b6  b5  b4  b3  b2  b1   b0
 ST/DRDY  0 SC  DR1  DR0   PGA1 PGA0 
SC=0は連続変換、'1'は1回のみの変換。
DR1,DR0はサンプリング・レート。デフォルト15SPSで16ビット。
PGA1,PGA0はアンプの増幅度。'00'=×1、'01'=×2、'10'=×4、'11'=×8。

◆出力レジスタ

 最上位ビットD15は符号です。

 b15 b14 b13  b12  b11  b10  b9  b8 
 D15 D14  D13  D12  D11  D10  D9  D8 

 b7 b6 b5  b4  b3  b2  b1  b0 
 D7 D6  D5  D4  D3  D2  D1  D0 

プログラム

 ディファレンシャル入力、PGAアンプは×1の測定です。

#!/usr/bin/env python
import smbus
import time i2c = smbus.SMBus(1)
addr=0x48
Vref=2.048
config = 0b10001100
 
i2c.write_byte(addr, config)
def sign16(x):
        return ( -(x & 0b1000000000000000) | (x & 0b0111111111111111) )
#main while 1:         data = i2c.read_i2c_block_data(addr,config,2)         data16 = (data[0]<<8 | data[1])         dataDiff = sign16(int(hex(data16),16))         print (round((Vref * dataDiff / 32767),5))         time.sleep(1)

 実行結果です。電池式電圧発生器で設定しています。

DMMの読み[V] 表示値[V]
-0.60572 -0.60814
0.60572 0.60827
1.2899 1.29316
2.02784 2.03119

 シングルエンドです。

DMMの読み[V] 表示値[V]
0.56647 0.56652
1.50133 1.5018
2.02952 2.02975

 

  PGAを8倍(config = 0b10001111)、4倍(config = 0b10001110)の増幅に変更します。電圧は0.0930Vを設定、ディファレンシャル入力です。測定結果は、8倍は0.71533V、4倍は0.35932Vでした。

 測定時の室温は18℃でした。

※当初、電圧発生器に据え置き型のアドバンテストTR6142を利用していました。ディファレンシャル入力では、設定した電圧に比べて2%程度の誤差が出ました。シングルエンドでは約1%です。測定中に指でボードを抑えると、電圧誤差はだんだん少なくなり、約1%までに収まりました。このようなバラックで組み立てた状態だと、確認をしていませんが、AC100Vの誘導の影響を受けているのかもしれません。

※執筆時点;2017-11-29版をダウンロードし、sudo apt-get update と sudo apt-get upgrade -y および sudo rpi-update で更新し、カーネルは、uname -a で確認。4.9.67でした。

※プログラムを仮にads1110.pyと/home/piに保存すると、sudo chmod 755 ads1110.py で実行権を付け、ターミナルから、python ads1110.pyで実行します。I2CやSPIのグループにpiユーザが属しているので、sudoは不要です。
 プログラム・リストは、表示の関係でTabキーが無視されるので、スペースに代えてあります。また、リスト中を2回クリックすると全選択になるので、CTRL-Cでコピーし、テキスト・エディタにCTRL-Vで貼り付けて利用してください。ラズパイに持っていくと、リターン・コードなどが化けていることがあるので、一度消して、ラズパイのテキスト・エディタで改行してください。

※I2Cの有効化は、この説明を参照ください。1-Wireと同じく、I2CやSPIもEnableにチェックを入れています。

※DMMはケースレー2000を使いました。