Hello, I would like to use this board for two differential connections Vin and GND for a very sensitive Photodiode. I was unsure which inputs to use. I believe A0 is 3.3V and A1 is ground for device one and A2 is 3.3V with A3 being ground. I was unsure looking at the schematic.
https://www.sparkfun.com/products/17059 You can find a quick hookup note on this product page
Does anyone have experience using more than one of these? I attempted to initialize each one and then read the raw voltage but I am getting an identical value for each of the sensors.
SFE_ADS122C04 mySensor;
void setup() {
Serial.begin(115200);
while (!Serial)
; //Wait for user to open terminal
Serial.println(F("ADC TEST"));
Wire.begin();
if (mySensor.begin(0x45, Wire) == false) // U1 Address 0x45
{
Serial.println(F("Device not detected at I2C address. Please check wiring and Reset"));
while (1)
;
}
mySensor.configureADCmode(ADS122C04_RAW_MODE); // Configure the PT100 for raw mode
if (mySensor.begin(0x41, Wire) == false) // U2 Address 0x41
{
Serial.println(F("Device not detected at I2C address. Please check wiring and Reset"));
while (1)
;
}
mySensor.configureADCmode(ADS122C04_RAW_MODE); // Configure the PT100 for raw mode
if (mySensor.begin(0x40, Wire) == false) // U3 Address 0x40
{
Serial.println(F("Device not detected at I2C address. Please check wiring and Reset"));
while (1)
;
}
mySensor.configureADCmode(ADS122C04_RAW_MODE); // Configure the PT100 for raw mode
}
void loop() {
/////////////////////////////////// Sensor U1 ////////////////////////////////////////////////
mySensor.begin(0x45, Wire);
buttonState = digitalRead(buttonPin);
// Get the raw voltage as int32_t
int32_t raw_v = mySensor.readRawVoltage();
// Convert to Volts (method 1)
voltsA = ((float)raw_v) * 244.14e-9;
// Convert to Volts (method 2)
voltsB = ((float)raw_v) / 4096000;
volts_1 = voltsA * -1;
volts_2 = voltsB * -1;
//mySensor.endTransmission();
/////////////////////////////////// Sensor U2 ////////////////////////////////////////////////
mySensor.begin(0x41, Wire);
buttonState = digitalRead(buttonPin);
// Get the raw voltage as int32_t
int32_t raw_v = mySensor.readRawVoltage();
// Convert to Volts (method 1)
voltsA = ((float)raw_v) * 244.14e-9;
// Convert to Volts (method 2)
voltsB = ((float)raw_v) / 4096000;
volts_3 = voltsA * -1;
volts_4 = voltsB * -1;
//mySensor.endTransmission();
/////////////////////////////////// Sensor U3 /////////////////////////////////////
mySensor.begin(0x40, Wire);
buttonState = digitalRead(buttonPin);
// Get the raw voltage as int32_t
raw_v = mySensor.readRawVoltage();
// Convert to Volts (method 1)
voltsC = ((float)raw_v) * 244.14e-9;
// Convert to Volts (method 2)
voltsD = ((float)raw_v) / 4096000;
volts_5 = voltsA * -1;
volts_6 = voltsB * -1;
//mySensor.endTransmission();
Serial.print(F("The raw voltage is 0x"));
Serial.print(raw_v, HEX);
Serial.print(F("\t"));
Serial.print(volts_1, 7); // Print the voltage with 7 decimal places
Serial.println(F("V"));
Serial.print(volts_3, 7); // Print the voltage with 7 decimal places
Serial.println(F("V"));
Serial.print(volts_6, 7); // Print the voltage with 7 decimal places
Serial.println(F("V"));
delay(250); //Don't pound the I2C bus too hard
Hi BBBeck,
You will need to create a separate mySensor for each sensor. Please try:
SFE_ADS122C04 mySensor1;
SFE_ADS122C04 mySensor2;
SFE_ADS122C04 mySensor3;
if (mySensor1.begin(0x45) == false)
if (mySensor2.begin(0x41) == false)
if (mySensor3.begin(0x40) == false)
int32_t raw_v_1 = mySensor1.readRawVoltage();
int32_t raw_v_2 = mySensor2.readRawVoltage();
int32_t raw_v_3 = mySensor3.readRawVoltage();
You can delete the three extra mySensor.begin(0xnn); from your main loop. Those are redundant.
Best wishes,
Paul
Thank you so much! That worked perfectly. The issue I am now having is that I am trying to change AIN0 and AIN1 to AIN2 and AIN3 to read the other differential pair but I am not getting a reading for the second inputs
void setup() {
///////////////////////////////////////// Sensor U2 /////////////////////////////////////////////////////////
if (mySensor2.begin(0x41, Wire) == false)
{
Serial.println(F("Device not detected at I2C address. Please check wiring and Reset"));
while (1)
;
}
//mySensor2.setInputMultiplexer(ADS122C04_MUX_AIN1_AIN0); // Route AIN1 and AIN0 to AINP and AINN
mySensor2.setGain(ADS122C04_GAIN_1); // Set the gain to 1
mySensor2.enablePGA(ADS122C04_PGA_DISABLED); // Disable the Programmable Gain Amplifier
mySensor2.setDataRate(ADS122C04_DATA_RATE_20SPS); // Set the data rate (samples per second) to 20
mySensor2.setOperatingMode(ADS122C04_OP_MODE_NORMAL); // Disable turbo mode
mySensor2.setConversionMode(ADS122C04_CONVERSION_MODE_SINGLE_SHOT); // Use single shot mode
mySensor2.setVoltageReference(ADS122C04_VREF_EXT_REF_PINS); // Use external 5V reference
mySensor2.enableInternalTempSensor(ADS122C04_TEMP_SENSOR_OFF); // Disable the temperature sensor
mySensor2.setDataCounter(ADS122C04_DCNT_DISABLE); // Disable the data counter (Note: the library does not currently support the data count)
mySensor2.setDataIntegrityCheck(ADS122C04_CRC_DISABLED); // Disable CRC checking (Note: the library does not currently support data integrity checking)
mySensor2.setBurnOutCurrent(ADS122C04_BURN_OUT_CURRENT_OFF); // Disable the burn-out current
mySensor2.setIDACcurrent(ADS122C04_IDAC_CURRENT_OFF); // Disable the IDAC current
mySensor2.setIDAC1mux(ADS122C04_IDAC1_DISABLED); // Disable IDAC1
mySensor2.setIDAC2mux(ADS122C04_IDAC2_DISABLED); // Disable IDAC2
}
void loop() {
mySensor2.setInputMultiplexer(ADS122C04_MUX_AIN0_AIN1); // Set U2 MUX AIN2 and AIN3 to AINP and AINN
// Get the raw voltage as int32_t
int32_t raw_v_2 = mySensor2.readRawVoltage();
/////// Change MUX settings to read from AI2 and AIN3
mySensor2.setInputMultiplexer(ADS122C04_MUX_AIN2_AIN3); // Set U2 MUX AIN2 and AIN3 to AINP and AINN
int32_t raw_v_5 = mySensor2.readRawVoltage();
// Convert to Volts using 5V external reference
volts2 = ((float)raw_v_2) * 596.05e-9; ///for U2 ALT MUX
// Convert to Volts
volts5 = ((float)raw_v_5) * 596.05e-9; ///for U1 ALT MUX
Hi BBBeck,
Can you upload a sketch of your circuit?
It is not clear to me how you have connected your signals to AIN2 and AIN3. Are you using the Qwiic PT100 board - and are you using one half of the B split pad to connect to AIN2?
Are you powering the board from 3.3V or 5V?
Best wishes,
Paul
I removed Jumper A and B and soldered wire to the pad. The signal to AIN2 and GND to AIN3 . I am using 5V, my only known issue is not being able to switch between reading the Analog Inputs. When I used debug mode as shown in the Sparkfun Library it jumps between the input mux modes instead of staying on one then switching.
Hi BBBeck,
I think I see your problem…
readRawVoltage calls configureADCmode(ADS122C04_RAW_MODE)
https://github.com/sparkfun/SparkFun_AD … y.cpp#L385
which will set the mux back to AIN1/AIN0
https://github.com/sparkfun/SparkFun_AD … y.cpp#L204
You will need to call readADC instead and do your own data conversion to convert back to voltage… Please see Example9 for more details:
https://github.com/sparkfun/SparkFun_AD … Config.ino
Best wishes,
Paul
Paul you are amazing! Thank you so much for taking the time to help me out!