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

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

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #105 en: 30 de Diciembre de 2023, 18:52:34 »
Hola.

Sí se pueden conectar dos periféricos a un mismo pin, no se si mediante el MCC se puede hacer esto, yo lo hice manualmente:



También me di cuenta que no debía hacer la deshabilitación de los periféricos en la función cambiarProceso, esta sólo debe inicializar la tarea de muestro y el del cálculo del RMS

Código: C
  1. void cambiarProceso(void)
  2. {
  3.     APPSAMPLING_Initialize();   // Reinicio la tarea de muestreo
  4.     APPRMS_Initialize();        // Reinicio la tarea que calcula el valor RMS
  5. }

En cambio, en el primer estado de la tarea de muestro (APPSAMPLING), debo en función de la bandera medirFrecuencia, deshabilitar un periférico y habilitar el otro.

Código: C
  1. case APPSAMPLING_ESTADO_INICIAL:
  2.         {
  3.             if (apppulsadorData.medirFrecuencia)
  4.             {
  5.                 /** Deshabilito todo lo relacionado con el cálculo del valor RMS**/
  6.                 EVIC_ExternalInterruptDisable(EXTERNAL_INT_2);  //detengo la interrupción por interrupción externa
  7.                 EVIC_SourceStatusClear(INT_SOURCE_EXTERNAL_2);  //limpio la bandera por interrupción externa
  8.                 TMR4_Stop();                                    //detengo al temporizador 4
  9.                 TMR4_InterruptDisable();                        //deshabilito la interrupción del temporizador 4
  10.                 EVIC_SourceStatusClear(INT_SOURCE_TIMER_4);     //limpio la bandera por interrupción de tmr4
  11.                 ADC_Disable();                                  //deshabilito al módulo ADC
  12.                 EVIC_SourceStatusClear(INT_SOURCE_ADC);         //limpio la bandera por interrupción del ADC
  13.                 /*************************************************/
  14.                 ICAP1_Enable();
  15.                 TMR2_Start();
  16.                 ICAP1_CallbackRegister(ManejarInterrupcionModuloCaptura, (uintptr_t)NULL);
  17.                 appsamplingData.captura = 0x0000;
  18.             }
  19.             else
  20.             {
  21.                 /** Deshabilito todo lo relacionado con el cálculo del periodo de la señal**/
  22.                 ICAP1_Disable(); //Deshabilito el módulo de captura
  23.                 TMR2_Stop();
  24.                 EVIC_SourceStatusClear(INT_SOURCE_INPUT_CAPTURE_1); // limpio bandera del módulo de captura.
  25.                 /*************************************************/
  26.                 TMR4_Stop();
  27.                 TMR4_CallbackRegister(ManejarInterrupcionTMR4, (uintptr_t) NULL);// registro función de interrupción por TMR4
  28.                 ADC_CallbackRegister(ManejarInterrupcionADC, (uintptr_t)NULL); // registro función de interrupción por ADC
  29.                 EVIC_ExternalInterruptCallbackRegister(EXTERNAL_INT_2, &ManejarInterrupcionExterna, (uintptr_t)NULL); //Registro la función que se llama por la interrupción externa
  30.                 EVIC_ExternalInterruptEnable(EXTERNAL_INT_2); // Habilito la interrupción externa 2
  31.                
  32.                 TMR4_InterruptEnable();
  33.                 ADC_Enable();
  34.             }
  35.             appsamplingData.state = APPSAMPLING_ESTADO_REPOSO;
  36.             break;
  37.         }

El error que mencioné antes que cuando presionaba el pulsante para regresar a medir la frecuencia, era debido a que TMR4 y el ADC eran deshabilitados, y eran necesario volver a activarlos. (Línea 32 y 32 del código de arriba)

El código inicial que usé para visualizar la frecuencia fue así:

Código: C
  1. void ManejarInterrupcionModuloCaptura(uintptr_t context)
  2. {
  3.     appsamplingData.captura = ICAP1_CaptureBufferRead() - appsamplingData.captura;
  4.     rmsDisplay(750000.000/((float)(diferencia)));
  5.     }
  6. }

Pero en el display salía cualquier cosa, menos un valor cercano, sólo la primera vez que sucedía la interrupción del comparador, se obtiene un valor que corresponde a 60Hz.

