ADS1256 - Full demonstration

In this video I will show you how to use the ADS1256 ADC board with Arduino, how to write a code and some extra things. If you follow the tutorial, you will be able to build and operate a very good voltage logger.

I took the following library as a starting point: https://github.com/kaskavalci/ADS12xx-Library

I kept the libraries and I only wrote the Arduino project file myself to taylor the software to my needs. I recommend you to go through the video and type the code by hand, because then you can understand it. Especially the registers.

Another important link is the datasheet of the ADS1256 to understand the registers.

Wiring (general SPI connections):

A13 - SCLK

A12 - DOUT

A11 - DIN A10 - CS

A9 - Not connected

A8 - Reset

A2 - DRDY



Arduino source code

#include <SPI.h>
#include "ads12xx.h"
 
const int  START = 8;  //start pin
const int  CS = 10; //clock pin
const int  DRDY = 2; //data ready pin
//const int RESET_  = 9; //reset pin, not used
float samplingfreq;  //
 
 
ads12xx ADS;  //initialize ADS as object of the ads12xx class
 
 
void setup()
{
    //set up high baud rate for high data rates
    Serial.begin(115200);
    
    while (!Serial) {}
 
  ADS.begin(CS, START, DRDY);  //initialize ADS as object of the ads12xx class
 
  ADS.Reset(); //Reset the AD chip. Every time you see the message on the Serial Terminal, everything is set to default!
  
    delay(10); //wait a moment
 
    //preconfig
     ADS.SetRegisterValue(STATUS, B00110100);  //Autocal is ON
     ADS.SetRegisterValue(MUX, B00001000); //
     ADS.SetRegisterValue(ADCON, B00000000); //
     ADS.SetRegisterValue(DRATE, B11010000); //7500 SPS     
     ADS.SetRegisterValue(IO, B11101111); //
     ADS.SendCMD(SELFCAL); //run self calibration    
    //end of preconfig   
 
 //too high SPS will mess up the channels!
}
 
