TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado 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;
}
}
-
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.
-
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.
-
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.
-
¿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.
-
Aqui adjunto lo que muestra el osciloscopio en RA1.
-
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.
-
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?
-
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.
-
¿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.
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
-
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)
-
...
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.
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.
-
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.
-
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.
-
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
-
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?
-
A continuacion muestro la imagen que muestra RA1 con el pic que viene con el circuito al comprarlo.
-
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?
-
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.
-
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.
-
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.
-
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.
-
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.
-
Haciendo pruebas veo que cada vez que se ejecuta la instruccion ADC_Get_Sample de mikroC se genera el ruido.
-
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.
-
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
}
}
-
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.
-
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
-
¿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.
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)
-
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)