Library for Akizuki MCP3425 ADC module

Fork of MCP3425 by yasuyuki onodera

Library for MCP3425 ADC module from Akizuki-denshi.

Committer:
sakurahilljp
Date:
Fri Apr 15 13:41:32 2016 +0000
Revision:
3:378672292488
Parent:
2:7375e645e806
Added documentation.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yasuyuki 0:b7bc51be525f 1 //**********************
yasuyuki 0:b7bc51be525f 2 // MCP3425.cpp for mbed
yasuyuki 0:b7bc51be525f 3 //
sakurahilljp 3:378672292488 4 // (C)Copyright 2016 Satoshi Nihonyanagi, All Rights Reserved.
yasuyuki 0:b7bc51be525f 5 //
yasuyuki 0:b7bc51be525f 6 // (C)Copyright 2014 All rights reserved by Y.Onodera
yasuyuki 0:b7bc51be525f 7 // http://einstlab.web.fc2.com
yasuyuki 0:b7bc51be525f 8 //**********************
yasuyuki 0:b7bc51be525f 9
yasuyuki 0:b7bc51be525f 10 #include "mbed.h"
yasuyuki 0:b7bc51be525f 11 #include "MCP3425.h"
yasuyuki 0:b7bc51be525f 12
sakurahilljp 2:7375e645e806 13 const int MCP3425::ADDR = 0xD0;
sakurahilljp 1:5ac344aa0aac 14 const float MCP3425::VREF = 2.048;
sakurahilljp 1:5ac344aa0aac 15
sakurahilljp 2:7375e645e806 16 MCP3425::MCP3425(I2C& i2c)
sakurahilljp 2:7375e645e806 17 : _i2c(i2c), _addr(ADDR)
sakurahilljp 2:7375e645e806 18 {
sakurahilljp 2:7375e645e806 19 _init();
yasuyuki 0:b7bc51be525f 20 }
sakurahilljp 2:7375e645e806 21
sakurahilljp 2:7375e645e806 22 MCP3425::MCP3425(I2C& i2c, int addr)
sakurahilljp 2:7375e645e806 23 : _i2c(i2c), _addr(addr)
sakurahilljp 2:7375e645e806 24 {
sakurahilljp 2:7375e645e806 25 _init();
yasuyuki 0:b7bc51be525f 26 }
yasuyuki 0:b7bc51be525f 27
sakurahilljp 2:7375e645e806 28 void MCP3425::set(MCP3425::Gain gain)
sakurahilljp 2:7375e645e806 29 {
sakurahilljp 2:7375e645e806 30 _cfg.bit.G = (unsigned char)gain;
sakurahilljp 2:7375e645e806 31 _write_cfg();
sakurahilljp 2:7375e645e806 32 }
sakurahilljp 2:7375e645e806 33
sakurahilljp 2:7375e645e806 34 void MCP3425::set(MCP3425::Resolution resolution)
sakurahilljp 2:7375e645e806 35 {
sakurahilljp 2:7375e645e806 36 _cfg.bit.S = (unsigned char)resolution;
sakurahilljp 2:7375e645e806 37 _write_cfg();
sakurahilljp 2:7375e645e806 38 }
sakurahilljp 2:7375e645e806 39
sakurahilljp 2:7375e645e806 40 void MCP3425::set(MCP3425::Conversion conversion)
sakurahilljp 2:7375e645e806 41 {
sakurahilljp 2:7375e645e806 42 _cfg.bit.OC = (unsigned char)conversion;
sakurahilljp 2:7375e645e806 43 _write_cfg();
sakurahilljp 2:7375e645e806 44 }
yasuyuki 0:b7bc51be525f 45
yasuyuki 0:b7bc51be525f 46 short MCP3425::get()
yasuyuki 0:b7bc51be525f 47 {
sakurahilljp 2:7375e645e806 48 return _get_code();
sakurahilljp 1:5ac344aa0aac 49 }
sakurahilljp 1:5ac344aa0aac 50
sakurahilljp 1:5ac344aa0aac 51 float MCP3425::read()
sakurahilljp 1:5ac344aa0aac 52 {
sakurahilljp 3:378672292488 53 return _c2v(_get_code());
sakurahilljp 2:7375e645e806 54 }
sakurahilljp 2:7375e645e806 55
sakurahilljp 2:7375e645e806 56 void MCP3425::_init()
sakurahilljp 2:7375e645e806 57 {
sakurahilljp 2:7375e645e806 58 _cfg.bit.G = (unsigned char)G1;
sakurahilljp 2:7375e645e806 59 _cfg.bit.S = (unsigned char)W16;
sakurahilljp 2:7375e645e806 60 _cfg.bit.OC = (unsigned char)ONESHOT;
sakurahilljp 2:7375e645e806 61 _cfg.bit.C = 0;
sakurahilljp 2:7375e645e806 62 _cfg.bit.RDY = 0;
sakurahilljp 2:7375e645e806 63
sakurahilljp 2:7375e645e806 64 _write_cfg();
yasuyuki 0:b7bc51be525f 65 }
yasuyuki 0:b7bc51be525f 66
sakurahilljp 2:7375e645e806 67 void MCP3425::_write_cfg()
yasuyuki 0:b7bc51be525f 68 {
sakurahilljp 2:7375e645e806 69 _buf[0] = _cfg.UC;
sakurahilljp 2:7375e645e806 70 _i2c.write(_addr, _buf, 1);
yasuyuki 0:b7bc51be525f 71 }
yasuyuki 0:b7bc51be525f 72
sakurahilljp 2:7375e645e806 73 short MCP3425::_get_code()
sakurahilljp 2:7375e645e806 74 {
sakurahilljp 2:7375e645e806 75 // Trigger updating value if one-shot Mode
sakurahilljp 2:7375e645e806 76 if (_cfg.bit.OC == 0)
sakurahilljp 2:7375e645e806 77 {
sakurahilljp 2:7375e645e806 78 _cfg.bit.RDY = 1;
sakurahilljp 2:7375e645e806 79 _write_cfg();
sakurahilljp 2:7375e645e806 80 }
sakurahilljp 2:7375e645e806 81
sakurahilljp 2:7375e645e806 82 while(1) {
sakurahilljp 2:7375e645e806 83 if( _i2c.read( ADDR, _buf, 3) != 0 )
sakurahilljp 2:7375e645e806 84 {
sakurahilljp 2:7375e645e806 85 // failed to read (nack)
sakurahilljp 2:7375e645e806 86 return 0;
sakurahilljp 2:7375e645e806 87 }
sakurahilljp 2:7375e645e806 88
sakurahilljp 2:7375e645e806 89 _val.byte.HB = _buf[0];
sakurahilljp 2:7375e645e806 90 _val.byte.LB = _buf[1];
sakurahilljp 2:7375e645e806 91 _cfg.UC = _buf[2];
sakurahilljp 2:7375e645e806 92
sakurahilljp 2:7375e645e806 93 if(_cfg.bit.RDY == 0 ) break;
sakurahilljp 2:7375e645e806 94 wait_ms(5); // fastest rate: 240 SPS with 12-bit
sakurahilljp 2:7375e645e806 95 }
sakurahilljp 2:7375e645e806 96
sakurahilljp 2:7375e645e806 97 return _val.S;
sakurahilljp 2:7375e645e806 98 }
sakurahilljp 3:378672292488 99
sakurahilljp 3:378672292488 100 float MCP3425::_c2v(short code)
sakurahilljp 3:378672292488 101 {
sakurahilljp 3:378672292488 102 int gain = 1;
sakurahilljp 3:378672292488 103 if (_cfg.bit.G == 0) gain = 1;
sakurahilljp 3:378672292488 104 else if (_cfg.bit.G == 1) gain = 2;
sakurahilljp 3:378672292488 105 else if (_cfg.bit.G == 2) gain = 4;
sakurahilljp 3:378672292488 106 else if (_cfg.bit.G == 3) gain = 8;
sakurahilljp 3:378672292488 107
sakurahilljp 3:378672292488 108 int maxcode = 2047;
sakurahilljp 3:378672292488 109 if (_cfg.bit.S == 0 ) maxcode = 2047;
sakurahilljp 3:378672292488 110 else if (_cfg.bit.S == 1 ) maxcode = 8191;
sakurahilljp 3:378672292488 111 else if (_cfg.bit.S == 2 ) maxcode = 32767;
sakurahilljp 3:378672292488 112
sakurahilljp 3:378672292488 113 return code * VREF / gain / ( maxcode + 1 );
sakurahilljp 3:378672292488 114 }