稼働中

マイクロビット(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