0

I'm trying out a new ADC, ADS1262, below is the code. I want to discard the first voltage reading.

*/
#include <SPI.h>
#include <SoftwareSerial.h>
#include <math.h>
#include <ads1262.h>
#define PGA 1 // Programmable Gain = 1
#define VREF 2.50 // Internal reference of 2.048V
#define VFSR VREF/PGA 
#define FSR (((long int)1<<23)-1) 
ads1262 PC_ADS1262; // class
float volt_V=0;
float volt_mV=0;
volatile int i;
volatile char SPI_RX_Buff[10];
volatile long ads1262_rx_Data[10];
volatile static int SPI_RX_Buff_Count = 0;
volatile char *SPI_RX_Buff_Ptr;
volatile int Responsebyte = false;
volatile signed long sads1262Count = 0;
volatile signed long uads1262Count=0;
double resolution;
void setup() 
{
 // initalize the data ready and chip select pins:
 pinMode(ADS1262_DRDY_PIN, INPUT); //data ready input line
 pinMode(ADS1262_CS_PIN, OUTPUT); //chip enable output line
 pinMode(ADS1262_START_PIN, OUTPUT); // start 
 pinMode(ADS1262_PWDN_PIN, OUTPUT); // Power down output 
 Serial.begin(9600);
 //initalize ADS1292 slave
 PC_ADS1262.ads1262_Init(); // initialise ads1262
 Serial.println("ads1262 Initialised successfully....");
 }
void loop() 
{
 volatile int i,data;
 if((digitalRead(ADS1262_DRDY_PIN)) == LOW) // monitor Data ready(DRDY pin)
 { 
 SPI_RX_Buff_Ptr = PC_ADS1262.ads1262_Read_Data(); // read 6 bytes conversion register
 Responsebyte = true ; 
 }
 if(Responsebyte == true)
 {
 for(i = 0; i <5; i++)
 {
 SPI_RX_Buff[SPI_RX_Buff_Count++] = *(SPI_RX_Buff_Ptr + i); 
 }
 Responsebyte = false;
 }
 if(SPI_RX_Buff_Count >= 5)
 { 
 ads1262_rx_Data[0]= (unsigned char)SPI_RX_Buff[1]; // read 4 bytes adc count
 ads1262_rx_Data[1]= (unsigned char)SPI_RX_Buff[2];
 ads1262_rx_Data[2]= (unsigned char)SPI_RX_Buff[3];
 ads1262_rx_Data[3]= (unsigned char)SPI_RX_Buff[4];
 uads1262Count = (signed long) (((unsigned long)ads1262_rx_Data[0]<<24)| ((unsigned long)ads1262_rx_Data[1]<<16)|(ads1262_rx_Data[2]<<8)| ads1262_rx_Data[3]);//get the raw 32-bit adc count out by shifting
 sads1262Count = (signed long) (uads1262Count); // get signed value
 resolution = (double)((double)VREF/pow(2,31)); //resolution= Vref/(2^n-1) , Vref=2.5, n=no of bits
// Serial.print(resolution,15);
 volt_V = (resolution)*(float)sads1262Count; // voltage = resolution * adc count
 Serial.print(volt_V,8);
 }
 SPI_RX_Buff_Count = 0;
}
float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
{
 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
} 
asked Jan 8, 2017 at 21:38
2
  • 2
    Why not just read the voltage reading once in setup()? Right after the init. A dummy read there, and then no extra variables or logic in the loop() code. Simple enough. Or even make the 'get a reading' code into a function/subroutine. Call it once at the end of the setup() function, first reading is eaten and call 'get a reading' function in loop() as desired. Again, no extra variables or logic required. Commented Jan 9, 2017 at 8:41
  • @lornix: Simplest solution so far! As a matter of practice in any project using an A/D, I read it couple of times as part of its setup and again after any configuration change. Commented Jan 9, 2017 at 16:23

2 Answers 2

1

Here is what the code shown in the other answer will do.

int read_first = 0;

That allocates read_first and sets it to zero.

if (read_first ) {
 volt_V = (resolution)*(float)sads1262Count; // voltage = resolution * adc count
 Serial.print(volt_V,8);
}
else {
 // discarded first result, now we've read the first one
 read_first = 1;
}

First time in, read_first evaluates false, so the else branch will be taken, and read_first set to 1. Note that no reading has been taken yet, so the "// discarded first result, now we've read the first one" comment is incorrect and irrelevant. Second and later times in, read_first evaluates true, so volt_V readings will be taken and printed.

To correct the problems with that code, use an approach like the following.

int useReading = 0;
...
volt_V = resolution*(float)sads1262Count;
if (useReading ) {
 Serial.print(volt_V,8);
 // and otherwise use the reading as desired
}
useReading = 1;

After this takes a first reading, it doesn't use that reading because useReading evaluates false. Subsequent readings get used because useReading is turned on after the first reading.

answered Jan 9, 2017 at 1:39
3

Simplest way is to have a flag to specify whether you've read the first reading or not. Default to zero:

int read_first = 0;

Then you can say:

if (read_first ) {
 volt_V = (resolution)*(float)sads1262Count; // voltage = resolution * adc count
 Serial.print(volt_V,8);
}
else {
 // discarded first result, now we've read the first one
 read_first = 1;
}
answered Jan 8, 2017 at 21:43

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.