ADS1100 I2C 16bit ADC driver
ADS1100.cpp@0:5198300978ab, 2018-07-23 (annotated)
- Committer:
- mederic
- Date:
- Mon Jul 23 12:58:05 2018 +0000
- Revision:
- 0:5198300978ab
1st released
Who changed what in which revision?
User | Revision | Line number | New 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 | } |