Kenji Arai / MCP3425

Dependents:   check_ADC_MCP3425

Committer:
kenjiArai
Date:
Sun Mar 18 01:02:54 2018 +0000
Revision:
0:29be5dda6cf2
Child:
1:223248a79e87
1st release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:29be5dda6cf2 1 /*
kenjiArai 0:29be5dda6cf2 2 * mbed library program
kenjiArai 0:29be5dda6cf2 3 * 16-Bit Analog-to-Digital Converter with I2C Interface
kenjiArai 0:29be5dda6cf2 4 * MCP3425 by Microchip Technology Inc.
kenjiArai 0:29be5dda6cf2 5 *
kenjiArai 0:29be5dda6cf2 6 * Copyright (c) 2018 Kenji Arai / JH1PJL
kenjiArai 0:29be5dda6cf2 7 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:29be5dda6cf2 8 * http://mbed.org/users/kenjiArai/
kenjiArai 0:29be5dda6cf2 9 * Modify: March 17th, 2018
kenjiArai 0:29be5dda6cf2 10 * Revised: March 18th, 2018
kenjiArai 0:29be5dda6cf2 11 */
kenjiArai 0:29be5dda6cf2 12
kenjiArai 0:29be5dda6cf2 13 #include "MCP3425.h"
kenjiArai 0:29be5dda6cf2 14
kenjiArai 0:29be5dda6cf2 15 extern Serial pc;
kenjiArai 0:29be5dda6cf2 16
kenjiArai 0:29be5dda6cf2 17 // BIT DEFINITION
kenjiArai 0:29be5dda6cf2 18 #define RDY_BIT (1UL << 7)
kenjiArai 0:29be5dda6cf2 19 #define CONVERSION_MODE_BIT (1UL << 4)
kenjiArai 0:29be5dda6cf2 20 #define SAMPLE_RATE_BIT (3UL << 2)
kenjiArai 0:29be5dda6cf2 21 #define PGA_GAIN_BIT (3UL << 0)
kenjiArai 0:29be5dda6cf2 22
kenjiArai 0:29be5dda6cf2 23 #if (MBED_MAJOR_VERSION == 2)
kenjiArai 0:29be5dda6cf2 24 #define WAIT_MS(x) wait_ms(x)
kenjiArai 0:29be5dda6cf2 25 #elif (MBED_MAJOR_VERSION == 5)
kenjiArai 0:29be5dda6cf2 26 #define WAIT_MS(x) Thread::wait(x)
kenjiArai 0:29be5dda6cf2 27 #else
kenjiArai 0:29be5dda6cf2 28 #warning "I cannot control wait_ms()!!"
kenjiArai 0:29be5dda6cf2 29 #endif
kenjiArai 0:29be5dda6cf2 30
kenjiArai 0:29be5dda6cf2 31 MCP3425::MCP3425 (PinName p_sda, PinName p_scl)
kenjiArai 0:29be5dda6cf2 32 : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
kenjiArai 0:29be5dda6cf2 33 {
kenjiArai 0:29be5dda6cf2 34 mcp3425_addr = MCP3425A0T_ADDR; // Chip MCP3425A0T-E/CH
kenjiArai 0:29be5dda6cf2 35 init();
kenjiArai 0:29be5dda6cf2 36 }
kenjiArai 0:29be5dda6cf2 37
kenjiArai 0:29be5dda6cf2 38 MCP3425::MCP3425 (PinName p_sda, PinName p_scl, uint8_t addr)
kenjiArai 0:29be5dda6cf2 39 : _i2c_p(new I2C(p_sda, p_scl)), _i2c(*_i2c_p)
kenjiArai 0:29be5dda6cf2 40 {
kenjiArai 0:29be5dda6cf2 41 mcp3425_addr = addr; // you need get diffrent part nuber of chip
kenjiArai 0:29be5dda6cf2 42 init();
kenjiArai 0:29be5dda6cf2 43 }
kenjiArai 0:29be5dda6cf2 44
kenjiArai 0:29be5dda6cf2 45 MCP3425::MCP3425 (I2C& p_i2c)
kenjiArai 0:29be5dda6cf2 46 : _i2c(p_i2c)
kenjiArai 0:29be5dda6cf2 47 {
kenjiArai 0:29be5dda6cf2 48 mcp3425_addr = MCP3425A0T_ADDR; // Chip MCP3425A0T-E/CH
kenjiArai 0:29be5dda6cf2 49 init();
kenjiArai 0:29be5dda6cf2 50 }
kenjiArai 0:29be5dda6cf2 51
kenjiArai 0:29be5dda6cf2 52 MCP3425::MCP3425 (I2C& p_i2c, uint8_t addr)
kenjiArai 0:29be5dda6cf2 53 : _i2c(p_i2c)
kenjiArai 0:29be5dda6cf2 54 {
kenjiArai 0:29be5dda6cf2 55 mcp3425_addr = addr; // you need get diffrent part nuber of chip
kenjiArai 0:29be5dda6cf2 56 init();
kenjiArai 0:29be5dda6cf2 57 }
kenjiArai 0:29be5dda6cf2 58
kenjiArai 0:29be5dda6cf2 59 void MCP3425::init()
kenjiArai 0:29be5dda6cf2 60 {
kenjiArai 0:29be5dda6cf2 61 offset_volt = 0.0f; // none offset
kenjiArai 0:29be5dda6cf2 62 compensation_ref = 1.0f; // no compensation
kenjiArai 0:29be5dda6cf2 63 config.pga_gain = PGA_GAIN_1; // Gain x1
kenjiArai 0:29be5dda6cf2 64 config.sample_rate = SAMPLE_RATE_15SPS_16BIT; // 16bit resolution
kenjiArai 0:29be5dda6cf2 65 config.conversion_mode = CONV_MODE_CONTINUOUS; // Continuous conversion
kenjiArai 0:29be5dda6cf2 66 config_byte = convert_config2byte(&config); // make one byte
kenjiArai 0:29be5dda6cf2 67 buf[0] = config_byte;
kenjiArai 0:29be5dda6cf2 68 _i2c.write((int)mcp3425_addr, (char *)buf, 1); // write into config reg.
kenjiArai 0:29be5dda6cf2 69 }
kenjiArai 0:29be5dda6cf2 70
kenjiArai 0:29be5dda6cf2 71 int16_t MCP3425::read_16bit()
kenjiArai 0:29be5dda6cf2 72 {
kenjiArai 0:29be5dda6cf2 73 uint32_t timeout = 1000U; // timeout
kenjiArai 0:29be5dda6cf2 74 if (config.conversion_mode == CONV_MODE_ONE_SHOT) {
kenjiArai 0:29be5dda6cf2 75 // trigger for starting conversion
kenjiArai 0:29be5dda6cf2 76 buf[0] = config_byte + RDY_BIT;
kenjiArai 0:29be5dda6cf2 77 _i2c.write((int)mcp3425_addr, (char *)buf, 1);
kenjiArai 0:29be5dda6cf2 78 }
kenjiArai 0:29be5dda6cf2 79 do {
kenjiArai 0:29be5dda6cf2 80 _i2c.read( (int)mcp3425_addr, (char *)buf, 3);
kenjiArai 0:29be5dda6cf2 81 if ((buf[2] & RDY_BIT) == 0) {
kenjiArai 0:29be5dda6cf2 82 break; // end of conversion
kenjiArai 0:29be5dda6cf2 83 }
kenjiArai 0:29be5dda6cf2 84 if (--timeout == 0) {
kenjiArai 0:29be5dda6cf2 85 return -1; // error
kenjiArai 0:29be5dda6cf2 86 }
kenjiArai 0:29be5dda6cf2 87 uint8_t spd = (buf[2] >> 2) & 0x03;
kenjiArai 0:29be5dda6cf2 88 if (spd == SAMPLE_RATE_60SPS_14BIT) {
kenjiArai 0:29be5dda6cf2 89 WAIT_MS(6); // conversion time = 16.7ms
kenjiArai 0:29be5dda6cf2 90 } else if (spd == SAMPLE_RATE_15SPS_16BIT) {
kenjiArai 0:29be5dda6cf2 91 WAIT_MS(24); // conversion time = 66.7ms
kenjiArai 0:29be5dda6cf2 92 } else { // == SAMPLE_RATE_240SPS_12BIT
kenjiArai 0:29be5dda6cf2 93 WAIT_MS(2); // no wait
kenjiArai 0:29be5dda6cf2 94 }
kenjiArai 0:29be5dda6cf2 95 } while(true);
kenjiArai 0:29be5dda6cf2 96 dt_adc16 = (uint16_t)buf[0] << 8;
kenjiArai 0:29be5dda6cf2 97 dt_adc16 += (uint16_t)buf[1];
kenjiArai 0:29be5dda6cf2 98 return dt_adc16;
kenjiArai 0:29be5dda6cf2 99 }
kenjiArai 0:29be5dda6cf2 100
kenjiArai 0:29be5dda6cf2 101 float MCP3425::read_voltage()
kenjiArai 0:29be5dda6cf2 102 {
kenjiArai 0:29be5dda6cf2 103 float dt16 = (float)read_16bit();
kenjiArai 0:29be5dda6cf2 104 switch(config.sample_rate) {
kenjiArai 0:29be5dda6cf2 105 case SAMPLE_RATE_240SPS_12BIT:
kenjiArai 0:29be5dda6cf2 106 dt16 /= 2048.0f; // 11bit (0x7ff +1)
kenjiArai 0:29be5dda6cf2 107 break;
kenjiArai 0:29be5dda6cf2 108 case SAMPLE_RATE_60SPS_14BIT:
kenjiArai 0:29be5dda6cf2 109 dt16 /= 16384.0f; // 14bit (0x3fff +1)
kenjiArai 0:29be5dda6cf2 110 break;
kenjiArai 0:29be5dda6cf2 111 case SAMPLE_RATE_15SPS_16BIT:
kenjiArai 0:29be5dda6cf2 112 dt16 /= 32768.0f; // 15bit (0x7fff +1)
kenjiArai 0:29be5dda6cf2 113 break;
kenjiArai 0:29be5dda6cf2 114 default:
kenjiArai 0:29be5dda6cf2 115 return -1;
kenjiArai 0:29be5dda6cf2 116 }
kenjiArai 0:29be5dda6cf2 117 switch(config.pga_gain) {
kenjiArai 0:29be5dda6cf2 118 case PGA_GAIN_1:
kenjiArai 0:29be5dda6cf2 119 dt16 /= 1.0f;
kenjiArai 0:29be5dda6cf2 120 break;
kenjiArai 0:29be5dda6cf2 121 case PGA_GAIN_2:
kenjiArai 0:29be5dda6cf2 122 dt16 /= 2.0f;
kenjiArai 0:29be5dda6cf2 123 break;
kenjiArai 0:29be5dda6cf2 124 case PGA_GAIN_4:
kenjiArai 0:29be5dda6cf2 125 dt16 /= 4.0f;
kenjiArai 0:29be5dda6cf2 126 break;
kenjiArai 0:29be5dda6cf2 127 case PGA_GAIN_8:
kenjiArai 0:29be5dda6cf2 128 dt16 /= 8.0f;
kenjiArai 0:29be5dda6cf2 129 break;
kenjiArai 0:29be5dda6cf2 130 default:
kenjiArai 0:29be5dda6cf2 131 return -1;
kenjiArai 0:29be5dda6cf2 132 }
kenjiArai 0:29be5dda6cf2 133 dt_adc_f = dt16 * 2.048f;
kenjiArai 0:29be5dda6cf2 134 dt_adc_f -= offset_volt;
kenjiArai 0:29be5dda6cf2 135 dt_adc_f *= compensation_ref;
kenjiArai 0:29be5dda6cf2 136 return dt_adc_f;
kenjiArai 0:29be5dda6cf2 137 }
kenjiArai 0:29be5dda6cf2 138
kenjiArai 0:29be5dda6cf2 139 void MCP3425::set_offset_volt(float offset)
kenjiArai 0:29be5dda6cf2 140 {
kenjiArai 0:29be5dda6cf2 141 offset_volt = offset;
kenjiArai 0:29be5dda6cf2 142 }
kenjiArai 0:29be5dda6cf2 143
kenjiArai 0:29be5dda6cf2 144 void MCP3425::set_vref_compensation(float compensation)
kenjiArai 0:29be5dda6cf2 145 {
kenjiArai 0:29be5dda6cf2 146 compensation_ref = compensation;
kenjiArai 0:29be5dda6cf2 147 }
kenjiArai 0:29be5dda6cf2 148
kenjiArai 0:29be5dda6cf2 149 void MCP3425::set_config(mcp3425_config_t *parameter)
kenjiArai 0:29be5dda6cf2 150 {
kenjiArai 0:29be5dda6cf2 151 config.pga_gain = parameter->pga_gain & 0x03;
kenjiArai 0:29be5dda6cf2 152 config.sample_rate = parameter->sample_rate & 0x03;
kenjiArai 0:29be5dda6cf2 153 config.conversion_mode = parameter->conversion_mode & 0x01;
kenjiArai 0:29be5dda6cf2 154 config_byte = convert_config2byte(&config);
kenjiArai 0:29be5dda6cf2 155 buf[0] = config_byte;
kenjiArai 0:29be5dda6cf2 156 _i2c.write((int)mcp3425_addr, (char *)buf, 1);
kenjiArai 0:29be5dda6cf2 157 }
kenjiArai 0:29be5dda6cf2 158
kenjiArai 0:29be5dda6cf2 159 void MCP3425::read_config(mcp3425_config_t *parameter)
kenjiArai 0:29be5dda6cf2 160 {
kenjiArai 0:29be5dda6cf2 161 _i2c.read( (int)mcp3425_addr, (char *)buf, 3);
kenjiArai 0:29be5dda6cf2 162 config_byte = buf[2] & 0x1f;
kenjiArai 0:29be5dda6cf2 163 parameter->pga_gain = config_byte & PGA_GAIN_BIT;
kenjiArai 0:29be5dda6cf2 164 parameter->sample_rate = (config_byte & SAMPLE_RATE_BIT) >> 2;
kenjiArai 0:29be5dda6cf2 165 parameter->conversion_mode = (config_byte & CONVERSION_MODE_BIT) >> 4;
kenjiArai 0:29be5dda6cf2 166 config = *parameter;
kenjiArai 0:29be5dda6cf2 167 }
kenjiArai 0:29be5dda6cf2 168
kenjiArai 0:29be5dda6cf2 169 void MCP3425::frequency(uint32_t hz)
kenjiArai 0:29be5dda6cf2 170 {
kenjiArai 0:29be5dda6cf2 171 _i2c.frequency(hz);
kenjiArai 0:29be5dda6cf2 172 }
kenjiArai 0:29be5dda6cf2 173
kenjiArai 0:29be5dda6cf2 174 uint8_t MCP3425::convert_config2byte(mcp3425_config_t *config)
kenjiArai 0:29be5dda6cf2 175 {
kenjiArai 0:29be5dda6cf2 176 uint8_t byte = config->pga_gain;
kenjiArai 0:29be5dda6cf2 177 byte |= config->sample_rate << 2;
kenjiArai 0:29be5dda6cf2 178 byte |= config->conversion_mode << 4;
kenjiArai 0:29be5dda6cf2 179 config_byte = byte;
kenjiArai 0:29be5dda6cf2 180 return config_byte;
kenjiArai 0:29be5dda6cf2 181 }