Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
MCP3425.cpp@0:29be5dda6cf2, 2018-03-18 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |