author=afta link=topic=50912.msg419122#msg419122 date=1630349120]
Hola con todos.
A la salida de un transformador tengo un rectificador de onda completa conectado a un filtro de segundo orden Sallen Key pasabajas. La salida del filtro esta conectada a pin de entrada de un PIC; el cual, debe leer la señal para controlar que la tension de la red electrica este en un rango de por ejemplo minimo = 180V y maximo = 260V.
Alguien sabe que se debe hacer en el programa para lograr esto?
Hola Dominus. Cuando dices si para 180V tienes unos 2V y para 260 unos 4.5V a que se refiere?
Por ejemplo, digamos que si para 180V tienes unos 2V y para 260V, tienes unos 4.5V, si el conversor es de 10 bits, para 2V tendrías un valor de 410, y para 4.5V tendrás 922.
¿En esa imagen que muestras que voltaje tienes a la entrada de AC, 180V, 260V o qué? ¿El eje en Y es en Voltios, milivoltios, o en qué?La entrada de AC es 180Vrms y el eje Y esta en voltios
Adjunto la imagen a 260Vrms
No entiendo muy bien esta instruccion:
valorADC = funcionQueLeeELADC();
Si uso el ADC para leer la señal estare leyendo un valor instantaneo. Entoces, si uso ese valor y lo comparo con 1.45 por ejemplo se puede decidir encender o apagar la carga.
Mi duda es que como la señal en la salida es variable y 1.45 esta entre sus valores, entonces, cuando tenga 180V la carga se encendera y apagara cuando se lea un valor mayor o menor que 1.45V. No se si estoy equivocado
Hice este seudocodigo para tomar el valor promedio. Quisiera saber si esta bien y que tiempo poner en el ciclo for despues de obtener adc_rd0 si la señal es de 120Hz.
int mm;
adc_rd0 = 0;
for(mm=0;mm<10;mm++)
{
adc_rd0+= ADC_Read(0);
}
adc_rd0/=10;
ac_voltage = adc_rd0;
Es correcto.... Pero siempre mejor usar potencias de 2... Es de 4,8,16 vueltas
Si, o sea está bien, pero es un proceso apropiativo, es decir toma el control del CPU y no lo suelta hasta que acabe, es decir no permite que otros procesos continúen. Si el tiempo que se queda "congelado" en CPU hasta que acabe de hacer el promedio no es algo crítico, no hay problema.
Te recomendaría programar el código de tu micro en tareas y procesos cooperativos para evitar puntos muertos o bloqueos como se denominan esos procesos.
Si, o sea está bien, pero es un proceso apropiativo, es decir toma el control del CPU y no lo suelta hasta que acabe, es decir no permite que otros procesos continúen. Si el tiempo que se queda "congelado" en CPU hasta que acabe de hacer el promedio no es algo crítico, no hay problema.
Te recomendaría programar el código de tu micro en tareas y procesos cooperativos para evitar puntos muertos o bloqueos como se denominan esos procesos.
Dominus no se lo que son procesos cooperativos. En cuanto al tiempo: cada cuanto puedo tomar las muestras en el ciclo for?
Si, o sea está bien, pero es un proceso apropiativo, es decir toma el control del CPU y no lo suelta hasta que acabe, es decir no permite que otros procesos continúen. Si el tiempo que se queda "congelado" en CPU hasta que acabe de hacer el promedio no es algo crítico, no hay problema.
Te recomendaría programar el código de tu micro en tareas y procesos cooperativos para evitar puntos muertos o bloqueos como se denominan esos procesos.
Dominus no se lo que son procesos cooperativos. En cuanto al tiempo: cada cuanto puedo tomar las muestras en el ciclo for?
Es correcto.... Pero siempre mejor usar potencias de 2... Es de 4,8,16 vueltas
Hola Killer disculpa no entiendo. Seria mejor poner mm < 17? y sabes cada cuanto tiempo puedo tomar la muestra?
[PIC12 ADC] PC=0x0045. ADC conversion clock period (5e-07) is possibly invalid for device clock frequency. [U2].
[PIC12 ADC] PC=0x0045. ADC conversion clock period (5e-07) is possibly invalid for device clock frequency. [U2].Ahí dice que para la frecuencia que está funcionando tu micro, el periodo de conversión está calibrado 0.5 us
En las hojas de datos debe decir cual es el valor mínimo (debe ser más grande de 0.5us) de conversión y como lo seteas o calibras.
[PIC12 ADC] PC=0x0045. ADC conversion clock period (5e-07) is possibly invalid for device clock frequency. [U2].Ahí dice que para la frecuencia que está funcionando tu micro, el periodo de conversión está calibrado 0.5 us
En las hojas de datos debe decir cual es el valor mínimo (debe ser más grande de 0.5us) de conversión y como lo seteas o calibras.
Segun la hoja de datos debo configurar el registro ADCON1 para un TAD de minimo 1.6us. Selecciones Fosc/8 que muestra un TAD de 2us, lo cual seria suficiente pero no entiendo entonces porque sale ese error. Intente cambiar a Fosc/16 pero sigue saliendo el error.
[PIC12 ADC] PC=0x0045. ADC conversion clock period (5e-07) is possibly invalid for device clock frequency. [U2].Ahí dice que para la frecuencia que está funcionando tu micro, el periodo de conversión está calibrado 0.5 us
En las hojas de datos debe decir cual es el valor mínimo (debe ser más grande de 0.5us) de conversión y como lo seteas o calibras.
Segun la hoja de datos debo configurar el registro ADCON1 para un TAD de minimo 1.6us. Selecciones Fosc/8 que muestra un TAD de 2us, lo cual seria suficiente pero no entiendo entonces porque sale ese error. Intente cambiar a Fosc/16 pero sigue saliendo el error.
No se porque pero al cambiar la instruccion "ANSEL=0b00000001" por "ANS0_bit = 1" desaparecion el error del reloj. Lo que aun no funciona en la simulacion son los cortes en 180 y 260. Que podria hacer mejor o corregir para que funcione bien?
[PIC12 ADC] PC=0x0045. ADC conversion clock period (5e-07) is possibly invalid for device clock frequency. [U2].Ahí dice que para la frecuencia que está funcionando tu micro, el periodo de conversión está calibrado 0.5 us
En las hojas de datos debe decir cual es el valor mínimo (debe ser más grande de 0.5us) de conversión y como lo seteas o calibras.
Segun la hoja de datos debo configurar el registro ADCON1 para un TAD de minimo 1.6us. Selecciones Fosc/8 que muestra un TAD de 2us, lo cual seria suficiente pero no entiendo entonces porque sale ese error. Intente cambiar a Fosc/16 pero sigue saliendo el error.
No se porque pero al cambiar la instruccion "ANSEL=0b00000001" por "ANS0_bit = 1" desaparecion el error del reloj. Lo que aun no funciona en la simulacion son los cortes en 180 y 260. Que podria hacer mejor o corregir para que funcione bien?
Lo probe en simulacion y el corte por sobretension es correcto. Lo que me esta fallando es el corte por subtension que comienza a oscilar en los limites y estoy usando mas memoria para la variable.
Midiendo con un multimetro veo que en la parte inferior hay valore con decimales mientras que cuando opera correctamente el multimetro muestra valores enteros.
Por otro lado, es normal que en una conversión, haya pequeñas oscilaciones de la lectura, eso es típico de sistemas de cuantificación.
Para revertir ese detalle, se usa histéresis por software. Que consiste en incrementar un pequeño porcentaje a la muestra, cuándo es mayor a... y restarle un pequeño porcentaje a la misma muestra, cuándo es menor que...
Por otro lado, es normal que en una conversión, haya pequeñas oscilaciones de la lectura, eso es típico de sistemas de cuantificación.
Para revertir ese detalle, se usa histéresis por software. Que consiste en incrementar un pequeño porcentaje a la muestra, cuándo es mayor a... y restarle un pequeño porcentaje a la misma muestra, cuándo es menor que...
Hola Robert si he estado leyendo sus recomendaciones y realizando pruebas con base en ellas. El problema que hay es que cuando llega a 170 comienza a oscilar y recien en 171 se queda encendido, mientras que al bajar de igual manera en 170 oscila y recien en 169 se queda apagado. En el corte de subida no presenta ningun problema. No entiendo muy bien la histeresis y como puedo aplicarlo para que el corte de bajada funcione correctamente.
Adjunto el circuito.
Adjunto el circuito.
Primera observación.
Me imagino que las resistencias R7 y R5 son para tomar una muestra de voltaje, es decir que es un divisor de voltaje. Aquí mi recomendación es que utilices otro amplificador op como seguidor de voltaje para acoplar impedancias. La salida del seguidor de voltaje iría a la entrada del filtro que es la resistencia 4.
Segunda observación.
La señal que estás filtrando nunca es negativa, es decir varía de cero a un máximo positivo. ¿Por qué utilizas un divisor de voltaje (R3 y ¿¿¿R2??) para el terminal negativo del OP? Eso se utilizaría si estuvieras trabajando con señales negativas. Al hacerlo, el voltaje en la salida del amplificador variaría de Vcc/2 a VCC.
Tercera observación.
No se conoce a cuanto reduce el transformador el voltaje, no creo que sea problema, pero sería bueno conocer. Y debes poner una imagen más clara, no se ve los valores casi nada y no se sabe con cuanto energizas al OP.
El transformador es Entrada=220, Salida= 0,12,0
El OPAMP se energiza con 5V.
El circuito es de una tarjeta que me encontre que usa el PIC16F676 y funciona bien. Como estoy aprendiendo queria hacer un programa para poder usar ese circuito en algun otro proyecto.
Te comento con un ejem, cómo funciona la histeresis por soft.
Por ejem, tenemos una referencia de corte, en tu caso 170. Bien entonces un valor leído del ADC, si es mayor a 170, la histeresis le pondremos valor igual a 2. De lo contrario será 0.
Vamos con el ejem.
Val=readADC();
Val=Val+histeresis;
if(Val>170) histeresis=2;
else histeresis =0;
Prueba ésto en tu código.
El transformador es Entrada=220, Salida= 0,12,0
El OPAMP se energiza con 5V.
El circuito es de una tarjeta que me encontre que usa el PIC16F676 y funciona bien. Como estoy aprendiendo queria hacer un programa para poder usar ese circuito en algun otro proyecto.
Intenta con el filtro que te envíe en la imagen. Solamente debes conectar el terminal negativo del OP a su salida, nada más
Te comento con un ejem, cómo funciona la histeresis por soft.
Por ejem, tenemos una referencia de corte, en tu caso 170. Bien entonces un valor leído del ADC, si es mayor a 170, la histeresis le pondremos valor igual a 2. De lo contrario será 0.
Vamos con el ejem.
Val=readADC();
Val=Val+histeresis;
if(Val>170) histeresis=2;
else histeresis =0;
Prueba ésto en tu código.
Robert gracias. Disculpa la molestia es la primera vez que veo esto: Ese codigo lo pongo en la funcion que encuentra el promedio despues de leer el adc? o va cuando hago la condicion del if para ver si se enciende o apaga la carga dentro del ciclo while?
Ademas, la instruccion "Val=Val+histeresis" va despues del if o antes como lo pusiste. Asumiendo que va despues inicialice histeresis con 0.
Val=readADC();
histeresis = 0;
if(Val>170) histeresis = 2;
else histeresis = 0;
Val=Val+histeresis
Este es el codigo que he implementado. No se muy bien como usar la histeresis. Por favor pueden revisarlo y decirme si esta bien?
while(1)
{
obtenerPico();
histeresis=0;
if(valorPico>310) histeresis=2;
else histeresis =0;
valorPico=valorPico+histeresis;
if (valorPico>310 && valorPico<460)
{
PORTC=0b00000010;
}
else
{
PORTC=0b00000000;
}
}
Veo que has incluido esas líneas cómo comenté. Y cómo ha funcionado?
El valor de la histeresis puedes modificarlo, no necesariamente tiene que valer 2. Puedes probar con números mayores, por ejem. 4, 10 o más, pero verás que se necesita mayor salto de valor de la lectura, para lograr el cambio en la salida.
Debes experimentar todo eso, te ayudará para comprender cómo funciona.
Volviendo, añadir ésta histeresis, sólo trabajará en el corte inferior de tu programa, luego añadiremos histeresis al corte superior. Pero vamos por partes.
El valor de C1 y C2 es muy pequeño. Prueba a utilizar valores cómo 220nF o 1uF.
El valor de C1 y C2 es muy pequeño. Prueba a utilizar valores cómo 220nF o 1uF.
Otra cosa que noté es que la resistencia 6 de 22k e muy grande para el ADC interno del micro y puede producir lentitud al adquirir valores, en las hojas de datos te recomiendan una impedancia de máximo 1k. O mejor quitar la resistencia y conectar directo al pin del micro.
Correcto! Pero la idea, es lograr que trabaje el programa cómo corresponde.El valor de C1 y C2 es muy pequeño. Prueba a utilizar valores cómo 220nF o 1uF.
El problema de eso es que cuando el voltaje vaya a un nivel peligroso de forma abrupta , el filtro introduce un retardo grande y más el código que introduce más retardos que cuando el micro decida que debe desconectar la carga, dicha carga debe estar fundida literalmente.