Problema con un Sensor de Intensidad

Buenas, llevo unas semanas peleándome con este sensor, lo tengo en una de las tres fases de un motor a 380, y en otra un amperimetro de pinza, para comprobar los resultados.

El sensor lo tengo conectado negativo a negativo del arduino y positivo al pin A1, en teoría la lectura devería ser proporcional al consumo de la linea.

double V_Toroidal = map(analogRead(A1),0,1024,0,1000);

Tendria que dar la lectura en decimas de amperio, o al menos eso creo, y da una lectura un 15% superior a la pinza amperimetrica cuando el motor esta trabajando en vacio, cuando entra en carga, la diferencia entre el sensor y la pinza se incrementa.

Buscando,me encontré este post, donde me encontre con esto :

ReverendSavage:
Hello johnwasser,
Thank you again for being so helpful. I actually figured it out with the help of my more programming savvy coworker. I'll go ahead and post the solution in case anyone else needs some help with the I-Snail. :smiley:

int analogPin = 0;

void setup() {
Serial.begin(9600);            // sets serial port running at 9600 baud:
   
}

void loop() {
 
  // 0-5v, maps to 0-1023, so the Arduino has a .0049 volt resolution:
  // the voltage sensor reads 63.69 mv per volt:
  float ampsRMS = ((analogRead(analogPin) * .0049) / .06369);
  float volts = ampsRMS * 360 ;  // device is running 360W in this case:
 
  Serial.println(volts);      // print as an ASCII-encoded decimal
  Serial.println(ampsRMS);
 
  // delay 2000 milliseconds before the next reading:
  delay(2000);

}



You're a gentleman and a scholar.

Que ni entiendo, ni se aproxima el resultado.

Alguien me podrá echa un cable

segun el enlace da un valor de 0-5v para 0-100A por lo que el mapeo deberia ser (creo) map(analogRead(A1),0,1023,0,100); pero esto no te permite medir fracciones de Amperio ,si quieres miliamperios deberias multiplicar por 1000 (Cada amperio tiene 1000 mAh) :
map(analogRead(A1),0,1023,0,100000); y si quieres el resultado en Amperios con fraccion ,dividir el resultado entre 1000 y guardarlo en un float:
float resultado = map(analogRead(A1),0,1023,0,100000) / float(1000);
Pruebalo a ver que da.

Te felicito por la forma en que presentaste la información, con hoja de datos, formula, post, enlaces.

Veamos:
Sensor de corriente con salida 0-5V proporcional a su corriente Maxima. Valor RMS calibrado.

Lo primero que no veo es como se alimenta? Curioso. El diagrama tampoco muestra que use alimentación. O sea que tiene algun sistema para producir su tensión de salida.

La fórmula es :
The formula for converting SensorValue into AC Amps (RMS) is:
AC Amps (RMS) = SensorValue/10

El AD mide 0-5V entre 0-1023 entonces Tension medida será => 5 * analogRead(A1)/1023;
5/1023 = 0.00488 (ese es uno de los valores que figuraban en el post)

Segun la hoja de datos 100A = 5V entonces el Sensor entrega 20.0 A/Volt

ampsRMS = 20 * analogRead(A1) * 0.00488;
o mas simple
tomo todos los valores para no perder decimales 100 * 5/(5*1023) = 0.097752

ampsRMS = analogRead(A1) * 0.097752;

Por otro lado una pinza amperométrica no suele ser muy precisa: 5% de error es normal en pinzas de regular precio.
supongamos 50A entonces tenemos 2.5A de posible error.
todo esto siempre es para mediciones de TrueRMS o sea con senoides con muy poca distorsion. El comportamiento en otras situaciones comienza a cambiar notablemente.
Para nada puedo justificar 15% de diferencia pero si se tratara de una senoide distorsionada probablemente si.

MAP
Jose, map funciona solo con enteros asi que ni soporta 100.000 ni soporta floats.

Si queremos un rango mayor (no float) usamos esta versión de map