Luego de darle vueltas a lo que estaba pensando y analizando el código de ejemplo de Microchip que mide tiempo con el comparador que es este:
Código: C
  1. while ( true )
  2.     {
  3.         /* Maintain state machines of all polled MPLAB Harmony modules. */
  4.         SYS_Tasks ( );
  5.        
  6.         while(!ICAP1_CaptureStatusGet());
  7.  
  8.         capturedValue[captureIndex++] = ICAP1_CaptureBufferRead();
  9.  
  10.         if ( captureIndex > 1){
  11.             printf("Pulse Width Count = %d\r\n",(capturedValue[1] - capturedValue[0]));
  12.             captureIndex = 0;
  13.         }
  14.     }

Me di cuenta que deben tomarse dos muestras, y realizar la diferencia entre las dos para obtener el valor medido, así que cambié la variable captura a un arreglo de 2 palabras con su índice.



Y realicé un código similar al ejemplo de Microchip:

Código: C
  1. void ManejarInterrupcionModuloCaptura(uintptr_t context)
  2. {
  3.     appsamplingData.captura[appsamplingData.indiceCaptura++] = ICAP1_CaptureBufferRead();
  4.     if (appsamplingData.indiceCaptura > 0x01)
  5.     {
  6.         uint32_t diferencia = appsamplingData.captura[0x01] -  appsamplingData.captura[0x00];
  7.         if (diferencia)
  8.         {
  9.             rmsDisplay(750000.000/((float)(diferencia)));
  10.         }
  11.         appsamplingData.indiceCaptura = 0x00;
  12.     }
  13. }

Nótese que hay un  if (diferencia), ya que a veces, cuando presiono el pulsador para cambiar a medir frecuencia, el microcontrolador, reinicia. Pensaba que podía estar realizándose un división para cero, pero sigue pasando, es algo que debo revisar.

Y este es el resultado, obviamente, el cambio de la información el el display es mucho más rápido, me imagino que se debe a que al medir la frecuencia, no demora al CPU ya que no hace cálculos como en el caso del RMS.


El cambio en el display es muy rápido, es algo que debo corregir, pero se puede ver al poner pausa que el valor medido es de 60 Hz:



Pero también se visualizar un valor igual a cero, y a pesar que está controlado que si la diferencia tiene ese valor, no se muestre en el display, es algo que debo investigarlo



También aparece la alarma de "bajo voltaje", ya que dicho proceso toma el valor de 60 como voltaje y esa es la razón.

Debería también crear otros límites cuando se está midiendo la frecuencia. Según busqué, el error es de 5Hz, es decir la frecuencia no debe ser mayor a 60.5Hz o menor a 59.5 Hz.
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 #106 en: 31 de Diciembre de 2023, 11:20:38 »
Hola.

He modificado las muestras a tipo flotante así:

Código: C
  1. void ManejarInterrupcionModuloCaptura(uintptr_t context)
  2. {
  3.     appsamplingData.captura[appsamplingData.indiceCaptura++] = ICAP1_CaptureBufferRead();
  4.     if (appsamplingData.indiceCaptura > 0x01)
  5.     {
  6.         float diferencia = (float)(appsamplingData.captura[0x01]) -  (float)(appsamplingData.captura[0x00]);
  7.         if (diferencia > 0.00)
  8.         {
  9.             rmsDisplay(750000.000/diferencia);
  10.         }
  11.         appsamplingData.indiceCaptura = 0x00;
  12.     }
  13. }

Y este es el resultado:


También he modificado la parte que alerta al usuario de un sobre(Voltaje/Frecuencia) o sub (Voltaje/Frecuencia) así:

Código: C
  1. #define maximoVoltaje       127.00
  2. #define minimoVoltaje       110.00
  3. #define maximaFrecuencia    60.50
  4. #define minimaFrecuencia    59.50

