Autor Tema: Proyecto para medir el valor eficaz verdadero (True RMS)  (Leído 8171 veces)

0 Usuarios y 4 Visitantes están viendo este tema.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #15 en: 12 de Mayo de 2023, 12:05:24 »
hola dominusDRR, en estos enlaces hay información que te puede servir para tu proyecto:


https://docs.openenergymonitor.org

https://docs.openenergymonitor.org/electricity-monitoring/index.html

Muchas garcias por la infor, puede ser útil
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #16 en: 13 de Mayo de 2023, 11:33:48 »
He adelantado un poco del PCB.

La fuente de voltaje (aún falta los reguladores de 5V y 3.3V)



El acondicionamiento de la señal:



El microcontrolador con sus periféricos:



El PCB (aun sin rutear)



Antes de continuar, voy hacer pruebas reales del acondicionamiento de la señal con el amplificador operacional. Tengo unos pocos en PCBs para usarlos en una  protobard:



Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #17 en: 15 de Mayo de 2023, 13:50:16 »

He realizado las pruebas con el amplificador operacional para determinar si el acondicionamiento funciona como predijo la simulación.

Debo indicar que para tal prueba he utilizado resistencias comunes y corrientes (para el proyecto usaré superficiales de 1% de tolerancia), y aún no he utilizado el circuito referencia de voltaje, que es algo que no tenía y es una compra que está en camino. Por lo que usé un arreglo de resistores para conseguir los 1.5V




Tengo un osciloscopio con batería que era lo ideal para "observar" las formas de onda de la señal acondicionada, y de esa manera evitar un posible corto circuito entre la alimentación del osciloscopio y la red eléctrica que se conecta al amplificador diferencial, pero al verificar que dicha herramienta funcione solamente con la batería, descubrí que no era así, ni tampoco se cargaba, al revisarla, veo que está estropeada.



Pero hasta conseguir dicha batería o buscar un transformador de aislamiento, para evitar el posible corto circuito, se me ocurrió que puedo usar dos transformadores de pequeña potencia de la siguiente manera.



De esa manera, la señal que se va acondicionar, estará aislada de la red eléctrica que alimenta al osciloscopio.

Cuando observé la señal acondicionada, obtuve esto, que por un momento pensé que era algún tipo de distorsión de la señal sinusoidal. Tenía la idea que el op, o el circuito acondicionaban correctamente la señal, pero distorsionaban la forma de onda




Así que decidí conectar directamente el osciloscopio a la salida del transformador para ver como era la señal de voltaje, y la distorsión provenía desde ahí y no era culpa del circuito con el operacional (Puse la punta de prueba x10)



Entonces, se puede afirmar hasta ahora que el acondicionamiento de la señal funciona, obviamente no es preciso por las resistencias utilizadas, y la referencia de voltaje que conseguí es de 1.4V.

Usé uno de los 4 operacionales disponibles para el comparador, para generar una onda cuadrada sincronizada con el cruce por cero de la sinusoidal y este es el resultado:



Me olvidé indicar que no he tenido resistencias de precisión de 200k, pero tengo de 2 Megas, así que para la atenuación del amplificador diferencial, use resistencias de 2M con resistencias de 10k.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #18 en: 19 de Mayo de 2023, 14:01:12 »
He terminado el diseño del PCB, pero aun no voy a enviar a fabricar. Tengo que aprovechar el envío de otros PCBs en donde trabajo para tomar ventaja el envío, más o menos quedan así:







Voy a utilizar un jumper para alimentar al circuito con 120VAC o una fuente externa de voltaje DC.

La fuente externa es para evitar un posible cortocircuito entre mi PC al conectar el programador/depurador al circuito cuando este creando el firmware del microcontrolador. Es decir que cuando ya finalice la creación del código, el hardware funcionará directamente con los 120VAC de la red eléctrica.



Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #19 en: 19 de Mayo de 2023, 14:45:17 »
Buena pinta.

La tira de vías que tienes en la parte superior, junto a R26, ¿son para diagnósticos?, ¿o las has hecho así de grandes por otra razón?
En caso negativo, ¿no te interesaría dejar algunos puntos de diagnóstico a lo largo de la PCB donde chequear con el multímetro u osciloscopio fácilmente?

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #20 en: 19 de Mayo de 2023, 15:29:39 »
Buena pinta.
La tira de vías que tienes en la parte superior, junto a R26, ¿son para diagnósticos?, ¿o las has hecho así de grandes por otra razón?

