ADS1100 I2C 16bit ADC driver

Committer:
mederic
Date:
Mon Jul 23 12:58:05 2018 +0000
Revision:
0:5198300978ab
1st released

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mederic 0:5198300978ab 1 #include "ADS1100.h"
mederic 0:5198300978ab 2
mederic 0:5198300978ab 3 #define ADS1100_DR_BIT 2
mederic 0:5198300978ab 4 #define ADS1100_SC_BIT 4
mederic 0:5198300978ab 5 #define ADS1100_ST_BIT 7
mederic 0:5198300978ab 6 #define ADS1100_BSY_BIT 7
mederic 0:5198300978ab 7
mederic 0:5198300978ab 8 ADS1100::ADS1100(I2C* i2c, char ad):_i2c(i2c){
mederic 0:5198300978ab 9 _addr = I2C_ADDR | (ad<<1);
mederic 0:5198300978ab 10 config(false, 8, 1);
mederic 0:5198300978ab 11 }
mederic 0:5198300978ab 12
mederic 0:5198300978ab 13 float ADS1100::read(float vdd){
mederic 0:5198300978ab 14 int max = -_minCode * _gain;
mederic 0:5198300978ab 15 return double(read_s16()) * vdd / double(max);
mederic 0:5198300978ab 16 }
mederic 0:5198300978ab 17
mederic 0:5198300978ab 18 short ADS1100::read_s16(void){
mederic 0:5198300978ab 19 return readReg(&_config);
mederic 0:5198300978ab 20 }
mederic 0:5198300978ab 21
mederic 0:5198300978ab 22 short ADS1100::readReg(char* config){
mederic 0:5198300978ab 23 char buf[3];
mederic 0:5198300978ab 24 _i2c->read(_addr,buf,3);
mederic 0:5198300978ab 25 *config = buf[2];
mederic 0:5198300978ab 26 return (buf[0]<<8) | (buf[1]&0xff);
mederic 0:5198300978ab 27 }
mederic 0:5198300978ab 28
mederic 0:5198300978ab 29 void ADS1100::config(bool single, char rate, char gain){
mederic 0:5198300978ab 30 for(_config=0; _config<4; _config++){
mederic 0:5198300978ab 31 if(1==(gain>>_config)){
mederic 0:5198300978ab 32 break;
mederic 0:5198300978ab 33 }
mederic 0:5198300978ab 34 }
mederic 0:5198300978ab 35 switch (rate){
mederic 0:5198300978ab 36 case 128:
mederic 0:5198300978ab 37 _config |= 0 << ADS1100_DR_BIT;
mederic 0:5198300978ab 38 _minCode = -2048;
mederic 0:5198300978ab 39 break;
mederic 0:5198300978ab 40 case 32:
mederic 0:5198300978ab 41 _config |= 1 << ADS1100_DR_BIT;
mederic 0:5198300978ab 42 _minCode = -8192;
mederic 0:5198300978ab 43 break;
mederic 0:5198300978ab 44 case 16:
mederic 0:5198300978ab 45 _config |= 2 << ADS1100_DR_BIT;
mederic 0:5198300978ab 46 _minCode = -16384;
mederic 0:5198300978ab 47 break;
mederic 0:5198300978ab 48 case 8:
mederic 0:5198300978ab 49 _config |= 3 << ADS1100_DR_BIT;
mederic 0:5198300978ab 50 _minCode = -32768;
mederic 0:5198300978ab 51 break;
mederic 0:5198300978ab 52 default:
mederic 0:5198300978ab 53 _config |= 3 << ADS1100_DR_BIT;
mederic 0:5198300978ab 54 _minCode = -32768;
mederic 0:5198300978ab 55 break;
mederic 0:5198300978ab 56 };
mederic 0:5198300978ab 57 _config |= single << ADS1100_SC_BIT;
mederic 0:5198300978ab 58 _i2c->write(_addr, &_config, 1);
mederic 0:5198300978ab 59 _gain = gain;
mederic 0:5198300978ab 60 }
mederic 0:5198300978ab 61
mederic 0:5198300978ab 62 void ADS1100::startConvert(void){
mederic 0:5198300978ab 63 _config |= 1<<ADS1100_BSY_BIT;
mederic 0:5198300978ab 64 _i2c->write(_addr, &_config, 1);
mederic 0:5198300978ab 65 }
mederic 0:5198300978ab 66
mederic 0:5198300978ab 67 bool ADS1100::busy(void){
mederic 0:5198300978ab 68 readReg(&_config);
mederic 0:5198300978ab 69 return _config & (1<<ADS1100_BSY_BIT);
mederic 0:5198300978ab 70 }