Código: C
  1. void analizarNivelVoltaje(float voltajeRMS)
  2. {
  3.     if (appbuzzerData.state > APPBUZZER_ESTADO_INICIAL)
  4.     {
  5.         float valorMaximo;
  6.         float valorMinimo;
  7.         if (apppulsadorData.medirFrecuencia)
  8.         {
  9.             valorMaximo = maximaFrecuencia;
  10.             valorMinimo = minimaFrecuencia;
  11.         }
  12.         else
  13.         {
  14.             valorMaximo = maximoVoltaje;
  15.             valorMinimo = minimoVoltaje;
  16.         }
  17.         if (voltajeRMS > valorMaximo)
  18.         {
  19.             if (0x03 == appbuzzerData.numeroPulsos) // ya está presente la alarma de sobrevoltaje
  20.             {
  21.                 return;
  22.             }
  23.             appbuzzerData.numeroPulsos = 0x03;
  24.         }
  25.         else if (voltajeRMS < valorMinimo)
  26.         {
  27.             if (0x01 == appbuzzerData.numeroPulsos) // ya está presente la alarma de subvoltaje
  28.             {
  29.                 return;
  30.             }
  31.             appbuzzerData.numeroPulsos = 0x01;
  32.         }
  33.         else
  34.         {
  35.             appbuzzerData.numeroPulsos = 0x00;
  36.             OCMP1_Disable();//apago el PWM
  37.             appbuzzerData.state = APPBUZZER_ESTADO_REPOSO;
  38.             return;
  39.         }
  40.         appbuzzerData.contadorPulsos = appbuzzerData.numeroPulsos;
  41.         appbuzzerData.retardo = CORETIMER_CounterGet();
  42.         actualizarFrecuenciaPWM(cHH);
  43.         OCMP1_Enable();
  44.         appbuzzerData.state = APPBUZZER_ESTADO_PULSO_EN_ALTO;
  45.     }
  46. }

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 #107 en: 07 de Enero de 2024, 16:24:11 »
Hola.

Estaba cambiando las baterías a unos UPS que poseo, y recordé que cuando entran en modo de respaldo, no generan una onda sinuosidad, así que pensé que sería una buena idea determinar que tan correcto es el Vrms generado por el UPS.

Primero determine cual es el voltaje del UPS cuando no está en modo de respaldo, el voltaje RMS como se puede ver es de 105V.

Pensé que el voltaje de la red, había caído a ese valor, pero no era así, el UPS atenuaba la señal, ya que de la empresa eléctrica estaba en 126Vrms

Las puntas de prueba del osciloscopio están x10, mi voltímetro mide 103.1 Vrms



Cuando entra en modo de respaldo, se puede apreciar que la forma de voltaje, no es cuadrada, es rectangular, y los picos que aparecen cuando el voltaje cae, me imagino que es debido a que los SCRs, ya que recuerdo que había forma de hacer un conversor DC/AC  con 2 SCRs y transformador con toma central. No recuerdo porque aparecían esos picos.




El multímetro indica 79.1Vrms, mientras que el voltímetro que hice, mide 112.2 Vrms, así que tal vez si mide el valor RMS de manera un poco más precisa.

(tendría que calcular el VRMS con integrales de la gráfica mostrada por el osciloscopio)

Actualización

Ya recordé, es por un capacitor, que sirve para apagar al SCR, al aplicarte momentáneamente un voltaje negativo.



« Última modificación: 07 de Enero de 2024, 16:28:05 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #108 en: 07 de Enero de 2024, 20:44:57 »
...Primero determine cual es el voltaje del UPS cuando no está en modo de respaldo, el voltaje RMS como se puede ver es de 105V.

Pensé que el voltaje de la red, había caído a ese valor, pero no era así, el UPS atenuaba la señal, ya que de la empresa eléctrica estaba en 126Vrms

Las puntas de prueba del osciloscopio están x10, mi voltímetro mide 103.1 Vrms
Ese tester no es TrueRMS,  pero como la señal de entrada es "bastante" senoidal el valor es confiable.
En el que fabricaste no se si a las constantes m y c  les diste los valores teóricos o hiciste alguna calibración, de todas formas, la fórmula en http://www.todopic.com.ar/foros/index.php?topic=51537.msg424985#msg424985  tiene un error ; el último término no es (N-1)c^2 sino Nc^2 pues es el resultado se sumar una constante de 0 a N-1 , o sea N términos.
Eso hace que el resultado final sea menor de lo que debiera pudiendo hasta ser negativo.

