Microchip MCP342x ADC library
mcp342x.cpp@0:7dbf7356da6b, 2016-06-15 (annotated)
- Committer:
- antoniogonzalez
- Date:
- Wed Jun 15 10:37:24 2016 +0000
- Revision:
- 0:7dbf7356da6b
- Child:
- 1:c4da9889ff85
First commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
antoniogonzalez | 0:7dbf7356da6b | 1 | #include "mcp342x.h" |
antoniogonzalez | 0:7dbf7356da6b | 2 | |
antoniogonzalez | 0:7dbf7356da6b | 3 | #define LEN_ONE_BYTE 1 |
antoniogonzalez | 0:7dbf7356da6b | 4 | #define REQUEST_N_BYTES 4 |
antoniogonzalez | 0:7dbf7356da6b | 5 | |
antoniogonzalez | 0:7dbf7356da6b | 6 | MCP342x::MCP342x(I2C *i2c, uint8_t device_address) |
antoniogonzalez | 0:7dbf7356da6b | 7 | { |
antoniogonzalez | 0:7dbf7356da6b | 8 | // The address byte is the device code (4 bits, hardcoded in |
antoniogonzalez | 0:7dbf7356da6b | 9 | // factory) and the device address (3 bits). These are shifted one |
antoniogonzalez | 0:7dbf7356da6b | 10 | // bit to the left because mbed uses 8-bit addresses. |
antoniogonzalez | 0:7dbf7356da6b | 11 | _address = (_device_code << 4) | (device_address << 1); |
antoniogonzalez | 0:7dbf7356da6b | 12 | _i2c = i2c; |
antoniogonzalez | 0:7dbf7356da6b | 13 | // Initialise to default settings. |
antoniogonzalez | 0:7dbf7356da6b | 14 | set_channel(CHANNEL_1); |
antoniogonzalez | 0:7dbf7356da6b | 15 | set_resolution(RESOLUTION_12); |
antoniogonzalez | 0:7dbf7356da6b | 16 | set_pga(PGA_1); |
antoniogonzalez | 0:7dbf7356da6b | 17 | } |
antoniogonzalez | 0:7dbf7356da6b | 18 | |
antoniogonzalez | 0:7dbf7356da6b | 19 | void MCP342x::set_channel(mcp342x_channel_t channel) |
antoniogonzalez | 0:7dbf7356da6b | 20 | { |
antoniogonzalez | 0:7dbf7356da6b | 21 | _configuration[0] &= REG_CHANNEL_Clear; |
antoniogonzalez | 0:7dbf7356da6b | 22 | _configuration[0] |= channel << REG_CHANNEL_Pos; |
antoniogonzalez | 0:7dbf7356da6b | 23 | _write_configuration(); |
antoniogonzalez | 0:7dbf7356da6b | 24 | } |
antoniogonzalez | 0:7dbf7356da6b | 25 | |
antoniogonzalez | 0:7dbf7356da6b | 26 | void MCP342x::set_conversion_mode(mcp342x_conversion_mode_t mode) |
antoniogonzalez | 0:7dbf7356da6b | 27 | { |
antoniogonzalez | 0:7dbf7356da6b | 28 | _configuration[0] &= REG_MODE_Clear; |
antoniogonzalez | 0:7dbf7356da6b | 29 | _configuration[0] |= mode << REG_MODE_Pos; |
antoniogonzalez | 0:7dbf7356da6b | 30 | _write_configuration(); |
antoniogonzalez | 0:7dbf7356da6b | 31 | } |
antoniogonzalez | 0:7dbf7356da6b | 32 | |
antoniogonzalez | 0:7dbf7356da6b | 33 | void MCP342x::set_resolution(mcp342x_resolution_t resolution) |
antoniogonzalez | 0:7dbf7356da6b | 34 | { |
antoniogonzalez | 0:7dbf7356da6b | 35 | switch(resolution) { |
antoniogonzalez | 0:7dbf7356da6b | 36 | case RESOLUTION_12: |
antoniogonzalez | 0:7dbf7356da6b | 37 | _resolution = 12; |
antoniogonzalez | 0:7dbf7356da6b | 38 | break; |
antoniogonzalez | 0:7dbf7356da6b | 39 | case RESOLUTION_14: |
antoniogonzalez | 0:7dbf7356da6b | 40 | _resolution = 14; |
antoniogonzalez | 0:7dbf7356da6b | 41 | break; |
antoniogonzalez | 0:7dbf7356da6b | 42 | case RESOLUTION_16: |
antoniogonzalez | 0:7dbf7356da6b | 43 | _resolution = 16; |
antoniogonzalez | 0:7dbf7356da6b | 44 | break; |
antoniogonzalez | 0:7dbf7356da6b | 45 | case RESOLUTION_18: |
antoniogonzalez | 0:7dbf7356da6b | 46 | _resolution = 18; |
antoniogonzalez | 0:7dbf7356da6b | 47 | break; |
antoniogonzalez | 0:7dbf7356da6b | 48 | } |
antoniogonzalez | 0:7dbf7356da6b | 49 | _configuration[0] &= REG_RESOLUTION_Clear; |
antoniogonzalez | 0:7dbf7356da6b | 50 | _configuration[0] |= resolution << REG_RESOLUTION_Pos; |
antoniogonzalez | 0:7dbf7356da6b | 51 | _write_configuration(); |
antoniogonzalez | 0:7dbf7356da6b | 52 | } |
antoniogonzalez | 0:7dbf7356da6b | 53 | |
antoniogonzalez | 0:7dbf7356da6b | 54 | void MCP342x::set_pga(mcp342x_pga_t pga) |
antoniogonzalez | 0:7dbf7356da6b | 55 | { |
antoniogonzalez | 0:7dbf7356da6b | 56 | switch(pga) { |
antoniogonzalez | 0:7dbf7356da6b | 57 | case PGA_1: |
antoniogonzalez | 0:7dbf7356da6b | 58 | _pga = 1; |
antoniogonzalez | 0:7dbf7356da6b | 59 | break; |
antoniogonzalez | 0:7dbf7356da6b | 60 | case PGA_2: |
antoniogonzalez | 0:7dbf7356da6b | 61 | _pga = 2; |
antoniogonzalez | 0:7dbf7356da6b | 62 | break; |
antoniogonzalez | 0:7dbf7356da6b | 63 | case PGA_4: |
antoniogonzalez | 0:7dbf7356da6b | 64 | _pga = 4; |
antoniogonzalez | 0:7dbf7356da6b | 65 | break; |
antoniogonzalez | 0:7dbf7356da6b | 66 | case PGA_8: |
antoniogonzalez | 0:7dbf7356da6b | 67 | _pga = 8; |
antoniogonzalez | 0:7dbf7356da6b | 68 | break; |
antoniogonzalez | 0:7dbf7356da6b | 69 | } |
antoniogonzalez | 0:7dbf7356da6b | 70 | _configuration[0] &= REG_PGA_Clear; |
antoniogonzalez | 0:7dbf7356da6b | 71 | _configuration[0] |= pga << REG_PGA_Pos; |
antoniogonzalez | 0:7dbf7356da6b | 72 | _write_configuration(); |
antoniogonzalez | 0:7dbf7356da6b | 73 | } |
antoniogonzalez | 0:7dbf7356da6b | 74 | |
antoniogonzalez | 0:7dbf7356da6b | 75 | void MCP342x::_write_configuration() |
antoniogonzalez | 0:7dbf7356da6b | 76 | { |
antoniogonzalez | 0:7dbf7356da6b | 77 | _i2c->write(_address, _configuration, LEN_ONE_BYTE); |
antoniogonzalez | 0:7dbf7356da6b | 78 | } |
antoniogonzalez | 0:7dbf7356da6b | 79 | |
antoniogonzalez | 0:7dbf7356da6b | 80 | float MCP342x::read_volts(){ |
antoniogonzalez | 0:7dbf7356da6b | 81 | long adc_value = read(); |
antoniogonzalez | 0:7dbf7356da6b | 82 | float volts = 0.0; |
antoniogonzalez | 0:7dbf7356da6b | 83 | float lsb = 2 * 2.048 / 2^_resolution; |
antoniogonzalez | 0:7dbf7356da6b | 84 | int max_code = 2^(_resolution-1) - 1; |
antoniogonzalez | 0:7dbf7356da6b | 85 | |
antoniogonzalez | 0:7dbf7356da6b | 86 | if (adc_value > max_code) { |
antoniogonzalez | 0:7dbf7356da6b | 87 | volts = (~adc_value & max_code) + 1; |
antoniogonzalez | 0:7dbf7356da6b | 88 | volts *= -1; |
antoniogonzalez | 0:7dbf7356da6b | 89 | } else { |
antoniogonzalez | 0:7dbf7356da6b | 90 | volts = (float)adc_value; |
antoniogonzalez | 0:7dbf7356da6b | 91 | } |
antoniogonzalez | 0:7dbf7356da6b | 92 | |
antoniogonzalez | 0:7dbf7356da6b | 93 | return volts * lsb/(float)_pga; |
antoniogonzalez | 0:7dbf7356da6b | 94 | } |
antoniogonzalez | 0:7dbf7356da6b | 95 | |
antoniogonzalez | 0:7dbf7356da6b | 96 | long MCP342x::read() |
antoniogonzalez | 0:7dbf7356da6b | 97 | { |
antoniogonzalez | 0:7dbf7356da6b | 98 | char raw_data[REQUEST_N_BYTES]; |
antoniogonzalez | 0:7dbf7356da6b | 99 | long adc_value = 0; |
antoniogonzalez | 0:7dbf7356da6b | 100 | |
antoniogonzalez | 0:7dbf7356da6b | 101 | _i2c->read(_address, raw_data, REQUEST_N_BYTES); |
antoniogonzalez | 0:7dbf7356da6b | 102 | |
antoniogonzalez | 0:7dbf7356da6b | 103 | switch (_resolution) { |
antoniogonzalez | 0:7dbf7356da6b | 104 | case 12: |
antoniogonzalez | 0:7dbf7356da6b | 105 | adc_value = (raw_data[1] << 8) | raw_data[0]; |
antoniogonzalez | 0:7dbf7356da6b | 106 | adc_value &= 0xfff; |
antoniogonzalez | 0:7dbf7356da6b | 107 | break; |
antoniogonzalez | 0:7dbf7356da6b | 108 | |
antoniogonzalez | 0:7dbf7356da6b | 109 | case 14: |
antoniogonzalez | 0:7dbf7356da6b | 110 | adc_value = (raw_data[1] << 8) | raw_data[0]; |
antoniogonzalez | 0:7dbf7356da6b | 111 | adc_value &= 0x3fff; |
antoniogonzalez | 0:7dbf7356da6b | 112 | break; |
antoniogonzalez | 0:7dbf7356da6b | 113 | |
antoniogonzalez | 0:7dbf7356da6b | 114 | case 16: |
antoniogonzalez | 0:7dbf7356da6b | 115 | adc_value = (raw_data[1] << 8) | raw_data[0]; |
antoniogonzalez | 0:7dbf7356da6b | 116 | adc_value &= 0xffff; |
antoniogonzalez | 0:7dbf7356da6b | 117 | break; |
antoniogonzalez | 0:7dbf7356da6b | 118 | |
antoniogonzalez | 0:7dbf7356da6b | 119 | case 18: |
antoniogonzalez | 0:7dbf7356da6b | 120 | adc_value = (raw_data[2] << 16) | (raw_data[1] << 8) | raw_data[0]; |
antoniogonzalez | 0:7dbf7356da6b | 121 | adc_value &= 0x3ffff; |
antoniogonzalez | 0:7dbf7356da6b | 122 | break; |
antoniogonzalez | 0:7dbf7356da6b | 123 | } |
antoniogonzalez | 0:7dbf7356da6b | 124 | return adc_value; |
antoniogonzalez | 0:7dbf7356da6b | 125 | } |