Creo que te refieres a los terminales del display. La librería de Eagle es de esa manera.

Buena pinta.

En caso negativo, ¿no te interesaría dejar algunos puntos de diagnóstico a lo largo de la PCB donde chequear con el multímetro u osciloscopio fácilmente?

Suelo utilizar las vías o un terminal de algún componente para poner la punta de prueba del osciloscopio.

Si no es fácil mantener la punta de prueba en un terminal de un componente, sueldo un cable temporal para sujetarlo apropiadamente.

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32


Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #22 en: 02 de Junio de 2023, 12:02:40 »
Hola.

Hasta tener la oportunidad de enviar a fabricar los PCBs, estoy pensado en crear el código para calcular el valor RMS, pero antes de ese proceso, estaba analizando como usar el módulo de captura para "medir" el periodo de la señal, ya que nunca he usado este periférico.

En los ejemplos de Harmony 3, se tiene el ejemplo icap_capture_mode, donde se mide la duración de un pulso en la entrada de un terminal del microcontrolador:

https://microchip-mplab-harmony.github.io/csp_apps_pic32mz_ef/apps/icap/icap_capture_mode/readme.html

En mi caso, si mido el ancho de pulso, deberé multiplicar por 2 para obtener el periodo de la señal, o determinar si el módulo puede iniciar y detener la captura sólo con flanco.

Abrí el ejemplo para determinar como usa el módulo y el temporizador que ayuda a la medición.





Código: C
  1. ICAP1_Enable();
  2.    
  3.     OCMP3_Enable();
  4.    
  5.     TMR2_Start();
  6.    
  7.     while ( true )
  8.     {
  9.         /* Maintain state machines of all polled MPLAB Harmony modules. */
  10.         SYS_Tasks ( );
  11.        
  12.         while(!ICAP1_CaptureStatusGet());
  13.  
  14.         capturedValue[captureIndex++] = ICAP1_CaptureBufferRead();
  15.  
  16.         if ( captureIndex > 1){
  17.             printf("Pulse Width Count = %d\r\n",(capturedValue[1] - capturedValue[0]));
  18.             captureIndex = 0;
  19.         }
  20.     }

Lo que no estoy seguro, cual son las unidades de medición del ancho de pulso. La descripción del ejemplo, el periodo mide 2000.



Según yo, esos 2000 son ciclos de reloj, ¿o puedo estar equivocado y que sean milisegundos?  :shock:

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #23 en: 02 de Junio de 2023, 12:25:01 »
Yo creo que te está contando 2000 ticks del Timer2

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #24 en: 02 de Junio de 2023, 12:29:27 »
Yo creo que te está contando 2000 ticks del Timer2

Si puede ser, tendría que esperar a tener el hardware para hacer pruebas o adaptar este ejemplo a una placa de desarrollo que tengo.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #25 en: 02 de Junio de 2023, 13:01:19 »
Si, estuve revisando esta información de como configurar un temporizador periférico:

https://microchipdeveloper.com/harmony3:pic32mzef-getting-started-training-module-step2

En el ejemplo qeu indiqué antes, con el pre escalamiento de 256 del temporizador 2, la frecuencia de los pulsos contados es 390,625 Hz, es decir que cada pulso contado es de 2.56 ms.

El registro de perdido de dicho temporizador está calibrado a 39,061, por lo tanto el temporizador se desbordará cada 39,061*2.56ms = 99.99 milisegundos segundos (o 100 segundos como indica el campo TIME, configurado en milisegundos).

Respecto a los 2000 contados, serían 2000*2.56ms = 5.12 segundos.



Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32


Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #27 en: 02 de Junio de 2023, 18:29:48 »
Voy a intentar adelantar un poco de código.

El proyecto lo voy hacer con XC32, con MPLAB Harmony 3 y con MCC.

Dejo en imágenes los pasos si alguien, en algún momento desea crear un proyecto con las herramientas mencionadas.

Primero, en MPLAB X inicio un nuevo proyecto con H3 con MCC



Luego selecciono se abre otra ventana, donde debo seleccionar la ruta donde se descargó el repositorio de H3.



A continuación, indico donde deseo crear mi proyecto:



Finalmente, selecciono el microcontrolador que deseo usar.



Luego se abre el asistente del administrador de contenido, donde selecciono la opción para H3.





Nuevamente, el MCC solicita la ruta del repositorio, creo que es algo redundante, pero así está la cosa.



Finalmente el MCC tiene este aspecto:



