This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

ADS7128: Example ADS7128 using ESP32

Part Number: ADS7128


Tool/software:

Hi guys:
I want to leave an example of use of the ADS7128 inverter applied to an ESP32.
I hope this example is helpful for those who are starting out with this converter.

#include <Wire.h>
#include "ADS7128.h"
#include "Arduino.h"
#define ADS7128_H
#define ADS7128_DBUG

//Pone en 1 un bit dado
void Setbit(uint8_t reg, uint8_t data) {
    Wire.beginTransmission(ADS7128_ADDR);
    Wire.write(0x18);  
    Wire.write(reg);     // Dirección del registro
    Wire.write(1<<data);    // Valor a escribir
    Wire.endTransmission();
}
//Pone en 0 un bit dado
void Clearbit(uint8_t reg, uint8_t data) {
    Wire.beginTransmission(ADS7128_ADDR);
    Wire.write(0x20);  
    Wire.write(reg);     // Dirección del registro
    Wire.write(1<<data);    // Valor a escribir
    Wire.endTransmission();
}


// Función para escribir en un registro del ADS7128
void escribirRegistro(uint8_t reg, uint8_t data) {
    Wire.beginTransmission(ADS7128_ADDR);
    Wire.write(0x08);  
    Wire.write(reg);     // Dirección del registro
    Wire.write(data);    // Valor a escribir
    Wire.endTransmission();
}

// Función para leer un registro del ADS7128
uint8_t leerRegistro(uint8_t reg) {
  uint8_t dato;
    Wire.beginTransmission(ADS7128_ADDR);
    Wire.write(0x10);
    Wire.write(reg);    
    Wire.endTransmission(false); // No liberar el bus para continuar leyendo

    Wire.requestFrom(ADS7128_ADDR, 1); // Pedir 1 byte
    if (Wire.available()) {
        dato= Wire.read();  // Retorna el valor leído
    }
    else
    {
      dato=0xFF;  // Retorna 0xFF en caso de error
    }
//     Wire.end();
   return dato;  
}

// Función para leer el valor de un canal del ADC
uint16_t leerCanalADC(uint8_t canal) {
    escribirRegistro(0x01, canal);  // Seleccionar el canal a leer
    delay(10);  // Esperar la conversión

    uint8_t msb = leerRegistro(0x10);  // Leer byte alto
    uint8_t lsb = leerRegistro(0x11);  // Leer byte bajo

    return (msb << 8) | lsb;  // Unir bytes para obtener el valor de 12 bits
}

