ラズパイでアナログ電圧を扱う (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の結果もほとんど同じでした。