Con el módulo System, se puede calibrar los bits de configuración, también conocidos como fuses.



La primera palabra de configuración se denomina DEVCFG3 el cual posee tres partes.

USERID nos permite agregar un número de identificación que podría ser la versión del firmware o cualquier otra información.

Una característica de la familia de este MCU es que las salidas o entradas de varios periféricos pueden ser ‘colocados’ en diferentes terminales del MCU. Esto es una ventaja sobre otros microcontroladores debido a que muy a menudo comparten varios periféricos sobre los mismos terminales. Por ejemplo si se utiliza el módulo de comunicación serial asincrónica RS232, el módulo SPI ya no se podría utilizar y viceversa.

Con la familia de este microcontrolador ese problema se resuelve fácilmente asignado a otros terminales las entradas y salidas del otro periférico.

Los periféricos que no poseen esta ventaja son el módulo de comunicación I2C y el conversor ADC cuyos terminales son fijos.

Al poner PMDL1WAY en ON nos permite una sola vez bloquear al Módulo Periférico (Peripheral Module), el cual permite deshabilitar a un módulo periféricos una sola vez, hasta asignarle correctamente los terminales externos del MCU. Luego de la configuración correcta de todos los periféricos no hay manera de volver a modificar al PPS hasta un reinicio del MCU.

El IOL1WAY en ON nos permite una sola vez bloquear a los registros RPnR para la asignación correcta de los terminales al periférico.



DEVCFG2 y DEVCFG1, están relacionados con el oscilador, así que prefiero usar la parte gráfica del oscilador para configurarlo.



EL CPU del microcontrolador puede trabajar a 50MHZ, pero poseo un cristal de 8MHz, así que la frecuencia próxima sería 48 MHz.



Si se regresa a la configuración de DEVCFG2 y DEVCFG1, se podrá observar que han cambiado algunos bits.



Nótese que el bit FNOSC, de DEVCFG1, está en FRCPLL, esto significa Fast RC PPL, que es oscilador interno RC de alta velocidad, y no deseo utilizar dicho oscilador, quiero usar el cristal.

Y lo que deso usar es XT más multiplicador de frecuencia (PLL)





El bit IESO controla el arranque con dos velocidades, cuando se energiza el sistema, el cristal u oscilador necesitan un tiempo hasta estabilizarse correctamente, habilitado el modo de dos velocidades con el bit IESO, permite al CPU utilizar primero el oscilador interno para luego conmutar al oscilador principal. En nuestro caso no utilizaré dicha funcionalidad, pero debo utilizar el temporizador relacionado con el Power On Reset (POR) hasta que se estabilice el oscilador principal.

FPBDIV y permite definir la frecuencia a la cual los periféricos trabajarán y es un múltiplo de la frecuencia de oscilación del CPU. La dejaremos en un valor igual a 1, es decir sin división.


FCKSM y tiene 3 sub-opciones. El FSCM o Fail-Safe Clock Monitor vigila que el oscilador principal funcione correctamente, si existiera alguna falla, puede conmutar a un oscilador interno para que el CPU siga trabajando.  Creo que voy a dejar deshabilitado al FSCM y a la conmutación de oscilador. O tal vez debería optar por la opción de conmutación al oscilador interno.

Deseo usar el perro guardián, así que configuro para que su desborde sea en 1024 ms, y las opciones de ventana ese temporizador, no las utilizaré (en OFF)




Con respecto DEVCFG0,  tiene cinco opciones, la primera se denomina JTAGEN y permite la depuración mediante JTAG que es una norma de la IEEE de un puerto de acceso para probar o depurar aun dispositivo. Yo usaré un ICD3 o un SNAP;   por lo que dicha opción estará en OFF.

La segunda opción nos permite configurar que canal ICSP va ser utilizado y en este caso es el número 2.

Respecto a las protecciones de escritura en la memoria de programa y de bootlader, ya que es un proyecto casero y no pienso crear una actualización remota, no pienso activar esas casillas, sólo al de protección de lectura mediante un programador externo.

EL Background debugger, lo dejo en OFF, tampoco es algo no importante, ya que es un proyecto casero, y se pone de manera automática en ON, si utilizo el programador/depurador para depurar con el hardware.



Hasta aquí dejo esta explicación que resultó muy extensa.

En otro momento continuo con la configuración del MCC antes de generar el código.

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #28 en: 03 de Junio de 2023, 12:31:43 »
Continúo con la configuración.

Ahora voy a configurar los pines o terminales del micro:



