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

 Spresenseでは、Arduino UNOを用いた記事 A-Dコンバータ その8 24ビットSPI ADS1220 と同じハード、同じスケッチで白金抵抗体を使った温度測定ができます。電源は3.3Vで動作させています。

 ここではADS1220のライブラリを使わず、SPIのライブラリを使ってスケッチを記述します。

接続

 Spresenseボードは3.3Vで利用します。A-DコンバータADS1220の電源は、ローノイズ・タイプのTPS7A4700を3.3V出力設定で利用しました。

スケッチ

 SPIライブラリではチップ・セレクト信号のSSは任意のディジタル出力ポートに割り当てて使います。ここでは7番ピンにしました。ADS1220はデータが用意できたときにDRDY信号で外部に知らせますが、読み取りのデータを送るとDRDY信号が変化するタイミングを利用して、変換データを受け取ります。ADS1220のデータシートにあるSCLKとデータのタイミングから、読み取りはMode1を選択しました。

#include <SPI.h>
#define SS 7 // D13 SCLK , D12 MISO , D11 MOSI

SPISettings settings(1000000,MSBFIRST,SPI_MODE1);

void setup() {
Serial.begin(9600);
pinMode(SS, OUTPUT);
// digitalWrite(SS, HIGH);
SPI.begin();
// need Reset?
sendCommand(0x40,0x66);
sendCommand(0x44,0x04);
sendCommand(0x48,0x55);
sendCommand(0x4c,0x80);
}

void sendCommand(byte address, byte value) {
SPI.beginTransaction(settings);
digitalWrite(SS, LOW);
delay(2);
SPI.transfer(address);SPI.transfer(value);
digitalWrite(SS, HIGH);
SPI.endTransaction();
}

void loop() {
SPI.beginTransaction(settings);
digitalWrite(SS, LOW);
SPI.transfer(0x10); // dummy read , DRDY HIGH Figure64
byte highByte = SPI.transfer(0xff); // dummy
byte midByte = SPI.transfer(0xff); // dummy
byte lowByte = SPI.transfer(0xff); // dummy
digitalWrite(SS, HIGH);
SPI.endTransaction();
long adc_data = (highByte << 16 ) + (midByte << 8) + lowByte;
float volt =(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);
}

 初期設定時に四つのレジスタの設定内容、電圧のデータを読み取ってから温度に変換する部分は、ラズパイの記事を参照してください。

 (※)Arduino UNOのSPIライブラリはラズパイのspidevライブラリと異なり、チップ・セレクト信号SSは、ユーザが制御します。スレーブ・デバイスはSSがHIGHからLOWになった時点で動作を開始するので、上記のスケッチでははじめてのSPI転送時に、SSがHIGHである保証がないので失敗しそうですが、正常に動いています。

 (※)SpresenseのSPIライブラリではSS信号はD10を前提としています。上記の7番ピンへの接続ではなく10番ピンへチップ・セレクト信号を配線すれば、7番ピンの設定は不要と思われますが、確認していません。

 (※)byteデータを8もしくは16シフトすると内容が0になるように思えたのですが、上記のadc_dataを求める式では正しく上位に8ビット分がシフトしているようです。adc_dataは参考にしたサンプルでlongとなっていましたが、intでも正しい結果が計算できます。

 実行結果です。途中でセンサを指でつまんでいます。反応は速いです。

前へ

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

次へ

ディジタル・ポテンショメータ (1) MCP4012