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