Medido de energía ADE7758

Muy buenas,
Me gustaría empezar a manejar el IC ADE7758 con arduino.
Para eso quiero empezar a medir la temperatura con el pero mis conocimientos son básicos.
¿Cual sería el esquema de conexión con arduino?
Se que el el puerto del IC para esta finalidad es el 0x11 pero no encuentro mucha información.
Muchas gracias.

EDITADO:
Muy buenas,

Me gustaría realizar un medidor de energía utilizando arduino y IC ADE7758 http://www.analog.com/media/en/technical-documentation/data-sheets/ADE7758.pdf

Para ello lo primero que me gustaría hacer es medir la temperatura ya que este trae un sensor.
He realizado la conexión SPI

De momento lo he conectado el ADE7758 con arduino Dropbox - File Deleted

El código que he utilizado compila pero no obtengo valores lógicos:

#include <SPI.h>

#define CS 10

void setup() {
Serial.begin(9600);


pinMode(CS,OUTPUT);
// disable ADE7758 SPI
digitalWrite(CS,HIGH);

SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV16);
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE1);

Serial.println("Setup complete");
delay(1000);



}

void loop() {

write8bits(0x17,184); //calibration and period measurement
int test = read8bits(0x17);
Serial.print("LCYCMODE value is ");
Serial.println(test);


}


long read8bits (byte reg) {

long ret = 0;

// enable ADE7758 SPI
digitalWrite(CS,LOW);

delay(1000);

SPI.transfer(reg);
delay(1000);
ret=SPI.transfer(0x00);
delay(1000);
// disable ADE7758 SPI
digitalWrite(CS,HIGH);

return ret;

}



long write8bits (byte reg, byte data) {

// enable ADE7758 SPI

digitalWrite(CS,LOW);
delay(10);

SPI.transfer(reg+128);
delay(2);

SPI.transfer(data);
delay(1);
// disable ADE7758 SPI
digitalWrite(CS,HIGH);

}

¿que opináis?
Muchas gracias.
PD: Al subir las imágenes de manera habitual no son visibles.

Pues Google da 2810 respuestas a ADE7758+Arduino. Si eso son pocas...no se cuantas serán suficientes.

Bueno, hay información pero desde un punto mas avanzado el cual es medir potencia, etc...

Yo estoy empezando y no consigo encontrar un esquema para conectarlo con arduino, todo el mundo hablada de conexión SPI pero ni siquiera se que es .... Aparte la mayoría de información está en ingles (no se me da tan mal) pero si por aquí alguien puede dar un poco para el inicio estaría muy agradecido .

Esta es la sección proyectos, si tienes problemas con lo básico de un microcontrolador como arduino, debes comentar por etapas o tareas mas simples. Por lo pronto y en tanto este trabajo no mejore lo muevo a Hardware. Lo estaré observando y si veo que merece estar en proyectos lo volveré a mover. Por lo pronto, lee las normas del foro (1er hilo de cada sección).

guerri:
Muy buenas,

Para eso quiero empezar a medir la temperatura con el pero mis conocimientos son básicos.

Pues para tener conocimientos básicos os metéis en proyectos complicados.

guerri:
Yo estoy empezando y no consigo encontrar un esquema para conectarlo con arduino, todo el mundo hablada de conexión SPI pero ni siquiera se que es …

Lo primero será que aprendas que es SPI en ese enlace que te he dejado lo explica muy bien.

El conexionado que necesitaras si solo vas a leer la temperatura, será la alimentación y la conexión al puerto SPI.
Un saludo.

PD. Para leer temperatura hay otras opciones más sencillas.

Hola guerri, creo que esto será de gran ayuda para tu primer contacto con el ADE7758. Siempre busca si existe o no una librería antes de embarcarte en desentrañar un dispositivo por tu cuenta. ADE7758 Library con ejemplos

No crees mas hilos similares. Si un moderador mueve el hilo lo continúas donde quedó o donde se te indicó.

