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;
}
-
2Why 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.lornix– lornix2017年01月09日 08:41:24 +00:00Commented 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.JRobert– JRobert2017年01月09日 16:23:23 +00:00Commented Jan 9, 2017 at 16:23
2 Answers 2
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.
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;
}