long lmap(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

o la versión float

float fmap(float x, float in_min, float in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

surbyte:
Te felicito por la forma en que presentaste la información, con hoja de datos, formula, post, enlaces.

Veamos:
Sensor de corriente con salida 0-5V proporcional a su corriente Maxima. Valor RMS calibrado.

Lo primero que no veo es como se alimenta? Curioso. El diagrama tampoco muestra que use alimentación. O sea que tiene algun sistema para producir su tensión de salida.

La fórmula es :
The formula for converting SensorValue into AC Amps (RMS) is:
AC Amps (RMS) = SensorValue/10

El AD mide 0-5V entre 0-1023 entonces Tension medida será => 5 * analogRead(A1)/1023;
5/1023 = 0.00488 (ese es uno de los valores que figuraban en el post)

Segun la hoja de datos 100A = 5V entonces el Sensor entrega 20.0 A/Volt

ampsRMS = 20 * analogRead(A1) * 0.00488;
o mas simple
tomo todos los valores para no perder decimales 100 * 5/(5*1023) = 0.097752

ampsRMS = analogRead(A1) * 0.097752;

Por otro lado una pinza amperométrica no suele ser muy precisa: 5% de error es normal en pinzas de regular precio.
supongamos 50A entonces tenemos 2.5A de posible error.
todo esto siempre es para mediciones de TrueRMS o sea con senoides con muy poca distorsion. El comportamiento en otras situaciones comienza a cambiar notablemente.
Para nada puedo justificar 15% de diferencia pero si se tratara de una senoide distorsionada probablemente si.

MAP
Jose, map funciona solo con enteros asi que ni soporta 100.000 ni soporta floats.

Si queremos un rango mayor (no float) usamos esta versión de map

long lmap(long x, long in_min, long in_max, long out_min, long out_max)

{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}




o la versión float



float fmap(float x, float in_min, float in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

No estoy de acuerdo,he probado el codigo que pongo abajo y funciona (si quitas la division por 1000 y le conectas los 5v a la entrada veras un 100000 por el monitor).Tambien puse:
float resultado = map(analogRead(A0),0,1023,0,100000) / float(1000);
asi que lo que se guarda en resultado es la division de la salida de map entre 1000.

void setup(){
  Serial.begin(9600);
}
void loop(){
  float resultado = map(analogRead(A0),0,1023,0,100000) / float(1000) ;
  Serial.println(resultado);
  delay(2000);
}

vaya yo no lo he probado como tu dices, asi que te doy la razón, pero me limito a lo que dice el Blog de Arduino respecto de como esta hecha map y dice que es para enteros.
Tal vez este modificada.
Aca esta el enlace del blog arduino y la función map

Gracias a ambos por responder.

jose :

Para la aplicación que le voy a dar, es suficiente con décimas de amperio. Para evitar los decimales, en la función map uso como toHigh 1000 en vez de 100. Asi consigo un resultado entero en decimas de amperio.

surbyte :

Y yo te felicito a ti por la explicacion, has conseguido que entienda ese galimatias. De todos modos le han dado un par de vueltas de mas para llegar al mismo punto, o eso creo : 1023 = 100A asi que analogRead(A1)*100/1023; (ye me di cuenta que usaba 1024).

De todos modos, la parte que mas me preocupa es que la diferencia entre las dos lecturas incremente (en porcentaje) entre el motor trabajando en vacío o en carga.
Mañana intentare ponerlo a funcionar y anotar las lecturas.

Muchas gracias por tu tiempo.

Repito: La respuesta de un medidor de verdadero valor Eficaz TrueRMS a una señal Senoidal pura es la que figura en las especificaciones.
En cuanto le agregas distorsión a la corriente alterna producto del ruido electrico, un motor, etc, cambia y mucho la indicación de un medidor RMS.

Porque no das datos de la pinza amperométrica. Hoja de datos, clase, error de lectura, etc.
Tambien si es de aguja o digital.

No pude hacer la prueba con el nuevo codigo, y hasta que amaine el temporal no creo que vaya a ser posible, pero aqui esta el modelo del amperimetro.

La hoja de datos de tu pinza dice:

AC Current (Clamp-on 50Hz / 60Hz)
Range
Accuracy

40.00, 400.0, 600 A
±( 1.5% + 8 digits)
Overload Protections:
ACA Clamp-on jaws : 600 A rms continuous
ACD-10 TRMS Plus:
True RMS sensing - 10 % to 100 % of range

  1. Max Induced error from adjacent current carrying conductor: 0.05 A
  2. Specified accuracy is from 1% to 100% of range and for measurements made at the jaw center. When the conductor is not positioned at the jaw center, position errors introduced are: Add 2% to specified accuracy for measurements made BEYOND jaw marking
    lines (toward jaw opening)
  3. Add 8 digits to specified accuracy @ reading < 10% of range

Las mediciones tienes una precisión entre 1 y 100% del rango ( en otro párrafo dice 10 a 100% para true RMS) o sea debes medir dentro del rango y en el centro del cable.
Si estas fuera del centro de la pinza suma un 2% de error

Empecemos a sumar errores de uno y otro lado y que tienes?
un 15% de error como indicaste al comienzo es que una lectura de 30A en la pinza es mostrada como 25.5 en el sensor con el arduino, es así?

asi es. lo que no acabo de entender, es por que aumenta el porcentaje de error al aumentar el consumo

Carga inductiva/capacitiva o Resistiva?

Inductiva (creo), es un motor electrico trifasico 380 30HP

un motor suele tener una componente de armónicos importantes, el 3 y el 5 principalmente. segun la calidad del equipo de medida, mediran muy diferente. para poder calibrar las 2 formas de medir es usar cargas resistivas, por ejemplo una estufa. para medir corrientes más altas es usar un cable de poca seccion y darle varias vueltas a la pinza.

Que bueno que te lo pregunté, mejor ni veas la señal de una carga de un motor electrico, Es una porquería distorsionada y de ahi tu gran diferencia.
Busca una resistencia calentadora algo que este mas alla del 10% del rango de la pinza para poder asegurarnos que mide bien.

Claro que con algo de 100A eso sería tener un consumo > 10A. a ver si tienes mejor aproximación entre ambos.

Que consigo al darle varias vueltas a la pinza?
Tengo este otro toroidal mas apropiado, por tamaño, y en resistencia, tengo a mano hasta 4000W a 220, que daran 17 amperios y pico, podrá valer?

Vale prueba con esa resistencia y no le des vuelta a la pinza.
El truco de darle vueltas es para que la pinza crea que circula N veces la corriente que circula.
En realidad y cito wikipedia "Para utilizar una pinza, hay que pasar un solo conductor a través de la sonda, si se pasa más de un conductor a través del bucle de medida, lo que se obtendrá será la suma vectorial de las corrientes que fluyen por los conductores y que dependen de la relación de fase entre las corrientes."

En tu caso no hay defasaje en una carga resistiva entonces todo funcionará como multiplicar N vueltas por la corriente esperada, lo que mejora su lectura.
La corriente real es la leida divida la cantidad de vueltas que le diste.
Intenta lo mismo con el sensor asi no hay cosas raras.