HI Alvaro, Thanks for sharing! I've placed it in code block below for better formatting. #include #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
↧