TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: afta en 17 de Marzo de 2023, 17:15:01

Título: Lectura de valor pico
Publicado por: afta en 17 de Marzo de 2023, 17:15:01
Hola implemente un codigo que halla el valor pico de una señal de 60Hz mediante una funcion  pero cada vez que se ejecuta la funcion en la señal se genera ruido mientras se ejecuta la funcion. Cuando termina de ejecutarse la funcion la señal queda normal sin ruido.

Adjunto el codigo a continuacion:


unsigned int lectura1,lectura2;
unsigned int mayor,mayor1;
unsigned int valorPico;
char i;

void obtenerPico(unsigned char canal)
{
   mayor = 0;
   mayor1 = 0;
   valorPico=0;
   for(i=0;i<1;i++) 
   {                 
      for(j=0;j<155;j++) 
      {
         lectura1=ADC_Get_Sample(canal);
                                         
         Delay_us(10);

         lectura2=ADC_Get_Sample(canal);

         Delay_us(10);

         if(lectura2>lectura1) mayor=lectura2;
         else mayor = lectura1;
         if(mayor>mayor1) mayor1=mayor;
      }
      valorPico+=mayor1; 
   }
}
Título: Re:Lectura de valor pico
Publicado por: DominusDRR en 17 de Marzo de 2023, 19:35:14
Hola implemente un codigo que halla el valor pico de una señal de 60Hz mediante una funcion  pero cada vez que se ejecuta la funcion en la señal se genera ruido mientras se ejecuta la funcion. Cuando termina de ejecutarse la funcion la señal queda normal sin ruido.

Adjunto el codigo a continuacion:


unsigned int lectura1,lectura2;
unsigned int mayor,mayor1;
unsigned int valorPico;
char i;

void obtenerPico(unsigned char canal)
{
   mayor = 0;
   mayor1 = 0;
   valorPico=0;
   for(i=0;i<1;i++) 
   {                 
      for(j=0;j<155;j++) 
      {
         lectura1=ADC_Get_Sample(canal);
                                         
         Delay_us(10);

         lectura2=ADC_Get_Sample(canal);

         Delay_us(10);

         if(lectura2>lectura1) mayor=lectura2;
         else mayor = lectura1;
         if(mayor>mayor1) mayor1=mayor;
      }
      valorPico+=mayor1; 
   }
}

Por lo que describes, no se si estoy entendiendo mal, es que cuando llamas o ejecutas la función obtenerPico, la señal sinusoidal se altera o corrompe. Si es así, tal vez deberías compartir el esquemático de tu hardware.

