ラズパイでアナログ電圧を扱う (6) MCP3208のプログラム②

 spidevライブラリを使った12ビットA-DコンバータMCP3208のプログラムが完成しました。ラズパイ3で動かしています。OSは2019/7/20版のRaspbian Busterです。実際に測定してみます。

 電圧発生器は2種類を用意します。シングルエンド入力用にTR6142を、差動入力用には、電池を電源にしたTL431の出力です。電圧の測定はKeitley 2000です。いずれも電源を入れて30分以上経過している状態です。

シングルエンド入力

 TR6142で「1.0000V」を発生し、Keitley 2000で読み取った電圧は1.00005Vでした。

 チャネル0のシングルエンド・アナログ入力のプログラムです。Vrefの電圧は2.50728Vだったので、プログラムにその値を記入します。

import spidev
import time

Vref = 2.50728

spi = spidev.SpiDev()
spi.open(0,0) #bus 0,cs 0
spi.max_speed_hz = 1000000 # 1MHz

while 1:
adc = spi.xfer2([0x06,0x00,0x00])
data = ((adc[1] & 0x0f) << 8) | adc[2]
print(str(Vref*data/4096) + "V")

time.sleep(1)

spi.close()


(2020/05/09)4095は間違いなので、4096に変更した。上記のスケッチも修正したが、実行結果は変更していない

 実行結果です。最頻値は1.002912Vでした。誤差は、

  (1.002912 - 1.0000) / 1.0000 = 0.29%

 1LSBは0.61mVなので、5LSBぐらいずれています。

 チャネルを変更して動かしました。表示された値はいずれもチャネル0と同じ範囲の電圧でした。

チャネル 1st byte 2nd byte 3rd byte
0 0x06 0x00 0x00
1 0x06 0x40 0x00
2 0x06 0x80 0x00
3 0x06 0xc0 0x00

疑似差動入力

 実験用TL431電源の出力をKeitley 2000で読み取った電圧は2.49223Vでした。設定した疑似差動入力の配線は、下記の2種類の入力です。

ch4=in+,ch5=in-  [0x05,0x00,0x00]
ch6=in+,ch7=in-  [0x05,0x80,0x00]

 ch4-ch5入力に設定したときの実行結果です。表示された最頻値は2.4968712674Vでした。誤差は、

  (2.4968712674 - 2.49223) / 2.49223 = 0.19%

なので、シングルエンドの0.29%よりも少なくなりました。ch6-ch7の結果もほとんど同じでした。