rodripelto:
Pues para tener conocimientos básicos os metéis en proyectos complicados.Lo primero será que aprendas que es SPI en ese enlace que te he dejado lo explica muy bien.

El conexionado que necesitaras si solo vas a leer la temperatura, será la alimentación y la conexión al puerto SPI.
Un saludo.

PD. Para leer temperatura hay otras opciones más sencillas.

Hola, gracias por tu respuesta, el objetivo de utilizar arduino era aprender a utilizar el ADE7758. Antes de esto he manejado arduino con cosas mas básicas y de manera intensiva como por ejemplo el DHT22.
Muchas gracias por el enlace que me facilitas, he leido mucho sobre la conexion SPI, así la he realizado:

Pienso que mi problema está en el código.

surbyte:
Hola guerri, creo que esto será de gran ayuda para tu primer contacto con el ADE7758.
Siempre busca si existe o no una librería antes de embarcarte en desentrañar un dispositivo por tu cuenta.
ADE7758 Library con ejemplos

Buenas Surbyte, gracias por la respuesta.
Respecto las librerias fueron con esa información con la que empece a desarrollar este prototipo.
Esa librerías y código las he mirado muchísimo para intentar comprenderlas (70-80%)
Compilan perfectamente pero no tiene desarrollada la extensión para leer temperatura.

En el caso de tomar datos de tensión (con sus correspondientes conexiones en el ADE y divisor de tensión de 0,22V para el pin 16 del IC ) el condigo no llega a entrar en el primer IF para ninguno de los casos de toma de datos.
Dropbox - File Deleted

Por otra parte implemente la extensión para la lectura de temperatura pero seguía teniendo el mismo problema anterior:

#include "Arduino.h"

#include <SPI.h>
#include “ADE7758Lib.h”

char inputChar;        // a string to hold incoming data
boolean rx = false;  // whether the string is complete
ADE7758 myADE(&SPI,3);
void setup()
{
  Serial.begin(9600);
 
  myADE.begin();
  Serial.println(“ADE7758 begins operating”);
  delay(1000);
}

void loop()
{
 
  if (rx) {
    switch(inputChar){
     
      //////////////////////////
      case ‘t’:
      Serial.println("Temperature: ");
      for(int k=0; k<=9; k++) //I don’t know wihs is the Bit Location for temperature
      {
        Serial.println(myADE.getTemperature(k),HEX);
        delay(100);
      }
      break;
      /////////////////////////
     
     
      case ‘a’:
              Serial.println(“ENERGY readings for each phase:”);
              Serial.println(myADE.getWattHR(PHASE_A), HEX);
              Serial.println(myADE.getWattHR(PHASE_B), HEX);
              Serial.println(myADE.getWattHR(PHASE_C), HEX);
              break;
      case ‘b’:
              Serial.println(“CURRENT RMS readings for each phase:”);
              Serial.println(myADE.IRMS(PHASE_A), HEX);
              Serial.println(myADE.IRMS(PHASE_B), HEX);
              Serial.println(myADE.IRMS(PHASE_C), HEX);
              break;
      case ‘c’:
              Serial.println(“VOLTAGE RMS readings for each phase:”);
              Serial.println(myADE.VRMS(PHASE_A), HEX);
              Serial.println(myADE.VRMS(PHASE_B), HEX);
              Serial.println(myADE.VRMS(PHASE_C), HEX);
              break;
      case ‘d’:
              Serial.println(“Complex Energy readings for each phase:”);
              Serial.println(myADE.getVAHR(PHASE_A), HEX);
              Serial.println(myADE.getVAHR(PHASE_B), HEX);
              Serial.println(myADE.getVAHR(PHASE_C), HEX);
              break;
      default:
          Serial.println(“unknown command”);
    }
    rx = false;
  }
}

void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
  //inputChar=(char)Serial.read();  //ENTRA EN EL IF PERO NO HACE NADA
  //char inputChar=(char)Serial.read();  //NO FUNCIONA TAMPOCO
    char inChar = (char)Serial.read();  //COMO ESTABA (no funciona)
    rx = true;
  }
}





