Lectura de un voltaje variable en Arduino

8

Usando un Arduino Nano y un transformador de corriente (CT), estoy tratando de sentir la corriente que fluye a través de una línea de 120 V 60 Hz.

Circuito

Salidas CT 0-1 Vsegún sus especificaciones. Esta salida está sesgada AREF/2= 2.5 V.

Ingrese la descripción de la imagen aquí

analogRead Valores

El eje x representa el número de índice de la muestra ADC, mientras que el eje y representa el valor ADC (0-1024). La frecuencia de muestreo es de aproximadamente 9 kHz. La diferencia pico a pico es de aproximadamente 1026 muestras.

Ingrese la descripción de la imagen aquí

¿Es esta forma de onda lo que esperarías de la TC? ¿Por qué hay regiones donde los valores son planos, en lugar de variar continuamente?

Además, si miramos la parte curva de la trama, ¿por qué Arduino lee los valores tanto arriba 512como abajo 512alternativamente? Lee un valor arriba 512, luego un valor debajo 512, luego un valor arriba 512y así sucesivamente.

analogReadSe midió que el tiempo necesario para un 110 segundos para mi configuración y hay 1026 muestras entre los picos de forma de onda. Eso significa que habrá aproximadamente 9 picos en 1 segundo, aunque esperaría 60 picos ya que estamos detectando una línea de 60 Hz. ¿Qué haces con esto? Hay un condensador, C1en el circuito, ¿tendría algo que ver con esto?

¿Son adecuados estos valores analógicos de lectura para calcular el voltaje RMS y, por lo tanto, la corriente RMS que pasa a través del cable que se detecta? El objetivo final de esto es calcular el uso de energía después de determinar la corriente RMS que fluye a través del cable.

Boceto utilizado para obtener valores para la trama

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

void loop() {
   double sensorValue = analogRead(1);
   Serial.println(sensorValue)
}

analogReadPuntos de datos reales en las regiones de relieve

487
534
487
535
488
537
484
536
487
538
486
536
484
540
484
539
485
540
483
540
484
541
481
539
481
540
484
540
480
543
484
539
481
540
484
541
486
542
485
538
485
538
488
535
489
534
491
530
491
529
493
531
492
526
498
526
499
524
499
520
503
518
502
518
507

Trazado de valores analógicos de lectura

Los valores de analogRead ahora se almacenan en un búfer antes de transmitirse a través de Serial. Ahora hay 55 puntos de datos ADC que componen 1 período. Teniendo en cuenta que el tiempo de lectura analógico es de 110 µs, cada ciclo dura 6.05 ms, ¡lo que nos da una frecuencia de 165 Hz! ¿Qué puede haber salido mal?

Ingrese la descripción de la imagen aquí

void loop() {
    double sensorValue = analogRead(1);
    char buf[32];

    dtostrf(sensorValue, 8, 2, buf);
    value = buf;

    if (stop == 0) {
        if (i < 10000) {
            message += ',';
            message += value;
            i++;
        }
        else {
            stop = 1;
            Serial.println(message);
        }
    }
}
Nyxynyx
fuente
¿Puedes publicar tu código? Esto no se ve bien en absoluto. Cuando dices "Suponiendo que pasan 100 ms", ¿por qué suponemos eso?
Cybergibbons
@Cybergibbons publicó el código utilizado para generar valores para la trama. Lo siento, acabo de medir el tiempo necesario para un analogRead()y descubrí que es de 110 microsegundos. Se actualizó la pregunta.
Nyxynyx
¿Cuál es la carga que está utilizando para la red eléctrica? Idealmente, desea algo bastante estable como una bombilla incandescente. Si tiene algo complejo como una fuente de alimentación conmutada para computadora portátil que puede tener una carga variable, puede esperar un resultado complejo.
Salix alba
1
La mayor parte del tiempo en el bucle se gastará enviando en serie a 9600bps. Solo cambiará 960 caracteres / s, es decir, cada lectura dura 4 ms.
Cybergibbons
@Salixalba La carga es una computadora de escritorio con una fuente de alimentación conmutada. Intentaré medir una carga diferente, como un calentador.
Nyxynyx

Respuestas:

5

Con respecto a sus medidas, ignoraría por completo el primer conjunto con Serial.println () en el bucle. Esperaría que el momento de esto no sea confiable.

Su segundo conjunto de datos que capturó en un búfer parece correcto, pero su Estimación de frecuencia / sincronización puede ser incorrecta. Invertiría una salida digital en cada iteración del bucle. Puede medir la frecuencia de eso con un multímetro y su frecuencia de muestreo de ADC sería el doble de ese valor.

Para una fuente de alimentación de PC o computadora portátil, esa es una forma de onda de corriente bastante común.

Sin una corrección efectiva del factor de potencia, la señal de corriente que se muestra a continuación sería bastante típica (fuente: http://www.nlvocables.com/blog/?p=300 )

http://www.nlvocables.com/blog/?p=300

Deberá calcular los valores RMS y sería conveniente filtrar la señal.

Aquí hay un instructable que escribí sobre cómo construir y codificar un Monitor de electricidad basado en Arduino Yun con Cloud Support / Temboo y Google Drive. Debería ser de alguna ayuda para usted.

akellyirl
fuente
¡Gracias! El CT que usó produce -1V a 1V. Para utilizar el ADC de 10 bits, ¿amplificará la salida SCT en 2.5 usando un opamp? O configure su AREF en 2V y sesgue su señal de CT en 1V
Nyxynyx
No, no lo amplifiqué ni cambié el Aref.
akellyirl
¿Cómo podrías obtener esta gráfica? ¿Con que software?
Zgrknr
0

Si está midiendo una carga resistiva, diría que la resistencia de carga que ha elegido está mal, hay algunos CT baratos en eBay (SCT-013-xxx) que tienen versiones con y sin resistencias de carga, estos funcionan bien por su precio. pero debes leer la hoja de datos. el SCT-013-000 requiere una resistencia de 20R para obtener 1 V con una carga de 100 A, si esta resistencia está mal, puede obtener una forma de onda severamente distorsionada al medir corrientes más altas (similares a las que ha proporcionado), esperaría que la señal distorsiona más cuanto menor es el valor de la resistencia de carga, pero este no es el caso con los TC.

Ian
fuente