アナログデジタルコンバータMCP3425の使い方

mcp3425 アナログデジタル変換 プログラミング

アナログデジタルコンバータMCP3425を使ってアナログからデジタル変換し、データを読み取る方法を紹介します。

使用するマイコンはRaspberry Pi、プログラム言語はPythonです。サンプルプログラムは、デジタルデータの読み取りだけでなく設定も行っています。

MCP3425の主な仕様と特長は以下の通りです。

仕様
入力数:1チャンネル
分解能:16ビット
変換方式:ΔΣ変換
電源:単一電源
入力:差動

特長
低ノイズ
高精度基準電圧内蔵

準備

MCP3425の購入

MCP3425は6端子のSOT-23と呼ばれる形状です。
MCP3425単体もしくはモジュールのどちらも購入出来ます。はんだ付けに自信がない人はモジュールの購入をお勧めします。

下の写真は秋月電子通商で購入したMCP3425モジュールです。今回は、このモジュールを使用してデータを読み込むサンプルプログラムを紹介します。

MCP3425 モジュール写真

MCP3425モジュールとRaspberry Piの接続

接続図

ブレッドボードを使用したMCP3425モジュールとRaspberryPiの接続【I2C】

ADのデジタル出力データ

アナログ信号(電圧)の入力ピンがVIN+とVIN-の2つあり、この2つの電圧の差(差動入力)をデジタル変換します。VIN-をGNDに接続してシングルエンドとして使用する事も出来ます。
以下の①~④の様に接続したときの大体のデジタル出力値を示します。

接続方法 ADのデジタル出力データ
VIN+とVIN-を接続して同じ電圧を入力 約0

VIN+を+1.65Vに接続。VIN-をGNDに接続

約+26400

VIN+を+2.2Vに接続。VIN-を+1.1Vに接続 約+17600
VIN+を+1.1Vに接続。VIN-を+2.2Vに接続 約-17600

※VIN+とVIN-のアナログ電圧の差が+2.048V(内部基準電圧)の時に、32768(16bit設定)のデジタルデータをを出力します。 VIN+とVIN-を入れ替えると-32767のデジタルデータを出力します。

①ADのデジタル出力 約 0

差動入力回路【AD出力 0 count】

②ADのデジタル出力 約+26400
(シングルエンド入力)

差動入力回路【AD出力 26400 count】

③ADのデジタル出力 約+17600

差動入力回路【AD出力 +17600 count】

④ADのデジタル出力 約-17600

差動入力回路【AD出力 -17600 count】

Raspberry Piの通信設定とPythonの操作方法

Raspberry PiのI2C通信設定を有効にします。
下の記事でRaspberry Piの通信設定と、Pythonの基本操作を説明しています。

I2C通信プログラミング

プログラムコード

Pythonプログラムです。

import smbus
import time

#I2C設定
i2c = smbus.SMBus(1)
address = 0x68

#MCP3425設定
ret = i2c.write_byte(address, 0x98)
           
#繰り返し
while True:
    
    #データ読み込み
    dat = i2c.read_i2c_block_data(address, 0x98, 0x02)
    
    #データ変換
    count = dat[0] << 8 | dat[1]
    
    #極性判断
    if count >= 32768:
        count -= 65536
    
    #表示    
    print('count:' + str(count))
    
    #一時停止
    time.sleep(0.1)

プログラムの説明

プログラムの流れです。

  1. I2C通信の設定
  2. MCP3425の設定
  3. MCP3425からデータを取得
  4. 取得したデータの極性を判断して画面に表示
  5. 3.~4.を繰り返します

1.I2C通信の設定

#I2C設定
i2c = smbus.SMBus(1)
address = 0x68

i2c = smbus.SMBus(1)
インスタンス生成です。使用するBus1を指定します。

address = 0x68
アドレス指定です。MCP3425のアドレスは0x68(16進数)で、通信時に指定します。

Raspberry PiにMCP3425を接続した状態で、LXTerminalから「i2cdetect -y 1」コマンドを入力すると、アドレスが0x68であることを確認出来ます。

2.MCP3425の設定

#MCP3425設定
ret = i2c.write_byte(address, 0x98)

i2c.write_byte(address, 0x98)

0x98(CONFIGRATIONレジスタ)

設定内容
G1-G0:ゲイン(00:1V/V)
S1-S0:サンプルレート(10:15SPS)
/O/C:コンバージョンモード(1:連続)
C0-C1:チャンネル(00:未使用)
/RDY:ワンショット(1:無効)

データシートの『5.2 Configration Register』で詳細を確認できます。

/RDY C1 C0 /O/C S1 S0 G1 G0
G1-G0:PGA Gain Selector Bits
00 1V/V
01 2V/V
10 4V/V
11 8V/V
S1-S0:Sample Rate Selection Bit
00 240SPS(12bits)
01 60SPS(14bits)
10 15SPS(16bits)

3.MCP3425からデータを取得

#データ読み込み
dat = i2c.read_i2c_block_data(address, 0x00, 0x02)

dat = i2c.read_i2c_block_data(address, 0x00, 0x02)

0x00:ダミー
0x02:読み込むバイト数

データシートの『5.0 MCP3425デバイスの使用方法』で詳細を確認できます。

#データ変換
count = dat[0] << 8 | dat[1]

count = dat[0] << 8 | dat[1]
データは8bitの入れ物2つに入っています。これを16bitにします。

16bitデータ
#極性判断
if count >= 32768:
    count -= 65536

if(out_x >= 32768):
out_x = out_x – 65536

2の補数表現を符号ありに変換します。

16bitデータ 符号なし 符号あり
1000000000000000 32768 -32768
1000000000000001 32769 -32767
1111111111111110 65534 -2
1111111111111111 65535 -1
0000000000000000 0 0
0000000000000001 1 1
0000000000000010 2 2
0111111111111110 32766 32766
0111111111111111 32767 32767

2の補数の詳しい説明はこちら
2の補数」(2021年10月12日 (火) 17:00 UTCの版)『ウィキペディア日本語版』

#表示    
print('count:' + str(count))

print(‘count:’ + str(count))
ADのカウント値を画面に表示します。

5.3.~4.を繰り返します。

#繰り返し
while True:

while True:
Stopボタンが押されるまで繰り返します。

※この『while True:』は、12行目のwhile文です。

プログラムの実行結果

プログラムを実行します。

①Runボタンを押します。
②ADデータを0.1秒間隔で画面に表示します。
③Stopボタンを押すとプログラムは終了します。

PythonのRunボタンとStopボタン
MCP3425のプログラムの実行結果

以上、MCP3425を使用してADのカウント値を画面に表示するサンプルでした。

まとめ

MSP3425からデジタル変換したデータを受け取るサンプルプログラムの解説をしました。
如何でしたでしょうか。

センサーだけでなく電圧信号をデジタルに変換して可視化できるようになるので、いろいろと使える機会が増えてくると思います。

プログラミングやソフトウェアの記事です。

コメント