A-Dコンバータ その8 24ビットSPI ADS1220

 アナログをディジタルに変換するA-Dコンバータは、ビット数が増えるほど、アナログ値の分解能が上がります。しかし、ノイズや温度変化の影響を受けるために、24ビットのA-Dコンバータを使っても18~21ビット程度の確度のデータしか得られません。IC自体が24ビットのディジタル値を出力するとしても、製品によって異なりますが、20ビットや22ビットまでのデータしか保証されていません。
 特に、電子工作ではブレッドボードを利用するので、安定に動作させるための広い面積のグラウンドが用意できないので状況は最悪です。

 この問題の多い状況を克服するには、デバイス選びと実装に工夫が必要です。

  • 温度変化に対して安定な基準電圧源を使う
  • アナログ・グラウンドとディジタル・グラウンドを分離する
  • 電源はローノイズであること
  • 電源変動などに強い回路構成にする
  • 50/60Hzのノイズ除去回路を併用する
  • プリント基板を使って実装する

 ここでは、次のスペックをもつADS1220を利用します。

ADS1220のおもなスペック

  • 動作電圧 2.853~5.5V
  • 分解能 24ビット
  • 入力 シングルエンド;4チャネル。差動;2チャネル。レファレンス入力が2チャネル。
  • 電流源 二つ、プログラマブル
  • 基準電圧源 内蔵、外部可
  • インターフェース SPI+DRDY
  • アンプ PGA(最大128倍)
  • サンプリング・レート 最大2000SPS

接続

 SPIのほかに、データが用意されたことを示すDRDY信号も利用します。設定の前には、四つのレジスタを設定します。次の記事を参照してください。

 電源はArduino UNOの5Vからローノイズ電源IC TPS7A4700で3.3Vを得ています。アナログ電源とディジタル電源は小さなL(100uH)で分離し、グラウンドは別々に配線しました。

 温度センサは、100Ωの白金薄膜温度センサSDT101BXN100DFを利用します。データシートで解説されている3線式の配線をベースに4線式に対応するように修正し、レジスタの内容もそれに合わせて設定します。

 基準電圧源は内蔵を利用します。レジスタの設定(reg02)では、50/60Hzのノイズ除去回路を有効にします。

 抵抗値を測るため、RTD(Resistance Temperature Detector)に電流を流します。これは内蔵の電流源(IDAC1)からAin3端子を通して500uAを供給します。

 ADS1220の電源電圧は最大5.5Vです。上記の回路では3.3Vで動作しています。このときのロジックHIGHの出力電圧は2.3~3.3Vです。Arduinoのロジック信号は5V電源電圧時に1.98V以上がHIGHと認識されます。したがって、データのやりとりは正常です。ADS1220のロジック入力の最大値はVddなので、3.3Vです。しかし、Arduinoから5Vのロジック・レベルの信号が送られてくるので、上限を超えています。本来ならレベル変換回路を入れるべきです。ロジックの信号レベルはADS1220の最大動作電圧以内に収まっていはいますが、保証はされていません。ロジック端子が5Vになった瞬間、回路がtolerantになっていなければ、電源が5Vに上がります。したがって、信号がArduinoから送られてくるたびに電源電圧が変動するという大変なノイジーな環境での動作になります。実験程度の短時間であれば動作するでしょうが推奨される使い方ではありません。ラズパイで動作させた回路をそのまま流用したので、イレギュラな構成になってしまいました。

 もちろん、5->3.3Vのレギュレータを通さずにADS1220を5Vで動作させれば、電圧の問題はありません。レギュレータは電源のノイズを減少させるために利用しています。したがって、ノイズの少ない5Vを別途用意してADS1220の電源として使うのがベターな使い方です。

 

ADS1220のライブラリの導入

 SPIライブラリを利用するだけでも通信できますが、ADS1220のライブラリがあるので利用します。

  https://github.com/Protocentral/Protocentral_ADS1220

の右上にあるClone or downloadボタンを押してDownload ZIPをクリックします。

 Arduino IDEのメイン・メニューのスケッチから、ライブラリをインクルード-.ZIP形式のライブラリをインストール...を選びます。

 エクスプローラ画面から、ダウンロード・フォルダに入っているProtocentral_ADS1220-master.zipを選択します。ライブラリとサンプル・スケッチがインストールされました。

 ドキュメント-Arduino-libraries-Protocentral_ADS1220-masterライブラリにあるProtocentral_ADS1220.cppでは、四つのレジスタをスケッチからほぼ変更できない記述だったので、こちらの設定を直接書き込みました。修正したのはm_config_reg0、m_config_reg2、m_config_reg3の三つです。

スケッチ

 サンプルのADS1220_Stream.inoをベースにスケッチを修正します。使用したArduino IDEは1.8.5で、執筆時点では1.8.6がリリースされています。電圧から温度への変換は、こちらの記事を参照してください。

// Author: Ashwin Whitchurch Copyright (c) 2018 ProtoCentral
#include "Protocentral_ADS1220.h"
#include <SPI.h>

#define PGA 1 // Programmable Gain = 1
#define VREF 2.048 // Internal reference of 2.048V
#define ADS1220_CS_PIN 7
#define ADS1220_DRDY_PIN 6

Protocentral_ADS1220 pc_ads1220;

void setup()
{
Serial.begin(9600);
pc_ads1220.begin(ADS1220_CS_PIN,ADS1220_DRDY_PIN);
pc_ads1220.set_data_rate(DR_330SPS);
pc_ads1220.set_pga_gain(PGA_GAIN_8);
pc_ads1220.select_mux_channels(MUX_AIN0_AIN1); //Configure for differential measurement between AIN0 and AIN1
pc_ads1220.Start_Conv(); //Start continuous conversion mode
}

void loop()
{
int32_t adc_data=pc_ads1220.Read_WaitForData();
float volt = -1 * (adc_data*2*1.652855 ) /8 /16777216 ;
float R = volt/0.0005 ;
float temp = 0.0014*R*R + 2.5323*R -267.23 ;
delay(1000);
Serial.print(volt*1000,5);Serial.print("mV Temp= ");Serial.println(temp);
}

 実行結果です。最初に表示される四つのコンフィギュレーション・レジスタの内容の表示は、ライブラリのProtocentral_ADS1220.cppが出力しています。1回目のデータは正しくないです。電圧の表示桁数は有効桁を考慮していません。

 SPIインターフェースのA-Dコンバータは変換速度が高速な場合が多いです。10回ぐらいの測定値を平均することで、分解能を高められます。

 本実験はセンサもブレッドボード上に配線しているので、4線式の測定回路のメリットはありません。センサまでのケーブルを伸ばしたり、それぞれのケーブル長が異なったりしても、安定な測定が望める回路です。

前へ

SpresenseでLチカから始める (7) ハイレゾの再生

次へ

SpresenseでLチカから始める (8) SPIライブラリ ADS1220