void loop() {
 
  //"start" the timer   
  double startTime = millis();
  
    if (Serial.available()) {       
    //read a character - which is a command
    char cin = Serial.read();
        //char  check = 'y';
        //uint8_t cmd;
        uint8_t cin1;
   
        switch (cin) {      
      
        //-------------------------------------------------------------------------------------------------
        //----------------READ REGISTER--------------------------------------------------------------------
      case 'r':
            //after sending r, we ask for the next input
            //Serial.println("Which Register to read?");
            while (!Serial.available());
            //Serial.print("Register Value for: ");
            cin1 = Serial.parseInt(); //cin1 is the number of the register
            //Serial.println(cin1);
            //Printing out a message and the value of the register cin1
            //Serial.println("The value of the register is:");
            Serial.println(ADS.GetRegisterValue(cin1));
            break; //break exits the case and the loop will wait for the next command to enter another case
        //-------------------------------------------------------------------------------------------------
        //----------------WRITE REGISTER-------------------------------------------------------------------
        case 'w':
            //after sending w, we ask for the next input
            //Serial.println("Which Register to write?");
            while (!Serial.available());
            cin1 = Serial.parseInt();//cin1 is the number of the register
            //Serial.println("Which Value to write?");
            while (!Serial.available());
            ADS.SetRegisterValue(cin1, Serial.parseInt());
            //cin1 register is written with the following number (whole command could be: w 3 128)
        //Serial.println("The value of the register now is:");
        //Serial.println(ADS.GetRegisterValue(cin1)); //we want to see if the value is set or not. get back the -cin1- value register's value
        break;
         //-------------------------------------------------------------------------------------------------
         //----------------SINGLE READ----------------------------------------------------------------------
        case 'R': //simple conversion result, reading the first channel in differential mode, once.
        
                ADS.SendCMD(SELFCAL); //Self calibration
                delay(200); //wait a little             
                ADS.SetRegisterValue(MUX, B00000001);//AIN0+AIN1 -- CH0
                        
        //printing the result
        Serial.println(ADS.GetConversion());
        
            break;
        //----------------------------------------------------------------------------------------------------
        //----------------SELF CALIBRATION--------------------------------------------------------------------
        case 'c': //simple one-command self calibration and offset calibration
                
                ADS.SendCMD(SELFCAL); //Self calibration
                delay(200); //wait a little
                
                                
                break;
        //-------------------------------------------------------------------------------------------------
        
    //-------------------------------------------------------------------------------------------------
    //----------------SINGLE CHANNEL ------------------------------------------------------------------
    case 's': //s: single - 8 channels (more channels, less accuracy(common ground, more noise))
                samplingfreq = Serial.parseFloat(); 
        //command looks like: "s 300".
                ADS.SendCMD(SELFCAL); //Self calibration
                delay(200); //wait a little
                
    
       ADS.SetRegisterValue(DRATE, B01100011); //50 SPS// for 1 sample / second on the PC
       
       while (Serial.read() != 'N') {
        //Elapsed time since the sw is started
        double elapsedTime = millis() - startTime;              
        //prints time since program started   
        Serial.print(elapsedTime);
        Serial.print("\t");
        ADS.SetRegisterValue(MUX, B00001000);//AIN0+AINCOM -- CH0
        Serial.print(ADS.GetConversion());
        Serial.print("\t");
        delayMicroseconds(100);
        ADS.SetRegisterValue(MUX, B00011000);//AIN1+AINCOM -- CH1
        Serial.print(ADS.GetConversion());
        Serial.print("\t");
        delayMicroseconds(100);
        ADS.SetRegisterValue(MUX, B00101000);//AIN2+AINCOM -- CH2
        Serial.print(ADS.GetConversion());
        Serial.print("\t");
        delayMicroseconds(100);
        ADS.SetRegisterValue(MUX, B00111000);//AIN3+AINCOM -- CH3
        Serial.print(ADS.GetConversion());
        Serial.print("\t");
        delayMicroseconds(100);
        ADS.SetRegisterValue(MUX, B01001000);//AIN4+AINCOM -- CH4
        Serial.print(ADS.GetConversion());
        Serial.print("\t");
        delayMicroseconds(100);
        ADS.SetRegisterValue(MUX, B01011000);//AIN5+AINCOM -- CH5
        Serial.print(ADS.GetConversion());
        Serial.print("\t");
        delayMicroseconds(100);
        ADS.SetRegisterValue(MUX, B01101000);//AIN6+AINCOM -- CH6
        Serial.print(ADS.GetConversion());
        Serial.print("\t");
        delayMicroseconds(100);
        ADS.SetRegisterValue(MUX, B01111000);//AIN7+AINCOM -- CH7
        Serial.print(ADS.GetConversion());      
        Serial.print("\n");
        //Full output: Time CH1 CH2 CH3 CH4 CH5 CH6 CH7 CH8
        delay(samplingfreq);
        }
        break;
        
        //-------------------------------------------------------------------------------------------------
        //----------------DIFFERENTIAL CHANNEL ------------------------------------------------------------
        case 'd': //d: differential - 4 channels (less channels, better accuracy (less noise))
        
        //another cin for receiving the delay 
          samplingfreq = Serial.parseFloat();
      
        //ADS.SetRegisterValue(DRATE, B11010000);  //7500 SPS// for 1 sample / second on the PC
   
       ADS.SetRegisterValue(DRATE, B01100011);
        ADS.SendCMD(SELFCAL); //Self calibration
        delay(200); //wait a little
        
        
        
       //calibration!
       while (Serial.read() != 'N') { //while we don't stop manially by sending N through the terminal....
        
        //Elapsed time since the sw is started
        double elapsedTime = millis() - startTime;              
        //prints time since program started
        Serial.print(elapsedTime);
        Serial.print("\t");
        //delayMicroseconds(50);
        //Switch on the first channel
        ADS.SetRegisterValue(MUX, B00000001);//AIN0+AIN1 -- CH0
        Serial.print(ADS.GetConversion());
        Serial.print("\t");
        //delayMicroseconds(50);
        //Switch on the second channel
        ADS.SetRegisterValue(MUX, B00100011);//AIN2+AIN3 -- CH1
        Serial.print(ADS.GetConversion());
        Serial.print("\t");
        //delayMicroseconds(50);
        //Switch on the third channel
        ADS.SetRegisterValue(MUX, B01000101);//AIN4+AIN5 -- CH2
        Serial.print(ADS.GetConversion());
        Serial.print("\t");
        //delayMicroseconds(50);
        //Switch on the fourth channel
        ADS.SetRegisterValue(MUX, B01100111);//AIN6+AIN7 -- CH3
        Serial.print(ADS.GetConversion());
        Serial.print("\n"); 
        //Final output: time CH1 CH2 CH3 CH4    
        //delay by the received sampling frequency  
        //there is some time needed for the code above to run, so real sampling frequency is slightly slower (>1%)
        delay(samplingfreq);
        
        }
        break;
        //-------------------------------------------------------------------------------------------------
       
       
        //-------------------------------------------------------------------------------------------------
        default:
        
        //?
        break;
        //-------------------------------------------------------------------------------------------------
            }
       
    }
}

Previous
Previous

First ever tensile test on a real specimen with the new machine

Next
Next

Atomic packing factor