Citar
Cuando entra en modo de respaldo, se puede apreciar que la forma de voltaje, no es cuadrada, es rectangular, y los picos que aparecen cuando el voltaje cae, me imagino que es debido a que los SCRs, ya que recuerdo que había forma de hacer un conversor DC/AC  con 2 SCRs y transformador con toma central. No recuerdo porque aparecían esos picos.
Las UPS "normales" no son con SCRs sino MOSFETs.  Su forma es rectangular porque debe tener el mismo valor RMS y de pico que la línea.  Debe ser así para poder conectarle tanto cargas resistivas como equipos electrónicos.

Ese pico inverso es propio de una configuración puente cada vez que un transistor va al corte,  te conviene colocar alguna carga resistiva (las difíciles de encontrar lámparas incandescentes) porque debería desaparecer o al menos disminuir.

Citar
El multímetro indica 79.1Vrms, mientras que el voltímetro que hice, mide 112.2 Vrms, así que tal vez si mide el valor RMS de manera un poco más precisa.

Por lo que se alcanza a ver en el osciloscopio el tiempo de conducción incluyendo el pico son aprox 2.6ms y el máximo 206V
Entonces el valor RMS es:  206V*sqrt(2.6ms/8.333ms) =  115Vrms

Con estas condiciones el tester debería indicar:   1.11*206V*2.6ms/8.333ms = 71.3V  (cerca   :)

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #109 en: 07 de Enero de 2024, 21:03:00 »
Ese tester no es TrueRMS,  pero como la señal de entrada es "bastante" senoidal el valor es confiable.

Hola, gracias por escribir, recuerdo que mencioné que no es true RMS el voltímetro de mi multímetro.

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 #110 en: 07 de Enero de 2024, 21:06:37 »

En el que fabricaste no se si a las constantes m y c  les diste los valores teóricos o hiciste alguna calibración, de todas formas, la fórmula en http://www.todopic.com.ar/foros/index.php?topic=51537.msg424985#msg424985  tiene un error ; el último término no es (N-1)c^2 sino Nc^2 pues es el resultado se sumar una constante de 0 a N-1 , o sea N términos.
Eso hace que el resultado final sea menor de lo que debiera pudiendo hasta ser negativo.


Puede ser, voy a revisarlo para ver si se debe corregir eso.

Pero negativo no puede ser, ya si se parte de un sumatorio, donde su contenido está al cuadrado, por lo tanto su resultado siempre será positivo (valor absoluto:



Respuesta #81 en:

http://www.todopic.com.ar/foros/index.php?topic=51537.75

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 #111 en: 07 de Enero de 2024, 21:09:35 »

Las UPS "normales" no son con SCRs sino MOSFETs.  Su forma es rectangular porque debe tener el mismo valor RMS y de pico que la línea.  Debe ser así para poder conectarle tanto cargas resistivas como equipos electrónicos.

Ese pico inverso es propio de una configuración puente cada vez que un transistor va al corte,  te conviene colocar alguna carga resistiva (las difíciles de encontrar lámparas incandescentes) porque debería desaparecer o al menos disminuir.

Citar
El multímetro indica 79.1Vrms, mientras que el voltímetro que hice, mide 112.2 Vrms, así que tal vez si mide el valor RMS de manera un poco más precisa.

Por lo que se alcanza a ver en el osciloscopio el tiempo de conducción incluyendo el pico son aprox 2.6ms y el máximo 206V
Entonces el valor RMS es:  206V*sqrt(2.6ms/8.333ms) =  115Vrms

Con estas condiciones el tester debería indicar:   1.11*206V*2.6ms/8.333ms = 71.3V  (cerca   :) )

Si, puede ser, en la universidad, recuerdo que se hizo muchos laboratorios de electrónica de potencia, y ya son muchos años.