// Función para configurar el ADS7128 (ejemplo: habilitar el ADC)
uint8_t configurarADS7128() {
int16_t i,j;
  Wire.begin();
   
    i=leerRegistro(SYSTEM_STATUS);
    if(i!=0xFF)
    {

      Setbit(SYSTEM_STATUS,BOR_BIT);
/*      leerRegistro(SYSTEM_STATUS);
      //Configura pin7 como salida para energizar el modem
      escribirRegistro(PIN_CFG, 0x80);  // Configura canal 8 como GPIO7
      escribirRegistro(GPIO_CFG, 0x80);  // Configura GPIO7 como salida
      escribirRegistro(GPO_DRIVE_CFG, 0x00);  // Configura salida GPIO7 como OPEN-DRINE
   
      escribirRegistro(GPO_VALUE, 0x80);  // Cambia estado salida GPIO7 a alto (energiza modem)
*/
      //Paso 1
      //RMS en CH0, no restar CC, muestras = 1024
      escribirRegistro(RMS_CFG,RMS_CHID_CH0|RMS_SAMPLES_1024|RMS_DC_SUB);
     
      //Paso 2
      //RMS_EN, Sin CRC, STATS_EN, Sin comparador
      //Inicio de conversión normal, configuración de canal predeterminada, sin calibración, sin reinicio
      escribirRegistro(GENERAL_CFG,RMS_EN);

      //Paso 3
      //MODO_SEQ = '00'
      //No es necesario escribir, funciona por defecto
      escribirRegistro(SEQUENCE_CFG,0x00);

      //Paso 4
      //MANUAL_CHID = '00' Seleccione AIN0
      //No es necesario escribir, funciona por defecto
      escribirRegistro(CHANNEL_SEL,0x00);

      //Paso 5
      //No es necesario escribir, funciona por defecto
      //escribirRegistro(GPIO_CFG,0x00);
      for(j=0;j<3;j++)
      {
      //Paso 6
      //Iniciar una conversión de lectura
       Wire.requestFrom(ADS7128_ADDR, 2); // Pedir 1 byte
      //Wire.beginTransmission(ADS7128_ADDR);

     //Paso 7
      for(i=0;i<(1024+39);i++)  
      {
        Wire.requestFrom(ADS7128_ADDR, 2);
      }      
     delay(5);
    //Paso 8
      //Pausa por temporizador o estado del monitor para RMS_DONE en bit 4 = '1'
      do{
        i=leerRegistro(SYSTEM_STATUS);
      }while((i&RMS_DONE)==0);

      //Paso 9
      //Leer el resultado RMS
      leerRegistro(RMS_LSB);
      leerRegistro(RMS_MSB);

      //Paso 10
      //Borrar el bit RMS_DONE
      Setbit(SYSTEM_STATUS,RMS_DONE_BIT);
      Clearbit(GENERAL_CFG,RMS_EN_BIT);
      delay(10);
      Setbit(GENERAL_CFG,RMS_EN_BIT);
    }




      //Paso 11
      //Deshabilitar módulo RMS
      Clearbit(GENERAL_CFG,STATS_EN_BIT);
      delay(10);
   


    }
  • HI Alvaro,

    Thanks for sharing! I've placed it in code block below for better formatting.

    #include <Wire.h>
    #include "ADS7128.h"
    #include "Arduino.h"
    #define ADS7128_H
    #define ADS7128_DBUG
    
    //Pone en 1 un bit dado
    void Setbit(uint8_t reg, uint8_t data) {
        Wire.beginTransmission(ADS7128_ADDR);
        Wire.write(0x18);  
        Wire.write(reg);     // Dirección del registro
        Wire.write(1<<data);    // Valor a escribir
        Wire.endTransmission();
    }
    //Pone en 0 un bit dado
    void Clearbit(uint8_t reg, uint8_t data) {
        Wire.beginTransmission(ADS7128_ADDR);
        Wire.write(0x20);  
        Wire.write(reg);     // Dirección del registro
        Wire.write(1<<data);    // Valor a escribir
        Wire.endTransmission();
    }
    
    
    // Función para escribir en un registro del ADS7128
    void escribirRegistro(uint8_t reg, uint8_t data) {
        Wire.beginTransmission(ADS7128_ADDR);
        Wire.write(0x08);  
        Wire.write(reg);     // Dirección del registro
        Wire.write(data);    // Valor a escribir
        Wire.endTransmission();
    }
    
    // Función para leer un registro del ADS7128
    uint8_t leerRegistro(uint8_t reg) {
      uint8_t dato;
        Wire.beginTransmission(ADS7128_ADDR);
        Wire.write(0x10);
        Wire.write(reg);    
        Wire.endTransmission(false); // No liberar el bus para continuar leyendo
    
        Wire.requestFrom(ADS7128_ADDR, 1); // Pedir 1 byte
        if (Wire.available()) {
            dato= Wire.read();  // Retorna el valor leído
        }
        else
        {
          dato=0xFF;  // Retorna 0xFF en caso de error
        }
    //     Wire.end();
       return dato;  
    }
    
    // Función para leer el valor de un canal del ADC
    uint16_t leerCanalADC(uint8_t canal) {
        escribirRegistro(0x01, canal);  // Seleccionar el canal a leer
        delay(10);  // Esperar la conversión
    
        uint8_t msb = leerRegistro(0x10);  // Leer byte alto
        uint8_t lsb = leerRegistro(0x11);  // Leer byte bajo
    
        return (msb << 8) | lsb;  // Unir bytes para obtener el valor de 12 bits
    }
    
    // Función para configurar el ADS7128 (ejemplo: habilitar el ADC)
    uint8_t configurarADS7128() {
    int16_t i,j;
      Wire.begin();
       
        i=leerRegistro(SYSTEM_STATUS);
        if(i!=0xFF)
        {
    
          Setbit(SYSTEM_STATUS,BOR_BIT);
    /*      leerRegistro(SYSTEM_STATUS);
          //Configura pin7 como salida para energizar el modem
          escribirRegistro(PIN_CFG, 0x80);  // Configura canal 8 como GPIO7
          escribirRegistro(GPIO_CFG, 0x80);  // Configura GPIO7 como salida
          escribirRegistro(GPO_DRIVE_CFG, 0x00);  // Configura salida GPIO7 como OPEN-DRINE
       
          escribirRegistro(GPO_VALUE, 0x80);  // Cambia estado salida GPIO7 a alto (energiza modem)
    */
          //Paso 1
          //RMS en CH0, no restar CC, muestras = 1024
          escribirRegistro(RMS_CFG,RMS_CHID_CH0|RMS_SAMPLES_1024|RMS_DC_SUB);
         
          //Paso 2
          //RMS_EN, Sin CRC, STATS_EN, Sin comparador
          //Inicio de conversión normal, configuración de canal predeterminada, sin calibración, sin reinicio
          escribirRegistro(GENERAL_CFG,RMS_EN);
    
          //Paso 3
          //MODO_SEQ = '00'
          //No es necesario escribir, funciona por defecto
          escribirRegistro(SEQUENCE_CFG,0x00);
    
          //Paso 4
          //MANUAL_CHID = '00' Seleccione AIN0
          //No es necesario escribir, funciona por defecto
          escribirRegistro(CHANNEL_SEL,0x00);
    
          //Paso 5
          //No es necesario escribir, funciona por defecto
          //escribirRegistro(GPIO_CFG,0x00);
          for(j=0;j<3;j++)
          {
          //Paso 6
          //Iniciar una conversión de lectura
           Wire.requestFrom(ADS7128_ADDR, 2); // Pedir 1 byte
          //Wire.beginTransmission(ADS7128_ADDR);
    
         //Paso 7
          for(i=0;i<(1024+39);i++)  
          {
            Wire.requestFrom(ADS7128_ADDR, 2);
          }      
         delay(5);
        //Paso 8
          //Pausa por temporizador o estado del monitor para RMS_DONE en bit 4 = '1'
          do{
            i=leerRegistro(SYSTEM_STATUS);
          }while((i&RMS_DONE)==0);
    
          //Paso 9
          //Leer el resultado RMS
          leerRegistro(RMS_LSB);
          leerRegistro(RMS_MSB);
    
          //Paso 10
          //Borrar el bit RMS_DONE
          Setbit(SYSTEM_STATUS,RMS_DONE_BIT);
          Clearbit(GENERAL_CFG,RMS_EN_BIT);
          delay(10);
          Setbit(GENERAL_CFG,RMS_EN_BIT);
        }
    
    
    
    
          //Paso 11
          //Deshabilitar módulo RMS
          Clearbit(GENERAL_CFG,STATS_EN_BIT);
          delay(10);
       
    
    
        }

    Regards,
    Joel