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);
}