Respecto a tu código, por lo que comprendo, parece que tomas varias muestras (256). Cada 2 muestras consecutivas comparas ambas señales. En el momento que la segunda muestra sea mayor a la primera, asumes que has encontrado el valor pico (Aquí creo que deberías retornar o finalizar la función, ya que no tiene sentido seguir realizando comparaciones.

Tal vez exista una mejor manera con amplificadores operacionales (Suponiendo que siempre va a ser una señal sinusoidal), podrías primero integrar a la señal (obtendrías una función coseno respecto a la primera que se puede asumir que es seno), y esta nueva señal pasaría por un detector de cruce por cero.

El detector de cruce por cero genera pulsos justo en los picos de la señal seno (original) y dichos picos podrían ser útiles para que el microcontrolador active el ADC y media el valor de voltaje de la señal original.


Título: Re:Lectura de valor pico
Publicado por: afta en 17 de Marzo de 2023, 20:10:47
Hola Dominus aqui adjunto el circuito. Es un ciruito que saque de un equipo comercial que funciona correctamente. Entonces, creo que el problema es el codigo.
Título: Re:Lectura de valor pico
Publicado por: DominusDRR en 17 de Marzo de 2023, 20:39:12
Hola Dominus aqui adjunto el circuito. Es un ciruito que saque de un equipo comercial que funciona correctamente. Entonces, creo que el problema es el codigo.

¿Y la señal que afirmas que se distorsiona es la que está en el pin RA1? ¿Lo has visto con un osciloscopio?

Porque en teoría esa entrada es de alta impedancia y no debería suceder lo que dices, tal vez deberías mostrar como es la función ADC_Get_Sample y como estás configurando el ADC y el terminal RA1.

Respecto a lo que te dije anteriormente, no creo que se aplica lo del detector de cruce por cero, ya que me parece que la primera etapa del circuito que muestras es un rectificador de media onda, la segunda parece un filtro para eliminar ruido de alta frecuencia.

Título: Re:Lectura de valor pico
Publicado por: afta en 17 de Marzo de 2023, 21:21:57


¿Y la señal que afirmas que se distorsiona es la que está en el pin RA1? ¿Lo has visto con un osciloscopio?

[/quote]

Si, es la señal en RA1 la que se distorsiona mientras esta en ejecucion la funcion; es lo que me muestra el osciloscopio.

La funcion ADC_Get_Sample pertenece a la bilbioteca de mikroC y es la que uso para leer un canal del ADC.
Título: Re:Lectura de valor pico
Publicado por: afta en 17 de Marzo de 2023, 21:37:50
Aqui adjunto lo que muestra el osciloscopio en RA1.
Título: Re:Lectura de valor pico
Publicado por: Eduardo2 en 17 de Marzo de 2023, 22:18:33
Esa señal no se debe al micro sino al rectificador mal ajustado (la rectificación no es simétrica) y  que la frecuencia de corte del filtro es de 100Hz, cuando debería ser de 20Hz o menor (dependiendo del ripple admisible).
 
La R de 2k2 no es necesaria, además es de un valor cercano al máximo recomendado por Microchip.

Además este circuito no es para medir el valor de pico sino el valor medio.
Título: Re:Lectura de valor pico
Publicado por: DominusDRR en 17 de Marzo de 2023, 22:19:02
Aqui adjunto lo que muestra el osciloscopio en RA1.

Está algo raro... ¿Si estás configurando como entrada RA1? Pensaría, tal vez estoy especulando que RA1 está configurado como salida y eso es lo que altera la señal.
¿Cómo es la señal cuando no está ejecutándose la función?
Título: Re:Lectura de valor pico
Publicado por: DominusDRR en 17 de Marzo de 2023, 22:23:33
Esa señal no se debe al micro sino al rectificador mal ajustado (la rectificación no es simétrica) y  que la frecuencia de corte del filtro es de 100Hz, cuando debería ser de 20Hz o menor (dependiendo del ripple admisible).
 
La R de 2k2 no es necesaria, además es de un valor cercano al máximo recomendado por Microchip.

Además este circuito no es para medir el valor de pico sino el valor medio.

¿No es al revés? Es decir el filtro es un pasa bajos y la frecuencia de corte es correcto que sea 100Hz o más

Porque si la Fc es de 20 Hz o menos, una señal de 60Hz se va atenuar mucho.

¿O estoy equivocado?

Respecto al problema, dice que sólo cuando ejecuta la función sucede el problema, se asume que no existe tal distorsión cuando no se ejecuta el proceso.
Título: Re:Lectura de valor pico
Publicado por: Eduardo2 en 17 de Marzo de 2023, 22:49:13
¿No es al revés? Es decir el filtro es un pasa bajos y la frecuencia de corte es correcto que sea 100Hz o más
Porque si la Fc es de 20 Hz o menos, una señal de 60Hz se va atenuar mucho.
¿O estoy equivocado?
Ese esquema es un rectificador de onda completa + un filtro a la salida, pero idea es tener a la salida del filtro solo la componente continua de la señal (el valor medio), por eso una frecuencia de corte baja. Te queda una señal continua y solo necesitás una muestra cada tanto (digamos 200ms)
Si en cambio uno quisiera la señal rectificada limpia, tampoco se puede usar de fc 100Hz sino mucho mayor , porque no solo estarías atenuando la  fundamental sino también las primeras armónicas.

Citar
Respecto al problema, dice que sólo cuando ejecuta la función sucede el problema, se asume que no existe tal distorsión cuando no se ejecuta el proceso.
No se como lo ha comprobado, pero las distorsiones que puede introducir el micro por un error en la programación nunca se van a manifestar así, sino con saltos cuadrados no sincronizados en la señal
Título: Re:Lectura de valor pico
Publicado por: DominusDRR en 17 de Marzo de 2023, 22:58:00
Ese esquema es un rectificador de onda completa + un filtro a la salida, pero idea es tener a la salida del filtro solo la componente continua de la señal (el valor medio), por eso una frecuencia de corte baja. Te queda una señal continua y solo necesitás una muestra cada tanto (digamos 200ms)
Si en cambio uno quisiera la señal rectificada limpia, tampoco se puede usar de fc 100Hz sino mucho mayor , porque no solo estarías atenuando la  fundamental sino también las primeras armónicas.

Si, parece que es un integrador la primera etapa, algo similar a esto:

(https://i.stack.imgur.com/cNWem.gif)

Lo de media onda asumo por el diodo. Pensé todo el tiempo que era un rectificador de media onda.

El filtro de la segunda etapa si estoy convencido que es para eliminar ruido de alta frecuencia de la red eléctrica.

Talvez debe acondicionar la señal para que varíe la señal en el rango del conversor ADC, algo similar a esta señal que varia de 0 al máximo (que seguramente es 5VDC)

(https://www.sciencebuddies.org/sAxLZN26MlZZC8IEWW21kL1kZkc=/530x334/-/https/www.sciencebuddies.org/cdn/Files/11860/8/analog-signal-no-noise.png)
Título: Re:Lectura de valor pico
Publicado por: Eduardo2 en 17 de Marzo de 2023, 23:44:34
...
Lo de media onda asumo por el diodo. Pensé todo el tiempo que era un rectificador de media onda.
El de media onda es parecido,  pero es de onda completa.
https://www.analog.com/en/technical-articles/build-a-fullwave-rectifier-circuit-with-a-singlesupply-op-amp.html

EDITO:  Acabo de darme cuenta que el ejemplo del  link está mal,  tiene el diodo al revés y el filtro no puede ser inversor porque necesitaría una alimentación negativa.
En fin, el esquema correcto es el publicado por Afta, con el  detalle que hay valores de resistencia críticos. Los muchachos del link tunearon las resistencias del filtro cuando lo que se hace es poner un preset, y ajustarlo hasta que la salida sea simétrica.


Citar
El filtro de la segunda etapa si estoy convencido que es para eliminar ruido de alta frecuencia de la red eléctrica.
En general cuando rectificás onda completa con OA es para después quedarte con la componente continua, si se quiere analizar la señal "tal cual" rectificar solo aporta bajar el rango a la mitad.
Título: Re:Lectura de valor pico
Publicado por: afta en 18 de Marzo de 2023, 11:14:38
He probado el circuito con el pic original (el que viene con el), y al medir la señal en RA1 la señal se muestra sin ese ruido.

El ruido solo se induce cuando esta en ejecucion la funcion obtenerPico, de lo contrario la señal se muestra normal sin ese ruido. RA1 esta configurado como entrada analogica. Para este circuito uso dos canales (RA0 y RA1) y en ambos se presenta el mismo problema. Uso la misma funcion para ambos canales.

Estoy asumiendo que el problema se presenta al ejecutar la funcion porque el tiempo que dura es el mismo que el tiempo que dura el ruido en la señal. Hice las medidas con el osciloscopio.

Título: Re:Lectura de valor pico
Publicado por: DominusDRR en 18 de Marzo de 2023, 11:17:04
He probado el circuito con el pic original (el que viene con el), y al medir la señal en RA1 la señal se muestra sin ese ruido.

El ruido solo se induce cuando esta en ejecucion la funcion obtenerPico, de lo contrario la señal se muestra normal sin ese ruido. RA1 esta configurado como entrada analogica. Para este circuito uso dos canales (RA0 y RA1) y en ambos se presenta el mismo problema. Uso la misma funcion para ambos canales.

Quita la R51 y conecta directamente a la salida del OP y ve si tienes el problema.
Título: Re:Lectura de valor pico
Publicado por: afta en 18 de Marzo de 2023, 11:57:55
Quitando la resistencia de 2.2k obtengo lo siguiente:

- En azul la señal en RA1 sin la resistencia de 2.2k
- En amarillo la señal en RA1 con la resistencia de 2.2k
Título: Re:Lectura de valor pico
Publicado por: DominusDRR en 18 de Marzo de 2023, 12:03:45
Quitando la resistencia de 2.2k obtengo lo siguiente:

- En azul la señal en RA1 sin la resistencia de 2.2k
- En amarillo la señal en RA1 con la resistencia de 2.2k

¿Cómo es la señal cuando la función no se ejecuta?

¿Cómo es la señal entre R1 y R62 cuando se ejecuta y no se ejecuta la función?
Título: Re:Lectura de valor pico
Publicado por: afta en 18 de Marzo de 2023, 12:04:14
A continuacion muestro la imagen que muestra RA1 con el pic que viene con el circuito al comprarlo.
Título: Re:Lectura de valor pico
Publicado por: DominusDRR en 18 de Marzo de 2023, 12:06:56
el circuito al comprarlo.

Es decir que es un producto comercial. ¿Cuál es la finalidad del producto? ¿Estás modificándolo o utilizando para crear otro dispositivo?
Título: Re:Lectura de valor pico
Publicado por: afta en 18 de Marzo de 2023, 12:18:23
Viendo mas de cerca la imagen de RA1 del PIC con el programa que venden se ve unas pequenas deformaciones en cada ciclo como se muestra en la figura.
Título: Re:Lectura de valor pico
Publicado por: afta en 18 de Marzo de 2023, 12:20:18
el circuito al comprarlo.

Es decir que es un producto comercial. ¿Cuál es la finalidad del producto? ¿Estás modificándolo o utilizando para crear otro dispositivo?

Quiero usarlo para incorporarlo a un circuito.
Título: Re:Lectura de valor pico
Publicado por: DominusDRR en 18 de Marzo de 2023, 12:22:28
Viendo mas de cerca la imagen de RA1 del PIC con el programa que venden se ve unas pequenas deformaciones en cada ciclo como se muestra en la figura.

pensaría que te estás yendo por la tangente al intentar hacer una cosa con otra.

Para que puedas medir el valor pico, el voltaje en el terminal RA4 debe ser de esta forma:

(https://www.sciencebuddies.org/sAxLZN26MlZZC8IEWW21kL1kZkc=/530x334/-/https/www.sciencebuddies.org/cdn/Files/11860/8/analog-signal-no-noise.png)

Yo pensaba que cuando no se ejecuta la función, la señal era de esa manera, pero por lo visto con ese circuito que estás utilizando, va estar muy difícil conseguir tu objetivo.

Título: Re:Lectura de valor pico
Publicado por: afta en 18 de Marzo de 2023, 12:33:43
Con la señal que tengo, que valor puedo obtener para lograr un control sobre los niveles de tension en la entrada del circuito? Pense que podia obtener el valor pico.
Título: Re:Lectura de valor pico
Publicado por: DominusDRR en 18 de Marzo de 2023, 12:39:23
Con la señal que tengo, que valor puedo obtener para lograr un control sobre los niveles de tension en la entrada del circuito? Pense que podia obtener el valor pico.

la pregunta es: ¿Para que realmente sirve ese circuito que dices que has comprado? ¿Cuál es su objetivo principal? En función de eso se puede analizar si es útil o no.

Como dijo Eduardo, parece que es para medir el valor DC de una señal rectificada. Si es así, no vas a conseguir el valor pico de manera apropiada, tal vez aproximadamente en función de ese valor, pero no mediante el método que estás usando de comparar dos muestras consecutivas hasta encontrar el pico.

Título: Re:Lectura de valor pico
Publicado por: afta en 18 de Marzo de 2023, 18:51:12
Haciendo pruebas veo que cada vez que se ejecuta la instruccion ADC_Get_Sample de mikroC se genera el ruido.
Título: Re:Lectura de valor pico
Publicado por: DominusDRR en 18 de Marzo de 2023, 19:10:51
Haciendo pruebas veo que cada vez que se ejecuta la instruccion ADC_Get_Sample de mikroC se genera el ruido.

Si vas a usar ese circuito, debes filtrar correctamente la señal que vas a medir con el ADC, es decir debes ver una línea plana paralela al eje del tiempo. El valor DC será proporcional al valor pico.
Título: Re:Lectura de valor pico
Publicado por: afta en 20 de Marzo de 2023, 19:23:50
El problema era la funcion de mikroC que al ejecutarse genera ruido. Hice el procedimiento manualmente y se redujo bastante el ruido generado.

Ahora, si quiero hallar el valor pico de la señal que me muestra el osciloscopio (señal de 60Hz) esta bien el siguiente codigo? El tiempo que toma muestras el ADC es aproximadamente 16.7ms o requiero tomar muestras por mas tiempo?



void obtenerPico(unsigned char canal)
{
   
   mayor = 0;
   mayor1 = 0;
   valorPico=0;
   
   ADCON0 = canal;
   
   for(i=0;i<1;i++)
   {                                     
      for(j=0;j<140;j++) 
      {
         Delay_us(20);  // Tiempo de adquisicion
         
         GO_bit = 1;  //Comenzar la conversion
         
         while(GO_bit == 1);
         
         lectura1=0x03 & ADRESH;
         lectura1<<=8;
         lectura1 += ADRESL;
         
         Delay_us(10); // Esperar minimo 2TAD = 2(2us) = 4us
         
         Delay_us(20);  // Tiempo de adquisicion
         
         GO_bit = 1;  //Comenzar la conversion
         
         while(GO_bit == 1);
         
         lectura2=0x03 & ADRESH;
         lectura2<<=8;
         lectura2 += ADRESL;
         
         Delay_us(10);  // Esperar minimo 2TAD = 2(2us) = 4us
         
         if(lectura2>lectura1) mayor=lectura2;
         else mayor = lectura1;
         if(mayor>mayor1) mayor1=mayor;
      }
      valorPico+=mayor1;  // Valor pico
     
      ADON_bit = 0;  //Inhabilitar el ADC
   }
}

Título: Re:Lectura de valor pico
Publicado por: DominusDRR en 20 de Marzo de 2023, 19:39:57
El problema era la funcion de mikroC que al ejecutarse genera ruido. Hice el procedimiento manualmente y se redujo bastante el ruido generado.

Ahora, si quiero hallar el valor pico de la señal que me muestra el osciloscopio (señal de 60Hz) esta bien el siguiente codigo? El tiempo que toma muestras el ADC es aproximadamente 16.7ms o requiero tomar muestras por mas tiempo?


Esta señal que muestras ya en si misma es distorsionada:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=51488.0;attach=32594;image)

Debe ser una señal senoidal tal cual es la de la red eléctrica.

No sé si ese "pico" que muestras ahí, coincide con el de la señal sinusoidal original.

Suponiendo que ese pico se mantiene en el mismo lugar del pico de la señal de la red eléctrica, deberías

1. Determinar si se mantiene en el mismo lugar al variar la amplitud de la señal original.

2. Determinar si la variación de la amplitud es lineal, caso contrario debes crear una tabla para diferentes valores e interpolar para aquellos intermedios.

Título: Re:Lectura de valor pico
Publicado por: afta en 20 de Marzo de 2023, 21:21:53
En la imagen se muestra en azul la señal de la red electrica original y en amarillo la señal a muestrear. No hay desfase entre las señales
Título: Re:Lectura de valor pico
Publicado por: afta en 21 de Marzo de 2023, 15:04:38
¿No es al revés? Es decir el filtro es un pasa bajos y la frecuencia de corte es correcto que sea 100Hz o más
Porque si la Fc es de 20 Hz o menos, una señal de 60Hz se va atenuar mucho.
¿O estoy equivocado?
Ese esquema es un rectificador de onda completa + un filtro a la salida, pero idea es tener a la salida del filtro solo la componente continua de la señal (el valor medio), por eso una frecuencia de corte baja. Te queda una señal continua y solo necesitás una muestra cada tanto (digamos 200ms)
Si en cambio uno quisiera la señal rectificada limpia, tampoco se puede usar de fc 100Hz sino mucho mayor , porque no solo estarías atenuando la  fundamental sino también las primeras armónicas.

Citar
Respecto al problema, dice que sólo cuando ejecuta la función sucede el problema, se asume que no existe tal distorsión cuando no se ejecuta el proceso.
No se como lo ha comprobado, pero las distorsiones que puede introducir el micro por un error en la programación nunca se van a manifestar así, sino con saltos cuadrados no sincronizados en la señal

La frecuencia de corte es de 33.86Hz segun la ecuacion fc = 1/(2*pi*R*C)
Título: Re:Lectura de valor pico
Publicado por: DominusDRR en 21 de Marzo de 2023, 16:01:46
Ese filtro que usas en la siguiente etapa se llama Sallen Key con ganancia y es de segundo orden.

(https://4.bp.blogspot.com/NNeIo6UTwcCocv0aGKiO0C70crim85mVwIDws8cZdcVgBtL0XQQ3Gb8ahTuRn2a_V0tV9hvNcyhXxcSUFolW-uKx-QPCayLHofUlFjn_3F_76G7dKuSbrC1UDzM1Ge3Hb_ulkzbYRxoHXmBFKtKU-XJD3B4xVAttXPPTUm2fsxAR3HGAjAmW47MDoCgGnU0Xe54Xiloi6ksjbzPHvTkWL4n82kWhjNiXR-zZg0k-9Q0U9_wi9UO9dwEL9ymSBI1CCDaWFHJSM7tWOWuJk3LzFr8j3h9x8F94blJENAed8idY_iJ7rH-VuCT9dU9soMmrU-bHFyUW3Acsa6f4uM50xEEZ73kaj-nyI90o1fZJC_HLX5WgQViONT7Ffr55Me6qvUsQaiveT50fceQJf98zoYFEElB81aGmPJWJRIdgqOfFCbTIfUaOTWHNHIFgzW0njY62c1q16JHfFzgBKTbklcJJ__bXf-5ZZc0Y1tul3pn4Qu8QbcyPjp4CdBbHlmiGFaTCUa-dx6wl0dQLYe1uY2Q-oyefhmaGDCcU-mcQbXyH97-fGbiCs7Ymv2SAZuqGT538QaVyiHFXkalPM3HS5q6ckOQcz3CmrKK-yVzOv8iS_WPEt7YbXjbgUBHSqsk=w353-h237-no)

El cálculo de la frecuencia de corte no es tan sencillo como un filtro RC.
(https://1.bp.blogspot.com/LBrivOiya48k1FY8a73r64W71s1guDhg8f633195KX7dKzoMNUr5_cw7CPNBGHI6im3sSl32-4JpKaD4q7tHgNMdhHxQZuU0RQWVCFHPOCCnWwRjTMZ4quAjF1q-VcUJtEU6ZzHWO5bTUujdo5VTbfZsQGFWbbnHif1Q9JOWGYQSF-RRjpix6MGnRrGll4EG56ORYJoS7Lm8_kmnI9YhOIcgvX3B04zrlRW2D-tQ-hMPkAXUQe7liaTPrcwR-H6PJpccI5YtduFa2vXkRhi5_lQdOZfv-RLIVgabEIYzKx_LcFzO5E4bSsqHBbGMFUa5AJdzQPutVLtKtNXg4RTjpreR5tApfIMnpcuoBUh2mXiZOYPi7EQYznLvqrjf2ApmHBrar9cxkS1HLrpwYEkB-Zz0f24RI7Ab692MrfA_Ka0f8OdDJD4UwaHYZCu7q-2eUTQAc-NkUvDorUKJfh4W61njwzb6Wr-NZ_pRAtdfi3CLpDr-FQg9VPzN7K1JS-jaSaJfnC0jW8Nuh6scRJPxRwwwz9mIQ2i8oY6A6G8xVI_311kfdgdTc5rzr1eJtGp0Sq6V-Vz1CBPRgMrg6fvL4HOMAmlj1hPIDTFf1kKgyQIyq-6A4ghjT3Oq1KJmbWI=w254-h66-no)

Más info:

https://wilaebaelectronica.blogspot.com/2017/01/filtro-pasa-bajos-activo-de-2do-orden-sallen-key.html (https://wilaebaelectronica.blogspot.com/2017/01/filtro-pasa-bajos-activo-de-2do-orden-sallen-key.html)