Microchip MCP342x ADC library

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?

UserRevisionLine numberNew 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 }