Este repositorio contiene la biblioteca Truerms C ++ para Arduino. Con esta biblioteca es posible calcular el valor promedio y el RMS (cuadrado medio raíz) o el valor efectivo de la señal de entrada ADC. Esta biblioteca también calcula la potencia real y el factor de potencia de las señales de entrada de voltaje y de corriente. De la versión 1.3, la medición de energía se ha agregado al proyecto.
El voltaje y la representación de voltaje de una corriente se pueden medir con el ADC del Arduino utilizando circuitos de entrada apropiados para escalar las cantidades medidas hasta el rango de voltaje compatible con 0-5V del ADC. La solución proporcionada utiliza un método simple para escalar las cantidades medidas. El usuario solo tiene que definir el valor de pico a pico de escala completa del voltaje de entrada y corriente de CA. Cuando las unidades de las cantidades medidas se definen en voltios y amperios, la potencia calculada está en vatios y la energía en WS (julios). Esta biblioteca es fácil de portátil a otras plataformas.
Se implementan las siguientes clases de biblioteca:
AverageRmsRms2PowerPower2El promedio calcula el valor promedio de una serie de muestras de entrada (generalmente) del ADC. RMS o RMS2 está destinado a calcular el valor cuadrado de raíz de una señal y potencia o potencia2 está destinada a calcular la potencia a partir de la entrada de voltaje y corriente.
RMS2 y Power2 funcionan mejor cuando se usan en una rutina de servicio de interrupción extendiendo la carga de procesamiento durante las ranuras de tiempo de muestra. El número de muestras para una ejecución de adquisición de RMS (Scan) se define como ventana . RMS2 y Power2 ocupan una ranura de tiempo de muestra adicional (longitud de la ventana +1) cuando la opción de restauración de línea de base automática está encendida (BLR_ON).
Existen los siguientes métodos:
begin()start()stop()update()update1()update2()publish() Para un comienzo rápido, consulte el ejemplo de los bocetos Arduino que vienen con la biblioteca.
Estos son los pasos a seguir para una implementación exitosa:
begin() . Este método es para inicializar y necesita entrada para establecer la escala de las unidades de medición, el tamaño de la ventana de muestreo, el número de bits del ADC (o señal de entrada) usado y el modo de adquisición (escaneo continuo/escaneo único).start() para comenzar la adquisición.update() (o update1() + update2() para Power2 ) repetidamente a una velocidad constante.publish() para obtener los resultados. Para la clase Power2 Update () se descompone en update1() y update2() . update1() debe llamarse primero para procesar la muestra desde el voltaje de entrada y update2() para procesar la muestra desde la corriente de entrada o Vica Versa (voltaje-corriente). El voltaje y la corriente de muestreo generalmente ocurren en secuencia para un ADC multiplexado.
Para el uso promedio de la clase:
void begin(float range, unsigned char window, unsigned char nob, bool mode);
Con:
range es el swing máximo máximo esperado de la señal de entrada de CA (valor pico a pico).window La longitud de la ventana de muestra, expresada en un número entero de muestras.nob es la resolución de bit de la señal de entrada (profundidad de bit ADC). Use las constantes predefinidas: ADC_8BIT , ADC_10BIT o ADC_12BIT .mode establece el modo en escaneo continuo o escaneo único. Use las constantes predifinadas CNT_SCAN o SGL_SCAN . void start(void); Este método inicia la adquisición para el escaneo continuo y el modo de escaneo único.
void stop(void); Este método detiene la adquisición.
void update(int instVal); Asigne el valor de muestra actual.
void publish(void); Publique los resultados de la última ejecución de adquisición completada. Los resultados están en las variables de salida como se define a continuación.
Las variables definidas públicas son:
int instVal : el valor de la última muestra adquirida
float average : el resultado del valor promedio
bool acquire - Bit de estado, verdadero cuando el escaneo está pendiente.
Para la clase RMS o RMS2 use:
void begin(float range, unsigned char window, unsigned char nob, bool blr, bool mode);
Con:
range es el swing máximo esperado de la señal AC (valor de pico a pico).window La longitud de la ventana de muestra expresada en un número entero de muestras.nob es la resolución de bit de la señal de entrada, generalmente esta es la profundidad de bit ADC. Use las constantes predefinidas: ADC_8BIT , ADC_10BIT o ADC_12BIT .blr establece la función de restauración de línea de base automáticamente encendida o apagada. Use las constantes predfinidas BLR_ON o BLR_OFF .mode establece el modo en escaneo continuo o escaneo único. Use las constantes predifinadas CNT_SCAN o SGL_SCAN . void start(void); Este método inicia la adquisición para el escaneo continuo y el modo de escaneo único.
void stop(void); Este método detiene la adquisición.
void update(int instVal); Asigne el valor de muestra actual.
void publish(void); Publique los resultados de la última ejecución de adquisición completada. Los resultados están en las variables de salida como se define a continuación.
Las variables definidas públicas son:
int instVal : el valor de la última muestra adquirida, restaurada a la línea de base cuando blr_on
float rmsVal : el resultado del valor RMS
int dcBias : el valor DCBIAS en las unidades ADC. Solo relevante cuando blr_on
bool acquire - bit de estado, verdadero si el escaneo está pendiente
Para el uso de potencia de clase:
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
Con:
range1, range2 es el swing máximo esperado de las señales de CA (valor de pico a pico) del voltaje y la corriente.window La longitud de la ventana de muestra expresada en un número entero de muestras.nob es la resolución de bit de la señal de entrada, generalmente esta es la profundidad de bit ADC. Utilice las constantes predifinidas: ADC_8BIT , ADC_10BIT o ADC_12BIT .blr establece la función de restauración de línea de base automáticamente encendida o apagada. Use las constantes predfinidas BLR_ON o BLR_OFF .mode establece el modo en escaneo continuo o escaneo único. Use las constantes predifinadas CNT_SCAN o SGL_SCAN . void start(void); Este método inicia la adquisición para el escaneo continuo y el modo de escaneo único.
void stop(void); Este método detiene la adquisición.
void update(int instVal1, int instVal2); Asigne los valores de muestra actuales (por ejemplo, voltaje y corriente) a la vez.
void publish(void); Publique los resultados de la última ejecución de adquisición completada. Los resultados están en las variables de salida como se define a continuación.
Las variables definidas públicas son:
int instVal1 : el valor de la última muestra adquirida (voltaje), restaurado a la línea de base cuando blr_on
int instVal2 : el valor de la última muestra adquirida (corriente), restaurada a la línea de base cuando BLR_ON
float rmsVal1 - Valor RMS1 (voltaje)
float rmsVal2 - RMS Valor2 (actual)
int dcBias1 - El valor DCBIAS1 en unidades ADC. Solo relevante cuando blr_on
int dcBias2 : el valor DCBIAS2 en unidades ADC. Solo relevante cuando blr_on
float apparentPwr - El poder aparente
float realPwr - poder real
float pf - Factor de potencia
float energy - Energía de netto
bool acquire - bit de estado, verdadero si el escaneo está pendiente
Para la clase Power2 use:
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
Con:
range1, range2 es el swing máximo esperado de las señales de CA (valor de pico a pico) del voltaje y la corriente.window La longitud de la ventana de muestra expresada en un número entero de muestras.nob es la resolución de bit de la señal de entrada, generalmente esta es la profundidad de bit ADC. Utilice las constantes predifinidas: ADC_8BIT , ADC_10BIT o ADC_12BIT .blr establece la función de restauración de línea de base automáticamente encendida o apagada. Use las constantes predfinidas BLR_ON o BLR_OFF .mode establece el modo en escaneo continuo o escaneo único. Use las constantes predifinadas CNT_SCAN o SGL_SCAN . void start(void); Este método inicia la adquisición para el escaneo continuo y el modo de escaneo único.
void stop(void); Este método detiene la adquisición.
void update1(int instVal); Asigne el valor de muestra actual, por ejemplo, para el voltaje.
void update2(int instVal); Asigne el valor de muestra actual, por ejemplo, para la corriente. Llame update1() y update2() alternativamente en el bucle de muestreo.
void publish(void); Publique los resultados de la última ejecución de adquisición completada. Los resultados están disponibles en las variables de salida como se define a continuación.
Las variables definidas públicas son:
int instVal1 : el valor de la última muestra adquirida (voltaje), restaurado a la línea de base cuando blr_on
int instVal2 : el valor de la última muestra adquirida (corriente), restaurada a la línea de base cuando BLR_ON
float rmsVal1 - Valor RMS1 (voltaje)
float rmsVal2 - RMS Valor2 (actual)
int dcBias1 - El valor DCBIAS1 en unidades ADC. Solo relevante cuando blr_on
int dcBias2 : el valor DCBIAS2 en unidades ADC. Solo relevante cuando blr_on
float apparentPwr , el aparente poder
float realPwr - poder real
float pf - Factor de potencia
float energy - Energía de netto
bool acquire - bit de estado, verdadero si el escaneo está pendiente
Rms gridVolt;
void setup() {
...
gridVolt.begin(700, 40, ADC_10BIT, BLR_ON, CNT_SCAN);`
...
}
Los argumentos significan:
El rango ADC completo (0 a 5volts) representa un valor de pico a pico de señal de 700V. Esto equivale a una amplitud de señal de 350V o 247.5vrms para una onda sinusoidal.
La ventana RMS es de 40 muestras, lo que significa que la ventana cubre dos ciclos de 50Hz, cuando la velocidad de muestreo se eligió a 1000 muestras/seg.
La resolución de bits ADC es de 10 bits (Arduino Uno).
BLR_ON significa que la restauración de línea de base se enciende. Para capturar una señal de CA con el ADC, el valor cero de la señal debe cambiarse hacia el punto medio del rango ADC agregando un voltaje de desplazamiento de CC con los circuitos de entrada ADC. Este desplazamiento debe corregirse luego en software restando un valor constante del valor ADC adquirido. Esta corrección se puede hacer automáticamente con BLR_ON y la calibración no es necesaria. En la Figura 1, la línea azul indica la señal de entrada a escala máxima con una balanza de voltaje de 5 V y sesgado en 2.5V. La línea verde muestra una señal de entrada con una amplitud de 1V y mide 1V/SQRT (2) = 0.71 VRMS.

Con la opción CNT_SCAN, la adquisición se establece en el modo continuo. La adquisición se reiniciará automáticamente después de completar el último escaneo.
Llamar gridVolt.update(adcVal); Desde el bucle principal o desde una rutina de servicio de interrupción (ISR). Asegúrese de que el bucle se repita a una velocidad constante.
Obtenga los resultados con gridVolt.publish() y obtenga el valor RMS: float Voltage = gridVolt.rmsVal;
void loop() { // loop must run at 1kHz
...
adcValue = analogRead(AN0); // read the ADC.
gridVolt.update(adcValue);
counter++;
if(counter >= 500) { // publish every 0.5s
gridVolt.publish();
Voltage = gridVolt.rmsVal;
counter = 0;
}
...
while(loop_timer_not_expired) {1}
...
}
Measure_avg.ino : este ejemplo muestra cómo calcular el valor promedio de una señal medida con el ADC.
Measure_rms.ino : en este ejemplo se determina el valor RMS del voltaje de entrada ADC.
AC_powermeter.ino : este ejemplo demuestra una aplicación completa de medición de potencia de CA. Necesita ambos, voltaje y una representación de voltaje de la corriente como entrada en dos canales ADC. Calcula los valores RMS del voltaje y la corriente, la potencia aparente, la potencia real y el factor de potencia.
AC_powermeter_advanced.ino : este ejemplo también demuestra una aplicación completa de medición de potencia de CA. Se ejecuta en base para obtener mejores lecturas estables. El voltaje y la corriente se muestrean a 3kHz. Cuando se enciende el LED de Arduino, los clips ADC (voltaje de pico de entrada demasiado alto) o la CC lo sesgan fuera del rango.
Energy_metering.ino muestra el voltaje, la corriente, la potencia real y la energía neta en WH.
La forma más sencilla de interactuar con altos voltajes con el ADC Arduino es mediante el uso de un transductor de voltaje, por ejemplo, el transductor de voltaje LV 25-P de Lem USA Inc. Este transductor proporciona aislamiento galvánico, escala y nivel de nivel en un solo paquete. Para la detección de corriente, LEM también fabrica el LEM_LA55-P , con las mismas ventajas que para el transductor de voltaje.
Si uno prefiere construir circuitos de escala de entrada a partir de componentes discretos, se proporciona una descripción de diseño detallada en la aplicación Nota Tiduay6c.pdf que pertenece al diseño de referencia del inversor de fuente de voltaje de Texas Instruments Incorporated. ¡Tenga en cuenta las advertencias! Los circuitos propuestos se pueden adaptar fácilmente al rango de 0-5V para el Arduino.
¡En todo momento, use un transformador de aislamiento para la seguridad!
Medición de potencia 3 fases.
Se ahorró mucho tiempo para desarrollar esta biblioteca utilizando el Sloeber alternativo de Arduino-id. Sloeber es un maravilloso complemento Arduino para Eclipse. ¡Gracias a Jantje y sus contribuyentes!