MCP3427 16-Bit Analog-to-Digital Converter with I2C Interface

Fork of MCP3425 by Kenji Arai

Committer:
kenjiArai
Date:
Fri Sep 21 22:39:23 2018 +0000
Revision:
2:bb3efa8c5b23
Parent:
MCP3425.h@0:29be5dda6cf2
Library for MCP3427

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:29be5dda6cf2 1 /*
kenjiArai 0:29be5dda6cf2 2 * mbed library program
kenjiArai 2:bb3efa8c5b23 3 * 2 channels 16-Bit(available 14/12bit mode) Analog-to-Digital Converter
kenjiArai 2:bb3efa8c5b23 4 * with I2C Interface ---- MCP3427 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 2:bb3efa8c5b23 9 * Created: June 7th, 2018
kenjiArai 2:bb3efa8c5b23 10 * Revised: July 13th, 2018
kenjiArai 0:29be5dda6cf2 11 */
kenjiArai 0:29be5dda6cf2 12 /*
kenjiArai 0:29be5dda6cf2 13 *---------------- REFERENCE ---------------------------------------------------
kenjiArai 2:bb3efa8c5b23 14 * Data Sheet DS22226B Revision A(December 2009) by Microchip Technology Inc.
kenjiArai 2:bb3efa8c5b23 15 * https://www.microchip.com/wwwproducts/en/MCP3427
kenjiArai 0:29be5dda6cf2 16 */
kenjiArai 0:29be5dda6cf2 17
kenjiArai 2:bb3efa8c5b23 18 #ifndef MCP3427_H
kenjiArai 2:bb3efa8c5b23 19 #define MCP3427_H
kenjiArai 0:29be5dda6cf2 20
kenjiArai 0:29be5dda6cf2 21 #include "mbed.h"
kenjiArai 0:29be5dda6cf2 22
kenjiArai 0:29be5dda6cf2 23 ////////////// I2C Chip address ////////////////////////////////////////////////
kenjiArai 0:29be5dda6cf2 24 // The device code is followed by three address bits (A2, A1, A0)
kenjiArai 0:29be5dda6cf2 25 // which are also programmed at the Microchip factory
kenjiArai 2:bb3efa8c5b23 26 // Address b7=1,b6=1,b5=0,b4=1,b3(A2)=x,b2(A1)=x,b1(A0)=x, b0=R/W
kenjiArai 2:bb3efa8c5b23 27 #define MCP3427GG_ADDR (0x68 << 1) // Adr0=0, Adr1=0
kenjiArai 2:bb3efa8c5b23 28 #define MCP3427GV_ADDR (0x6a << 1) // Adr0=0, Adr1=1
kenjiArai 2:bb3efa8c5b23 29 #define MCP3427VG_ADDR (0x6c << 1) // Adr0=1, Adr1=0
kenjiArai 2:bb3efa8c5b23 30 #define MCP3427VV_ADDR (0x6e << 1) // Adr0=1, Adr1=1
kenjiArai 0:29be5dda6cf2 31
kenjiArai 0:29be5dda6cf2 32 ////////////// Configration Registers parameter ////////////////////////////////
kenjiArai 0:29be5dda6cf2 33 #define PGA_GAIN_1 0
kenjiArai 0:29be5dda6cf2 34 #define PGA_GAIN_2 1
kenjiArai 0:29be5dda6cf2 35 #define PGA_GAIN_4 2
kenjiArai 0:29be5dda6cf2 36 #define PGA_GAIN_8 3
kenjiArai 0:29be5dda6cf2 37
kenjiArai 0:29be5dda6cf2 38 #define CONV_MODE_CONTINUOUS 1
kenjiArai 0:29be5dda6cf2 39 #define CONV_MODE_ONE_SHOT 0
kenjiArai 0:29be5dda6cf2 40
kenjiArai 0:29be5dda6cf2 41 #define SAMPLE_RATE_240SPS_12BIT 0
kenjiArai 0:29be5dda6cf2 42 #define SAMPLE_RATE_60SPS_14BIT 1
kenjiArai 0:29be5dda6cf2 43 #define SAMPLE_RATE_15SPS_16BIT 2
kenjiArai 0:29be5dda6cf2 44
kenjiArai 0:29be5dda6cf2 45 typedef struct configration_reg {
kenjiArai 2:bb3efa8c5b23 46 // CH1
kenjiArai 2:bb3efa8c5b23 47 uint8_t pga_gain1;
kenjiArai 2:bb3efa8c5b23 48 uint8_t sample_rate1;
kenjiArai 2:bb3efa8c5b23 49 uint8_t conversion_mode1;
kenjiArai 2:bb3efa8c5b23 50 // CH2
kenjiArai 2:bb3efa8c5b23 51 uint8_t pga_gain2;
kenjiArai 2:bb3efa8c5b23 52 uint8_t sample_rate2;
kenjiArai 2:bb3efa8c5b23 53 uint8_t conversion_mode2;
kenjiArai 2:bb3efa8c5b23 54 } mcp3427_config_t;
kenjiArai 0:29be5dda6cf2 55
kenjiArai 2:bb3efa8c5b23 56 /** Interface for ADC MCP3427
kenjiArai 0:29be5dda6cf2 57 * @code
kenjiArai 0:29be5dda6cf2 58 * #include "mbed.h"
kenjiArai 2:bb3efa8c5b23 59 * #include "MCP3427.h"
kenjiArai 0:29be5dda6cf2 60 *
kenjiArai 0:29be5dda6cf2 61 * // Default parameter setting
kenjiArai 0:29be5dda6cf2 62 * // Continuous Conversion + 15 SPS (16 bits) + Gain x1
kenjiArai 0:29be5dda6cf2 63 *
kenjiArai 0:29be5dda6cf2 64 * // I2C Communication
kenjiArai 2:bb3efa8c5b23 65 * MCP3427 adc(I2C_SDA, I2C_SCL, MCP3427GG_ADDR);
kenjiArai 0:29be5dda6cf2 66 * // If you connected I2C line not only this device but also other devices,
kenjiArai 0:29be5dda6cf2 67 * // you need to declare following method.
kenjiArai 2:bb3efa8c5b23 68 * I2C i2c(I2C_SDA, I2C_SCL);
kenjiArai 2:bb3efa8c5b23 69 * MCP3427 adc(i2c, MCP3427GG_ADDR);
kenjiArai 2:bb3efa8c5b23 70 *
kenjiArai 2:bb3efa8c5b23 71 * mcp3427_config_t my_cnfg;
kenjiArai 0:29be5dda6cf2 72 *
kenjiArai 0:29be5dda6cf2 73 * int main() {
kenjiArai 2:bb3efa8c5b23 74 * my_cnfg.pga_gain1 = PGA_GAIN_1;
kenjiArai 2:bb3efa8c5b23 75 * my_cnfg.sample_rate1 = SAMPLE_RATE_15SPS_16BIT;
kenjiArai 2:bb3efa8c5b23 76 * my_cnfg.conversion_mode1 = CONV_MODE_CONTINUOUS;
kenjiArai 2:bb3efa8c5b23 77 * my_cnfg.pga_gain2 = PGA_GAIN_8;
kenjiArai 2:bb3efa8c5b23 78 * my_cnfg.sample_rate2 = SAMPLE_RATE_15SPS_16BIT;
kenjiArai 2:bb3efa8c5b23 79 * my_cnfg.conversion_mode2 = CONV_MODE_CONTINUOUS;
kenjiArai 2:bb3efa8c5b23 80 * adc.set_config(&my_cnfg);
kenjiArai 0:29be5dda6cf2 81 * while(true){
kenjiArai 2:bb3efa8c5b23 82 * printf("ADC: %6.5f [V]\r\n", adc.read_voltage(1)); // read channel 1
kenjiArai 2:bb3efa8c5b23 83 * wait(0.2f);
kenjiArai 2:bb3efa8c5b23 84 * printf("ADC: %6.5f [V]\r\n", adc.read_voltage(2)); // read channel 2
kenjiArai 0:29be5dda6cf2 85 * wait(0.2f);
kenjiArai 0:29be5dda6cf2 86 * }
kenjiArai 0:29be5dda6cf2 87 * }
kenjiArai 0:29be5dda6cf2 88 * @endcode
kenjiArai 0:29be5dda6cf2 89 */
kenjiArai 0:29be5dda6cf2 90
kenjiArai 2:bb3efa8c5b23 91 class MCP3427
kenjiArai 0:29be5dda6cf2 92 {
kenjiArai 0:29be5dda6cf2 93 public:
kenjiArai 0:29be5dda6cf2 94 /** Configure data pin
kenjiArai 0:29be5dda6cf2 95 * @param data SDA and SCL pins
kenjiArai 2:bb3efa8c5b23 96 * @param I2C address
kenjiArai 0:29be5dda6cf2 97 */
kenjiArai 2:bb3efa8c5b23 98 MCP3427(PinName p_sda, PinName p_scl, uint8_t addr);
kenjiArai 0:29be5dda6cf2 99
kenjiArai 0:29be5dda6cf2 100 /** Configure data pin (with other devices on I2C line)
kenjiArai 0:29be5dda6cf2 101 * @param I2C previous definition
kenjiArai 2:bb3efa8c5b23 102 * @param I2C address
kenjiArai 0:29be5dda6cf2 103 */
kenjiArai 2:bb3efa8c5b23 104 MCP3427(I2C& p_i2c, uint8_t addr);
kenjiArai 2:bb3efa8c5b23 105
kenjiArai 2:bb3efa8c5b23 106 /** Get ADC data
kenjiArai 2:bb3efa8c5b23 107 * @param channel ch1(1) or ch2(2)
kenjiArai 2:bb3efa8c5b23 108 * @return ADC data in 16bit
kenjiArai 2:bb3efa8c5b23 109 */
kenjiArai 2:bb3efa8c5b23 110 int16_t read_16bit(uint8_t ch);
kenjiArai 0:29be5dda6cf2 111
kenjiArai 0:29be5dda6cf2 112 /** Get ADC data
kenjiArai 2:bb3efa8c5b23 113 * @param channel ch1(1) or ch2(2)
kenjiArai 2:bb3efa8c5b23 114 * @return voltage (includes Gain, Data rate, offset, vref compensation)
kenjiArai 0:29be5dda6cf2 115 */
kenjiArai 2:bb3efa8c5b23 116 float read_voltage(uint8_t ch);
kenjiArai 2:bb3efa8c5b23 117
kenjiArai 2:bb3efa8c5b23 118 /** Start ADC conversion
kenjiArai 2:bb3efa8c5b23 119 * @param channel ch1(1) or ch2(2)
kenjiArai 2:bb3efa8c5b23 120 * @return none
kenjiArai 2:bb3efa8c5b23 121 */
kenjiArai 2:bb3efa8c5b23 122 void start_conversion(uint8_t ch);
kenjiArai 0:29be5dda6cf2 123
kenjiArai 0:29be5dda6cf2 124 /** Get ADC data
kenjiArai 0:29be5dda6cf2 125 * @param none
kenjiArai 0:29be5dda6cf2 126 * @return voltage (includes Gain, Data rate, offset, vref compensation)
kenjiArai 0:29be5dda6cf2 127 */
kenjiArai 2:bb3efa8c5b23 128 float read_voltage_from_current_ch(void);
kenjiArai 0:29be5dda6cf2 129
kenjiArai 0:29be5dda6cf2 130 /** Set voltage offset (only effective for read_voltage() function)
kenjiArai 2:bb3efa8c5b23 131 * @param channel ch1(set 1) or ch2(set 2)
kenjiArai 0:29be5dda6cf2 132 * @param offset voltage (0.0f = default)
kenjiArai 0:29be5dda6cf2 133 * @return none
kenjiArai 0:29be5dda6cf2 134 */
kenjiArai 2:bb3efa8c5b23 135 void set_offset_volt(uint8_t ch, float offset);
kenjiArai 0:29be5dda6cf2 136
kenjiArai 0:29be5dda6cf2 137 /** Set refrence volt compensation (only effective for read_voltage())
kenjiArai 0:29be5dda6cf2 138 * @param compensation data (1.00f = default)
kenjiArai 0:29be5dda6cf2 139 * @return none
kenjiArai 0:29be5dda6cf2 140 */
kenjiArai 0:29be5dda6cf2 141 void set_vref_compensation(float compensation);
kenjiArai 0:29be5dda6cf2 142
kenjiArai 0:29be5dda6cf2 143 /** Set Configuration Register
kenjiArai 0:29be5dda6cf2 144 * @param pointer for register parameter
kenjiArai 0:29be5dda6cf2 145 * @return none
kenjiArai 0:29be5dda6cf2 146 */
kenjiArai 2:bb3efa8c5b23 147 void set_config(mcp3427_config_t *parameter);
kenjiArai 0:29be5dda6cf2 148
kenjiArai 0:29be5dda6cf2 149 /** Set I2C clock frequency
kenjiArai 0:29be5dda6cf2 150 * @param freq.
kenjiArai 0:29be5dda6cf2 151 * @return none
kenjiArai 0:29be5dda6cf2 152 */
kenjiArai 0:29be5dda6cf2 153 void frequency(uint32_t hz);
kenjiArai 0:29be5dda6cf2 154
kenjiArai 0:29be5dda6cf2 155 protected:
kenjiArai 0:29be5dda6cf2 156 I2C *_i2c_p;
kenjiArai 0:29be5dda6cf2 157 I2C &_i2c;
kenjiArai 0:29be5dda6cf2 158
kenjiArai 0:29be5dda6cf2 159 void init(void);
kenjiArai 2:bb3efa8c5b23 160 void convert_config2byte(void);
kenjiArai 2:bb3efa8c5b23 161 void _set_ch_and_config(uint8_t ch);
kenjiArai 2:bb3efa8c5b23 162 int16_t _read_16bit(void);
kenjiArai 2:bb3efa8c5b23 163 float _read_voltage(float dt16);
kenjiArai 0:29be5dda6cf2 164
kenjiArai 0:29be5dda6cf2 165 private:
kenjiArai 2:bb3efa8c5b23 166 uint8_t mcp3427_addr;
kenjiArai 0:29be5dda6cf2 167 uint8_t buf[4];
kenjiArai 2:bb3efa8c5b23 168 uint8_t current_ch;
kenjiArai 2:bb3efa8c5b23 169 uint8_t config_byte[2];
kenjiArai 2:bb3efa8c5b23 170 uint8_t pga_gain[2];
kenjiArai 2:bb3efa8c5b23 171 uint8_t sample_rate[2];
kenjiArai 2:bb3efa8c5b23 172 uint8_t conversion_mode[2];
kenjiArai 2:bb3efa8c5b23 173
kenjiArai 2:bb3efa8c5b23 174 uint8_t _ch;
kenjiArai 0:29be5dda6cf2 175
kenjiArai 2:bb3efa8c5b23 176 float offset_volt[2];
kenjiArai 0:29be5dda6cf2 177 float compensation_ref;
kenjiArai 0:29be5dda6cf2 178
kenjiArai 0:29be5dda6cf2 179 int16_t dt_adc16;
kenjiArai 0:29be5dda6cf2 180 float dt_adc_f;
kenjiArai 0:29be5dda6cf2 181
kenjiArai 0:29be5dda6cf2 182 };
kenjiArai 0:29be5dda6cf2 183
kenjiArai 2:bb3efa8c5b23 184 #endif // MCP3427_H