Laboralmente sólo he estado relacionado con microcontroladores y realmente he olvidado mucho de ese campo.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #112 en: 07 de Enero de 2024, 21:27:46 »
Pero negativo no puede ser, ya si se parte de un sumatorio, donde su contenido está al cuadrado, por lo tanto su resultado siempre será positivo (valor absoluto:
Mas bien, lo que puede dar negativo es la expresión final porque está mal (la de "por lo tanto, todo esto debe ser positivo"), debe terminar en Nc2


Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #113 en: 07 de Enero de 2024, 21:35:04 »
http://www.todopic.com.ar/foros/index.php?topic=51537.msg424985#msg424985  tiene un error ; el último término no es (N-1)c^2 sino Nc^2 pues es el resultado se sumar una constante de 0 a N-1 , o sea N términos.


Si busco en Wikipedia, se tiene que:



Siguiendo la imagen de arriba, m es cero, n es N - 1, por lo tanto (n - m + 1) = (N - 1 - 0  + 1)  = N

Mi error fue tomar esto de referencia:



Donde tiene validez, si se empieza con i = 1, pero en mi caso empieza en cero



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 #114 en: 07 de Enero de 2024, 21:44:17 »
Pero negativo no puede ser, ya si se parte de un sumatorio, donde su contenido está al cuadrado, por lo tanto su resultado siempre será positivo (valor absoluto:
Mas bien, lo que puede dar negativo es la expresión final porque está mal (la de "por lo tanto, todo esto debe ser positivo"), debe terminar en Nc2

Sería en esta parte, donde debo corregirlo:



En esta semana que viene, hago el cambio y veo que pasa.

Gracias
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 #115 en: 08 de Enero de 2024, 12:07:55 »
Hola, he realizado el cambio sugerido por Eduardo 2.0 así:

Código: C
  1. apprmsData.sumatorio2 = -351.9062*apprmsData.sumatorio2; //2mc* sumatorio2(x)
  2.  apprmsData.sumatorio1 = apprmsData.sumatorio1 + apprmsData.sumatorio2 + 90000*(float)(appsamplingData.estructuraADC[apprmsData.puntero].muestra)/* - 90000*/;  // (N-1)*C^2
  3. apprmsData.sumatorio1 = /*fabs(*/apprmsData.sumatorio1/((float)appsamplingData.estructuraADC[apprmsData.puntero].muestra/*)*/);
  4. apprmsData.state = APPRMS_ESTADO_EXTRAER_RAIZ_CUADRADA;

Y parece que ha mejorado, ya que antes ente el voltímetro del multímetro que tengo y el que hice, había siempre una diferencia aproxiamdamente de 2 voltios, ahora es de un poco más de 1 voltio.



Obvaimente, debo intentar conseguirme unos que sea TRUE rms para determinar que tan impreciso es el que he realizado.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #116 en: 29 de Enero de 2024, 14:08:24 »
Puedes meterle una onda cuadrada desde un microcontrolador, que tiene un valor RMS conocido, y comprobar que mide lo esperado.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #117 en: 29 de Enero de 2024, 14:22:17 »
Puedes meterle una onda cuadrada desde un microcontrolador, que tiene un valor RMS conocido, y comprobar que mide lo esperado.

Si, gracias, esa era la idea de usar el UPS en modo de respaldo. Y parece que está bastante bien.

Luego veo eso, estoy un poco ocupado en el trabajo, y estaba en lo de la caja plástica.

Cuando me desocupe, regreso a este proyectillo.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Eduardo2

  • PIC24F
  • *****
  • Mensajes: 965
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #118 en: 29 de Enero de 2024, 14:44:40 »
Hay controles que los podés hacer en CC.
- El offset invirtiendo la polaridad.
- El factor de escala con un voltaje alto.
- La linealidad del ADC y los errores por truncamiento con mediciones a diferentes voltajes.
Esos tres aspectos es preferible en CC que en CA por la independencia respecto a otras fuentes de error y porque es mas preciso que en CA.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Proyecto para medir el valor eficaz verdadero (True RMS)
« Respuesta #119 en: 29 de Enero de 2024, 14:50:18 »
Hay controles que los podés hacer en CC.
- El offset invirtiendo la polaridad.
- El factor de escala con un voltaje alto.
- La linealidad del ADC y los errores por truncamiento con mediciones a diferentes voltajes.
Esos tres aspectos es preferible en CC que en CA por la independencia respecto a otras fuentes de error y porque es mas preciso que en CA.

Si puede ser, gracias, pero no es un proyecto profesional.

La idea principal, como dije, era que donde vivo, que es una zona rural, a veces el voltaje varía y mi idea era que me avise de un sobre voltaje o subvoltaje.

Lo de calcular el RMS y el procesamiento en tiempo real, sólo era por divertirme, como dijo alguien por ahí, sólo tomabas el máximo pico y dividías para 1.41 y listo.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32


 

anything