マイクロビット(c_18)MCP4725 用モジュール
MCP4725 (I2C) c_mcp4725_00.py
MCP4725は分解能12bitのD/Aコンバータです。※詳細はデータシートを参照ください。
MCP4725 HW-315モジュールで使う自作のc_mcp4725_00.py’を作成しました。使い方だけを記載します。(※記事e_054を元にクラスにしました。)
‘c_mcp4725_00.py’は末尾にあります。
ファイル転送
micro:bitへ’c_mcp4725_00.py’を送った後でimportして使います。micro:bitに直接ファイルをアップロード出来ない場合(Thonny 3.1.12など)は、microfsなどを使ってアップロードします。
※microfsについては、当サイト内のこちらを参照ください。
※ファイルシステムへ送って使わないとメモリーエラーになると思います。(micro:bit V1)
メソッド
‘c_mcp4725_00’をimportするとwrite_DAC, read_DACのメソッドが使えるようになります。
MCP4725()で初期化します。
(01)write_DAC(volts,cmd=’010′, pd=’00’)
volts:出力する電圧をmVで与えます。
cmd:write commnad type デフォルトは’010’でWriteDACRegisterでEEPROMには書き込みません。
EEPROMにも書込む場合は’011’にします。※’000’のFastModeは使えません。
pd:パワーダウンモードを与えます。デフォルトは’00’でノーマルモードです。’01’は1kΩ、’10’は100kΩ、’11’は500kΩで接地されます。
(02)read_DAC()
DACレジスタとEEPROMデータを読み出します。
DACレジスタ(RDY/BSY, POR ,|PD1|PD2|, 12bit Data,)EEPROM(|PD1|PD2|, 12bit Data)のデータを読み出します。
[‘1’, ‘1’, ’00’, ‘0b011101000101′, ’01’, ‘0b100000000000’]のような形式になります。
※詳細はデーターシートを参照ください。
使用例
DA変換して電圧を出力します。DACレジスタとEEPROMデータをを読み出します。
c_mcp4725_ex.py
from microbit import *
from c_mcp4725_00 import MCP4725
# MCP4725 12-Bit Digital-to-Analog Converter with EEPROM Memory
# i2c.init(freq=100000, sda=pin20, scl=pin19)
i2c.init()
a=MCP4725() # instance
# cmd コマンドデータ、pd パワーダウンモード
w_dat=a.write_DAC(1500,cmd='010', pd='00') # コマンドの送信
dat=a.read_DAC() # 設定値、データの読込み
print(dat)
実行結果
a.write_DAC(1500,cmd=’010′, pd=’00’)にした場合
EEPROMに書込みせず(cmd=’010′)1500mVを出力、テスタでの実測値は1475mVでした。
>>> %Run c_mcp4725_ex.py
write_buf_data= bytearray(b'@tP')
['1', '1', '00', '0b011101000101', '00', '0b000000000000'] #Regiだけ書き換え
>>>
w_dat=a.write_DAC(2000,cmd=’011′, pd=’11’)にした場合
EEPROMに書込み(cmd=’011′)2000mVを出力、テスタでの実測値は1966mVでした。
>>> %Run c_mcp4725_ex.py
write_buf_data= bytearray(b'f\x9b ')
['1', '1', '11', '0b100110110010', '11', '0b100110110010'] #Regi、EEPROM 同じデータ
>>>
w_dat=a.write_DAC(1500,cmd=’010′, pd=’00’)にした場合
レジスタ値のみ変更、EEPROM値は変更なし、テスタでの実測値は1475mVでした。
>>> %Run c_mcp4725_ex.py
write_buf_data= bytearray(b'@tP')
['1', '1', '00', '0b011101000101', '11', '0b100110110010'] #Regiだけ書き換え
>>>
モジュール
MCP4725 HW-315 用モジュール
c_mcp4725_00.py
from microbit import *
# MCP4725 12-Bit Digital-to-Analog Converter with EEPROM Memory
class MCP4725:
def __init__(self,s_vdd=3300,dac_adr=0x60):
# MCP4725 100kHz:standard_mode
self.adr=dac_adr # MCP4725
self.VDD=s_vdd # mV
# i2c.init(freq=100000, sda=pin20, scl=pin19)
i2c.init()
# 8bit zero 穴埋め
def r_padd(self,dat): # int
dat=bin(dat) # str dat int(hex) >> 8bit with 0 str
#value='0b'+'0'*(8-len(dat[2:])) + dat[2:] # str
value='0'*(8-len(dat[2:])) + dat[2:] # str
return value
## ADC read register EEPROM DATA
def read_DAC(self):
# read 5bytes
r_data=[]
r_dat=i2c.read(self.adr,5)
# DAC Register
r_data.append(self.r_padd(r_dat[0])[0:1]) #RDY/BSY(1/0)
r_data.append(self.r_padd(r_dat[0])[1:2]) #POR(power-on-reset)
r_data.append(self.r_padd(r_dat[0])[5:7]) #|PD1|PD2|
# DAC Resister 12bit Data str
r_data.append('0b'+self.r_padd(r_dat[1])+self.r_padd(r_dat[2])[0:4])
# DAC EEPROM 12bit Data str
r_data.append(self.r_padd(r_dat[3])[1:3]) #|PD1|PD2|
r_data.append('0b'+self.r_padd(r_dat[3])[4:8]+self.r_padd(r_dat[4]))
return r_data
# 12bit zero 穴埋め
def w_padd(self,dat): # int
dat=bin(dat) # str
#value='0b'+'0'*(8-len(dat[2:])) + dat[2:] # str 8bit
value='0'*(12-len(dat[2:])) + dat[2:] # str
return value
## ADC write command & 12bit-Vout-Data set
# volts:dac-out_mv, cmd:write_command, pd:power-down_mode
# cmd='00X' fast modeは設定できません
def write_DAC(self,volts,cmd='010', pd='00'):
# set 12bit-data 0 ~ Vdd*(4095/4096)
s_dat=int(volts/self.VDD*4096)
w_dat=self.w_padd(s_dat) #str 12char
buf=bytearray(3) # I2C write data
buf[0]=int('0b'+ cmd +'00'+pd +'0') # command powerdown
# DACのDataを8bit 4bitを文字列に分解して足す
buf[1]=int('0b'+ w_dat[0:8]) # |D11-D4| 8bit
buf[2]=int('0b'+ w_dat[8:12]) << 4 # |D3-D0| 4bit+残0' 8bit
i2c.write(self.adr,buf)
# EEPROM Write Time — 25~50 ms 必要
if cmd=='011':
sleep(50) # 待ち時間が必要
#print('WRITE EEPROM')
return buf