稼働中

マイクロビット(c_16)MCP3204/3208 用モジュール

MCP3204/3208(SPI) c_mcp3208_00.py

MCP3204/3208は4-Channel/8-Channel 12-Bit A/D Convertersです。※詳細はデータシートを参照ください。
MCP3204/3208で使う自作の’c_mcp3208_00.py’を作成しました。使い方だけを記載します。(※記事e_047を元にクラスにしました。)
‘c_mcp3208_00.py’は末尾にあります。使い方だけを記載します。

使い方

ファイル転送
micro:bitへ’c_mcp3208_00.py’を送った後でimportして使います。micro:bitに直接ファイルをアップロード出来ない場合(Thonny 3.1.12など)は、microfsなどを使ってアップロードします。
※microfsについては、当サイト内のこちらを参照ください。
※c_mcp3208_00.pyの末尾に、使用例(c_mcp3208_ex.py)の## example以降をコピペ追加しても動作確認できます。

メソッド
‘c_mcp3208_00’をimportすると「r_CHN」のメソッドが使えるようになります。

MCP3208(Vref=3300,CS_pin=16)で初期化します。
Vref:基準電圧をmVで与えます。デフォルトは3300mVです。
CS_pin:MCP3208のチップセレクトと接続するmicro:bitのpinを与えます。デフォルトはpin16です。

(01)r_CHN(num=0, conf=1)
AD変換するチャンネル番号と入力モードを指定します。指定チャンネルのAD変換した電圧値を返します。
num :AD変換するチャンネル番号を与えます。デフォルトは0です。
conf:測定モードを与えます。single-endedは1、differentialは0を与えます。デフォルトは1です。

使用例

電源2Vを抵抗で4分圧してCH0~CH3に入力して動作確認しました。記事e_047と同じです。


c_mcp3208_ex.py
from microbit import *
from c_mcp3208_00 import MCP3208

## example--------------------------------
# MCP3204/3208 4/8CH 12-Bit A/D Converters
ADC=MCP3208(3300,pin16) #MCP3208(Vref,CS_pin) default 3300,pin16

# read channel
# r_CHN(channel, SGL/DIFF) default single-ended(1)
# Input Configuration=single-ended(1)/differential(0)
        
# single-ended 
ch0=ADC.r_CHN(0,1)  # CH0,1 (default)
ch1=ADC.r_CHN(1)    # CH1
ch2=ADC.r_CHN(2)    # CH2
ch3=ADC.r_CHN(3)    # CH3

print('CH0=%4d(mV)'%ch0)
print('CH1=%4d(mV)'%ch1)
print('CH2=%4d(mV)'%ch2)
print('CH3=%4d(mV)'%ch3)

# differential
ch01=ADC.r_CHN(0,0) # CH0=IN+ CH1=IN-
ch10=ADC.r_CHN(1,0) # CH0=IN- CH1=IN+
ch23=ADC.r_CHN(2,0) # CH2=IN+ CH3=IN-
ch32=ADC.r_CHN(3,0) # CH2=IN- CH3=IN+

print('CH01=%4d(mV)'%ch01)
print('CH10=%4d(mV)'%ch10)
print('CH23=%4d(mV)'%ch23)
print('CH32=%4d(mV)'%ch32)

実行結果


>>> %Run c_mcp3208_ex.py
CH0=2039(mV)        #電源2V
CH1=1527(mV)
CH2=1011(mV)
CH3= 509(mV)
CH01= 512(mV)
CH10=   0(mV)       # 極性が違うので 
CH23= 503(mV)
CH32=   0(mV)       # 極性が違うので
>>>

MCP3204/3208 用モジュール


c_mcp3208_00.py
from microbit import *

# MCP3204/3208 4/8CH 12-Bit A/D Converters
class MCP3208:
    def __init__(self,Vref=3300,CS_pin=pin16):
        #spi.init(baudrate=1000000, bits=8, mode=0, sclk=pin13, mosi=pin15, miso=pin14)
        spi.init()
        self.Vref=Vref
        self.CS_pin=CS_pin
        self.LSB=self.Vref/4096     # 12bit mV/bit 
        
    # chip select CS=L Chip Select
    def CS(self,dat):
        self.CS_pin.write_digital(dat)
    
    # read channel num=channel number conf=single(1)/diff(0)
    def r_CHN(self,num, conf=1):
        self.CS(1)
        buf=bytearray(3)
        # |Start bit'1'|SGL/DIFF(conf)|D2|
        buf[0]= 4|(conf<<1)|(num>>2)    # |D2|D1|D0|>>2 |0|0|D2|
        #|D1|D0|X|X|X|X|X|X| 
        buf[1]=(num<< 6) & 0xc0         #0b11000000(0xc0)
        buf[2]=0x00     # don't care
        #print(buf)
        
        r_buf=bytearray(3)
        self.CS(0)
        spi.write_readinto(buf, r_buf)
        #print('r_buf',r_buf)
        self.CS(1)
        data=(r_buf[1] & 0xf) << 8 | r_buf[2]   #0b1111(15)0xf
        
        data=data*self.LSB
        #print('CH%d='% num, '%5.1f(mV)'%data )
        return data