ADS1100 I2C 16bit ADC driver
Diff: ADS1100.cpp
- Revision:
- 0:5198300978ab
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ADS1100.cpp Mon Jul 23 12:58:05 2018 +0000 @@ -0,0 +1,70 @@ +#include "ADS1100.h" + +#define ADS1100_DR_BIT 2 +#define ADS1100_SC_BIT 4 +#define ADS1100_ST_BIT 7 +#define ADS1100_BSY_BIT 7 + +ADS1100::ADS1100(I2C* i2c, char ad):_i2c(i2c){ + _addr = I2C_ADDR | (ad<<1); + config(false, 8, 1); +} + +float ADS1100::read(float vdd){ + int max = -_minCode * _gain; + return double(read_s16()) * vdd / double(max); +} + +short ADS1100::read_s16(void){ + return readReg(&_config); +} + +short ADS1100::readReg(char* config){ + char buf[3]; + _i2c->read(_addr,buf,3); + *config = buf[2]; + return (buf[0]<<8) | (buf[1]&0xff); +} + +void ADS1100::config(bool single, char rate, char gain){ + for(_config=0; _config<4; _config++){ + if(1==(gain>>_config)){ + break; + } + } + switch (rate){ + case 128: + _config |= 0 << ADS1100_DR_BIT; + _minCode = -2048; + break; + case 32: + _config |= 1 << ADS1100_DR_BIT; + _minCode = -8192; + break; + case 16: + _config |= 2 << ADS1100_DR_BIT; + _minCode = -16384; + break; + case 8: + _config |= 3 << ADS1100_DR_BIT; + _minCode = -32768; + break; + default: + _config |= 3 << ADS1100_DR_BIT; + _minCode = -32768; + break; + }; + _config |= single << ADS1100_SC_BIT; + _i2c->write(_addr, &_config, 1); + _gain = gain; +} + +void ADS1100::startConvert(void){ + _config |= 1<<ADS1100_BSY_BIT; + _i2c->write(_addr, &_config, 1); +} + +bool ADS1100::busy(void){ + readReg(&_config); + return _config & (1<<ADS1100_BSY_BIT); +}