UppSense17- Open Source sensor for chemical analysis based on fuoresence.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

167 lines
4.1 KiB

/*
* ADS101x.cpp
*
* Created on: Jul 20, 2017
* Author: Elmar
*/
#include "ads101x.h"
#include <SmingCore/Wire.h>
namespace rijnfel {
namespace ads {
static const uint16_t OS_POS = 15;
static const uint16_t OS_MASK = 1 << OS_POS;
static const uint16_t MUX_POS = 12;
static const uint16_t MUX_MASK = 7 << MUX_POS;
static const uint16_t PGA_POS = 9;
static const uint16_t PGA_MASK = 7 << PGA_POS;
static const uint16_t MODE_POS = 8;
static const uint16_t MODE_MASK = 1 << MODE_POS;
static const uint16_t DR_POS = 5;
static const uint16_t DR_MASK = 7 << DR_POS;
#define OS_BIT(val) ((val << OS_POS) & OS_MASK)
#define MUX_BIT(val) ((val << MUX_POS) & MUX_MASK)
#define PGA_BIT(val) ((val << PGA_POS) & PGA_MASK)
#define MODE_BIT(val) ((val << MODE_POS) & MODE_MASK)
#define DR_BIT(val) ((val << DR_POS) & DR_MASK)
static const uint8_t REGISTER_CONVERSION = 0;
static const uint8_t REGISTER_CONFIG = 1;
static const uint8_t REGISTER_LOW_TRESHOLD = 2;
static const uint8_t REGISTER_HIGH_TRESHOLD = 2;
cADS101x::cADS101x(uint8_t i_address) :
m_address(i_address), m_readyPin(0) {
SetDefaults();
}
cADS101x::cADS101x(uint8_t i_readyPin, uint8_t i_address) :
m_address(i_address), m_readyPin(i_readyPin) {
SetDefaults();
}
void cADS101x::SetOneShot(bool i_oneShot) {
m_oneShot = i_oneShot;
WriteSettings(CreateSettings(0));
}
void cADS101x::SetGain(enum eGainAmplifier i_gain) {
m_gain = i_gain;
WriteSettings(CreateSettings(0));
}
void cADS101x::SetMux(enum eInputMux i_mux) {
m_mux = i_mux;
WriteSettings(CreateSettings(0));
}
void cADS101x::SetSampleSpeed(enum eSampleSpeed i_sampleSpeed) {
m_sampleSpeed = i_sampleSpeed;
WriteSettings(CreateSettings(0));
}
void cADS101x::WaitSample(void) {
OneShot();
uint16 readSettings = 0;
do {
readSettings = GetSettings();
} while (readSettings & OS_MASK != 1);
}
bool cADS101x::IsReady(void) {
return (GetSettings() & OS_MASK);
}
uint16_t cADS101x::CreateSettings(uint8_t start) {
return OS_BIT(start) | MUX_BIT(m_mux) | PGA_BIT(m_gain)
| MODE_BIT(m_oneShot) | DR_BIT(m_sampleSpeed);
}
void cADS101x::WriteSettings(uint16_t i_settings) {
Wire.beginTransmission(m_address);
Wire.write(REGISTER_CONFIG);
Wire.write((uint8_t) (i_settings >> 8));
Wire.write((uint8_t) (i_settings & 0xFF));
Wire.endTransmission();
}
void cADS101x::OneShot(void) {
if (m_oneShot) {
uint16_t settings = CreateSettings(1);
WriteSettings(settings);
}
}
uint16_t cADS101x::GetSettings(void) {
uint16_t settings;
Wire.beginTransmission(m_address);
Wire.write(REGISTER_CONFIG);
Wire.endTransmission();
Wire.beginTransmission(m_address);
Wire.requestFrom((int) m_address, 2); //16 bits
settings = Wire.read() << 8;
settings |= Wire.read();
return settings;
}
ads_voltage_t cADS101x::ConvertSample(ads_sample_t & sample) {
//Raw sample is in (parts of) millivolts, go to micro to remove fractions
ads_voltage_t returnType = (sample.rawSample >> 4) * 1000; //Multiply for extra precision
switch (sample.gain) {
case eGainAmplifier::FSR_0_256:
//one lsb is 0.256 mv = 256 uv
returnType *= 256;
break;
case eGainAmplifier::FSR_0_512:
//one lsb is 0.512 mv = 512 uv
returnType *= 512;
break;
case eGainAmplifier::FSR_1_024:
//one lsb is 1.024 mv = 1024 uv
returnType *= 1024;
break;
case eGainAmplifier::FSR_2_048:
//one lsb is 2.048 mv = 2048 uv
returnType *= 2048;
break;
case eGainAmplifier::FSR_4_096:
//one lsb is 4.096 mv = 4096 uv
returnType *= 4096;
break;
case eGainAmplifier::FSR_6_144:
//one lsb is 6.144 mv = 6144 uv
returnType *= 6144;
break;
}
return returnType;
}
ads_sample_t cADS101x::RawSample(void) {
OneShot();
ads_sample_t sample;
Wire.beginTransmission(m_address);
Wire.write(REGISTER_CONVERSION);
Wire.endTransmission();
Wire.beginTransmission(m_address);
Wire.requestFrom((int) m_address, 2); //16 bits
sample.rawSample = Wire.read() << 8;
sample.rawSample |= Wire.read();
sample.gain = m_gain;
sample.mux = m_mux;
m_latestSample = sample;
return sample;
}
void cADS101x::SetDefaults(void) {
m_mux = eInputMux::AIN_0_1;
m_gain = eGainAmplifier::FSR_2_048;
m_sampleSpeed = eSampleSpeed::SPS_1600;
m_oneShot = true;
}
}
}