Raspberry PiでMCP3425を16Bitモードで使う方法 (Python)


Raspberry Piにアナログ入力が無いことに不満を申す筆者です。Arduinoにはありますが性能が10ビット(0~1023)でこれまたなんとも心許ないです。さて、MCP3425では16ビットもの分解能を誇り、I2Cで通信することが可能なので容易に設定を行うことができます。更に、MCP3425はマイナス値も測ることが可能です。ここではI2Cの設定方法は記載しません(ググってみてください)。

1. – MCP3425の構成

はじめにMCP3425の構成を確認する必要がある。

上記画像ではMCP3425の役割とRaspberry Piに接続するための案内図。

MCP3425実図

MCP3425の方向は白い点を観て向きを確認。

電池の電圧計測 (結線図)

実際に結線をして実際に動作しているかを確認コマンドで確認。

$ sudo i2cdetect -y 1

2. – 16Bitモードで計測を開始

PythonでMCP3425を操作する。電圧値が取得&表示されるプログラム。

$ vi mcp3425.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import smbus
import time
bus = smbus.SMBus(1)
bus.write_i2c_block_data(0x68, 0b10001000, [0x00])
time.sleep(1)

data = bus.read_i2c_block_data(0x68, 0x00, 2)
raw  = data[0] << 8 | data[1]

if raw > 32767:
   raw -= 65535
vol = 2.048 / 32767
print str(raw*vol) + " [V]"

2017-02-03 04:02 レイアウトがズレて誤ったプログラムを記述していました。修正済みです。申し訳ございません。WordPressの仕様で勝手に変換されてしまうみたいです。

最後に実行。

$ sudo python mcp3425.py

測定結果は下に載せておきます。

3. – 解説

MCP3425のデータシートを参考にする。

bit 7

RDY:Ready Bit
This bit is the data ready flag. In read mode, this bit indicates if the output register has been updated with a new conversion. In One-Shot Conversion mode, writing this bit to “1” initiates a new conversion.
Reading RDY bit with the read command:
1 = Output register has not been updated.
0 = Output register has been updated with the latest conversion data.
Writing RDY bit with the write command:
Continuous Conversion mode: No effect
One-Shot Conversion mode:
1 = Initiate a new conversion.
0 = No effect.

bit 6-5

C1-C0: Channel Selection Bits
These are the Channel Selection bits, but not used in the MCP3425 device.

bit 4

O/C: Conversion Mode Bit
1 = Continuous Conversion Mode. Once this bit is selected, the device performs data conversions
continuously.
0 = One-Shot Conversion Mode. The device performs a single conversion and enters a low power
standby mode until it receives another write/read command.

bit 3-2

S1-S0: Sample Rate Selection Bit
00 = 240 SPS (12 bits),
01 = 60 SPS (14 bits),
10 = 15 SPS (16 bits)

bit 1-0

G1-G0: PGA Gain Selector Bits
00 = 1 V/V,
01 = 2 V/V,
10 = 4 V/V,
11 = 8 V/V

MICROCHIP社『MCP3425  16-Bit Analog-to-Digital Converter with I2C Interface and On-Board Reference』 14ページより引用

各種説明

各ビットビット説明
Bit 71新しい変換を開始。
0何もせず。
Bit 60チャンネル選択ビットだが、このチップでは使いません。0を選択。
Bit 50チャンネル選択ビットだが、このチップでは使いません。0を選択。
Bit 41連続変換モード。
0ワンショット変換モード。デバイスは1回の変換を実行し、低電力になる。
Bit 3-20012ビットで取得。1秒間に240取得。
0114ビットで取得。1秒間に60取得。
1016ビットで取得。1秒間に15取得。
Bit 1-000ゲイン 1倍。
01ゲイン 2倍。
10ゲイン 4倍。
11ゲイン 8倍。

3.1. – 書き込み設定

これを参考にしてパラメータを設定した。以下のプログラムの一部がそれである。

bus.write_i2c_block_data(0x68, 0b10001000, [0x00])

端から並べていくのだ!Bit 7には新しい変換要求、Bit 6からBit 5は無視して0、Bit 4はワンショットコンバージョンモードの選択、Bit 3からBit 2までがビット指定(12ビットの場合 [00]、14ビットの場合[01]、16ビットの場合[10])、Bit 1からBit 0までがゲイン設定(1倍指定は[00]、2倍指定は[01]、4倍指定は[10]、8倍指定は[11])。これらをつなげる。今回であれば0b10001000という構成になった。ちなみに12ビットにしたければ、0b10000000です。

ちなみに基数の接頭表記法は下記の表に示す。

基数接頭
2進数0b0b110
8進数0o0o310
10進数0d0d209
16進数0x0x1F2
MCP3425 要求

これらが各種ビットによる性能。16ビットで電圧を測定すると12ビットに比べて16倍細かく計測することが可能となる。しかしSPSは1/16しか計測できない。

ビット数1秒あたりの取得数 [SPS]設定値分解階調
12ビット240004,096
14ビット600116,384
16ビット151065,536

これらが各PGAゲイン。倍率を示す。

PGAゲイン設定値倍率 [倍]
1 V/V001
2 V/V012
4 V/V104
8 V/V118

3.2. – 読み込み設定

MCP3425からデータを読み出す必要がある。bus.read_i2c_block_dataにて読み出す。右は2バイト(=16ビット)でデータ格納を行っている。

data = bus.read_i2c_block_data(0x68, 0x00, 2)

これによって読み込みが行われる。次にビットをシフトして16Bitとして整形しなければならない。”bus.read_i2c_block_data”はdata[0]及びdata[1]に格納される。

raw = data[0] << 8 | data[1]

実際にdata[0]とdata[1]に何が格納されているか確認する必要がある。

表示サンプル

data[0]とdata[1]を合わせた(OR = 論理和)のが562である。

data[0]とdata[1]の表示

表示は10進数で表示されているが、実際の作業は2進数で行われる。

変換工程

ここでまた話が戻るが、ビット演算を使っている。”<< 8″は左に8つシフトを表している。詳しくは図解で。

raw = data[0] << 8 | data[1]
ビットシフトの原理

data[0]を左に8動かす。その間には0が8入る。次にORによる演算を行う。次にdata[1]を導入する。

raw = data[0] << 8 | data[1]
ビットシフトとORの原理

3.3. – 測定結果

測定結果は以下の通り。小さい電圧値も計測できることに加えて、マイナス値もしっかりと計測できることを確認した。

測定結果 #1
測定結果 #2

以上です。今後プログラムについては修正する場合があります。間違いがあったら教えてください!

以上


コメントを残す

※メールアドレスの入力は必須ではありません。
※商品紹介や悪意のあるコメントはご遠慮ください。