**No crees mas hilos similares.**
**Si un moderador mueve el hilo lo continúas donde quedó o donde se te indicó.**

Perdona por crear de nuevo el hilo, :cold_sweat: son mis primeros pasos posteando.

Hola, el primer problema que veo es el primer if(rx), creo que no se ejecuta nunca, ya que rx lo inicializar en false y no me da la sensación que lo pongas a true para que se ejecute.

rodripelto: Hola, el primer problema que veo es el primer if(rx), creo que no se ejecuta nunca, ya que rx lo inicializar en false y no me da la sensación que lo pongas a true para que se ejecute.

Buenas, gracias por la sugenrencia, lo acabo de probar inicializandolo a true pero continua de manera similar, antes de introducir el caracter aparece en el Monitor serie 'unknown command' (directamente va al default)

Hola, Está mañana no lo te visto, tienes un método llamado serialevent() que no es llamado nunca, deberías llamarlo antes del if. Quitar el comentario de la línea //inputChar=(char)Serial.read(); Entonces cuando en el puerto serie mandes un t entrara en el swicht

Buenas rodripelto, he probado lo que me comentas, he llamado a la funcion serialEvent(); dentro del void loop() y justo antes del if. Tambien he quitado el comentario de inputChar

Ahora si entra en el if al introducir el caracter (ver imagen) https://www.dropbox.com/s/u7nnq5r4fgwqku2/error%20temperatura.JPG?dl=0

Pero no me da datos ninguno, y aparte no me deja introducir nuevamente otro caracter, para poder volver a introducir un caracter tengo que cerrar y abrir el monitor serie

Hola,

Lo siento pero no veo ninguna imagen. He descargado la librería que te puso surbyte, ya que en tu código no aprecio ningún motivo por el cual no te deje introducir más datos por el serial, bueno realmente te falta un break en el defaul, ¿ es esa la que estas usando?. Te lo pregunto ya que no encuentro ningún método getTemperature.

En la hoja de características del componente dice que la dirección de memoria para la temperatura es 0x11, lo tienes en la pagina 27 ¿Puedes hacer una prueba por si se queda perdido en la llamada a getTemperature.

Serial.println("He pedido el dato");
Serial.println(myADE.getTemperature(k),HEX);
        delay(100);
Serial.println(He recibido el dato");

Hola rodripelto,

Respecto las imagenes creo que ahora si se muestra el enlace (no he podido hacerlo de otra forma para que se vean)

He probado lo que me dices y si muestra en monitor serie serie el texto He pedido el dato (ver imagen) https://www.dropbox.com/s/xzs71xl4cj03j8y/temperatura_he_pedido_dato.JPG?dl=0

Respecto la librería es esa misma la que uso pero la he implementado para obtener la temperatura. Te adjunto la modificada: https://www.dropbox.com/sh/q4iggqlkpbck5yq/AACxjfqPzLsxjqaI-x8TYRX8a?dl=0

Gracias por tu respuesta.

Hola,

Ya he visto las imágenes, como ves no aparece “He recibido dato” por lo que se queda en la llamada a getTemperature.

Te he modificado la librería con lo que creo que es correcto pero faltaría añadir la formula de compensación como pone en el data sheet.

Temp (°C) =[(TEMP[7:0] −Offset) × 3°C/LSB] +Ambient(°C)

Entiendo que este componente lo que mide es su temperatura de trabajo interna.

Bueno pruébalo y cuéntanos.

ADE7758 modificado.zip (5.32 KB)

Buenas,

he estado viendo la modificación que has hecho pero sigo con la misma situación no llega a recibir ningún dato (no pasa del comentario "He pedido el dato")

Respecto la ecuación de la temperatura no la he utilizado aún al ver que este no recibe ningún dato.

:confused: Siento mucho que no funcione, lo único es que revises las conexiones, ya que tampoco hay mucho donde revisas, pon alguna impresión por el puerto series dentro de la librería para ver donde se queda perdido el programa. Un saludo.