MCP3427 16-Bit Analog-to-Digital Converter with I2C Interface
Fork of MCP3425 by
MCP3427.h@2:bb3efa8c5b23, 2018-09-21 (annotated)
- 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?
User | Revision | Line number | New 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 |