稼働中

Raspberry Pi Pico(s_20)MCP3208 用モジュール

MCP3208 MCP3208c.py

MCP3208は分解能12bitの8チャンネルA/Dコンバータです。SPI通信で制御します。
※詳細はMCP3208のデータシートを参照ください。
Raspberry Pi PicoでMCP3208を使う自作の’MCP3208c.py’を作成しました。記事d_26を元に作成しています。’MCP3208c.py’は末尾にあります。使い方だけを記載します。

使い方

■ ファイル転送
Raspberry Pi Picoへ’MCP3208c.py’を送った後でimportして使います。
※MCP3208c.pyの末尾に、使用例(MCP3208_ex.py)の## example以降をコピペ追加しても動作確認できます。
■ メソッド
‘MCP3208c’をimportすると「CS、r_CHN」のメソッドが使えるようになります。
MCP3208(Vref=3300,spi_num=1,cs_num=13)で初期化します。
Vref:ADCの基準電圧です。デフォルト値は3300mVです。
num:SPI0、SPI1の番号です。デフォルトは1(SPI1)です。
cs_num:CSに使うGPIO番号です。デフォルトは13(GP13)です。

SPI0、SPI1の[RX, Csn, SCK, TX]のGPIO番号リストは以下になります。
#SPI0 [ 0, 1, 2, 3] [ 4, 5, 6, 7] [16,17,18,19]
#SPI1 [ 8, 9,10,11] [12,13,14,15]
※RX(MISO), TX(MOSI)
spi_numとcs_numを設定すれば、RX, SCK, TXは指定されます。

(01)CS(dat=1)
Chip selectの’0’、’1’を送ります。CS(0)でデバイスが有効になります。

(02)r_CHN(num=0, conf=1)
r_CHN():AD変換値を返します。
デフォルトではCH0、single-endedのAD変換値が返ります。
num:AD変換するチャンネルを指定します。MCP3208の0~7のCH番号です。
conf:AD変換の測定モードです。single-ended(1)differential(0)です。

使用例

MCP3208で2000mVを4分圧した電圧を測定しました。記事d_26と同じです。


MCP3208c_ex.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import SPI, Pin
from MCP3208c import MCP3208
## exapmle
# MCP3208 A/D変換
a=MCP3208(3300,1,13)   # init (Vref=3300,spi_num=1,cs_num=13)
# Single
print('CH0=%5.1f(mV)' %a.r_CHN(0)) 
print('CH1=%5.1f(mV)' %a.r_CHN(1))
print('CH2=%5.1f(mV)' %a.r_CHN(2)) 
print('CH3=%5.1f(mV)' %a.r_CHN(3))
# Diff
print('CH0=IN+ CH1=IN- =%5.1f(mV)' %a.r_CHN(0,0))
print('CH2=IN+ CH3=IN- =%5.1f(mV)' %a.r_CHN(2,0))
print('CH2=IN- CH3=IN+ =%5.1f(mV)' %a.r_CHN(3,0))

実行結果 
実行すると以下のようになりました。※Thonnyのshellに表示されます。


>>> %Run -c $EDITOR_CONTENT
CH0=2070.6(mV)
CH1=1559.8(mV)
CH2=1035.3(mV)
CH3=516.4(mV)
CH0=IN+ CH1=IN- =518.0(mV)
CH2=IN+ CH3=IN- =518.8(mV)
CH2=IN- CH3=IN+ =  0.0(mV)            #負になるので
>>>

MCP3008モジュール用


MCP3208c.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import SPI, Pin
class MCP3208:
    def __init__(self,Vref=3300,spi_num=1,cs_num=13):
        CS_pin=Pin(cs_num, mode=Pin.OUT, value=1)
        self.spi = SPI(spi_num, baudrate=50_000,sck=Pin(cs_num+1),
                       mosi=Pin(cs_num+2), miso=Pin(cs_num-1))
        self.Vref=Vref
        self.CS_pin=CS_pin        
        self.LSB=self.Vref/4096  # 12bit
        
    # chip select CS=L Chip Select
    def CS(self,dat):
        self.CS_pin(dat)

    # SGL/DIFF D2 D1 D0 XXXX conf=single(1)/diff(0)
    def r_CHN(self,num=0, conf=1):
        self.CS(1)
        buf=bytearray(3)
        # |Start bit='1'|SGL/DIFF='1/0'|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

        r_buf=bytearray(3)

        self.CS(0)
        self.spi.write_readinto(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, '%4d(mV)'%data )
        return data