Configuro cada uno de los terminales de acuerdo al diseño deseado.




En recursos de dispositivo busco y agrego el módulo Core:



Siempre al agregar este módulo, me pregunta si deseo usar FreeRTOS, pero para este ejemplo simple, no creo que es necesario.



Con el módulo Core, activo la casilla para generar archivos de aplicación, esto permite crear tareas o procesos de máquina de estados, y esa forma de escribir código me gusta.



Las tareas, según yo, las creo por cada periférico que se desea controlar o un proceso particular que se desea que sea independiente.

Por el momento creo dos, la primera que será para controlar el display, y la segunda, será aquella que realicé el proceso de calcular el valor rms.



Más adelante determinaré si es necesario más tareas o no.

Lo que voy a adelantar en agregar son los módulo relacionados con la captura de pulsos.

Creo un nuevo grupo para tener más ordenado los módulos:



Por defecto, el grupo se llama Group 0, pero lo cambio de nombre:



Dentro del nuevo grupo, agrego el módulo ICAP1.




Configuro el módulo ICAP1 para que capture por solamente por flanco de subida  (no se si esto deba cambiar) y asociado al temporizador 2, el cual funciona como 16 bits.



También agrego el temporizador 2.



Ya que el periodo a medir es aproximadamente 17 ms, (60Hz), pienso que el temporizador 2, debe incrementarse a paso mucho más pequeños, podría ser cada 100 microsegundos o menos.

Configurando TMR2 con un pre escalamiento de 64, la frecuencia de cada pulso sería de 750 kHz o 1.333 us, pienso que sería un valor bueno para calcular el periodo de una señal.

También con estos valores, TMR2 se desbordaría cada 50 ms, que es mucho mayor que 17 ms.

No son lo valores definitivos, debería hacer pruebas para determinar la exactitud de la medición del periodo.



Me olvidaba que sé utilizar el Core Timer para generar retardos asincrónicos, para cualquier delay en el código. Así que vuelvo al grupo raíz o Root y agrego dicho módulo par disponer de las librerías de ese periférico.



Creo que eso es todo, cualquier momento puedo volver abrir el MCC y modificar la configuración, por ahora voy a generar el código.



Una vez generado el código, puedo cerrar el MCC y este es el aspecto que tiene:






« Última modificación: 03 de Junio de 2023, 12:51:49 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #29 en: 03 de Junio de 2023, 23:25:06 »
Para calcular el RMS debo cumplir con la siguiente condición de varias muestras adquiridas por el ADC según la siguiente ecuación:



El máximo valor que mide el ADC correspondería a 300V, mientras que el mínimo es -300V

Antes de aplicar la ecuación de arriba, creo, que debo cambiar los valores obtenidos del ADC a los niveles de voltaje, o tal vez haya otra manera

Esto analizando las cuatro opciones que posee el ADC para mostrar los resultados.

Cada uno de los valores, deben ser multiplicados por una pendiente o ganancia m y sumados un desplazamiento o constante c, para llegar a los valores de voltaje mínimo y máximo.

V instantáneo = (Valor del ADC)* m + c

El ADC puede mostrar su resultado de 4 formas diferentes



Para la primera sería:

1023*m + c = 300
0*m + c = -300

De aquí m = 200/341 y c = -300.

Para la segunda opción sería:

511*m + c = 300
-512*m + c = -300, donde m = 200/341 y c = 0.293

Para la tercera opción sería:

0.999*m + c = 300
0*m + c = -300 , donde m = 600.6006 y c =-300

Y la última sería:

0.499*m + c = 300
-0.5*m + c = -300, donde m = 109.111 y c = 245.

Con estos resultados pienso que la primera opción, parece la mejor.

Es decir que cada valor obtenido del ADC, debo multiplicarlo por m y sumarlo c. El resultado debo elevarlo al cuadrado e ir sumando cada uno de esos valores.

La suma total debo dividirla para el número de muestras que se haya obtenido en el periodo de tiempo, y ese nuevo resultado, debo extraer la raíz cuadrada.

Ahora bien, me parece que esa constante m, podría salir del sumatorio, y la constante c sería otro sumatorio a parte, es decir, que creo que antes de multiplicar cada valor por m y sumarle c, se podría realizar el sumatorio sin alterar aún los valores adquiridos, y luego, con el resultado final, multiplicaría por una ganancia y sumarle.

De esa manera, podría aliviar la carga de calculo al CPU del microcontrolador.





Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32