Convertir pulsos (frecuencia) variables de un medidor de flujo a voltaje variable

Necesito obtener voltaje DC variable el cual sea proporcional al numero de pulsos (frecuencia) que me da un medidor de flujo.
Yo lo realice mediante un Pic al cual le envio a un pin los pulsos del medidor de flujo y saco por otro pin PWM y de ahi voy controlando un voltaje mas alto con el disparo de un Tip o un SCR, pero no me sale un voltaje optimo, tambien le puse una pantalla LCD para que me vaya mostrando los litros/seg que mide el medidor de flujo, es decir a 4 pulsos por segundo es 1 litro, y al ser mi rango de control entre 5 lt/s y 10lt/s, o sea si vaja de 5lt/s me reduce un 40% el voltaje de entrega y si sobrepasa los 10 lt/s sube un 20% de voltaje, todo facil hasta ahi, pero cuando arme el circuito y al hacerlo funcionar, se nota que al monento que esta leyendo los pulsos se demora el programa y el voltaje de salida baja notablemente, y se apaga y se enciende.
Hice un cambio y en vez de leer pulsos medi el voltaje analogico de un poten, el voltaje PWM me salio perfento reduciendo un 40% al baja de 5lt/seg y sube un 20% al subir de 10lt/seg, sin demorarse perceptiblemente nada.
Intente convertir los pulsos mediante un Lm2907N, para enviarle un voltaje analogico al PIC, pero el LM2907N no me convierte de frecuencia a voltaje, teniendo en cuenta que estoy utilizando 5 VCD de alimentacion.
Que solucion pueden ofrecerme?
 
Última edición:
Necesitaría más datos para poder orientarte mejor.
1) ¿Cuál es la frecuencia máxima de entrada al PIC? La que lees del medidor de flujo
2) ¿Cuál es la frecuencia a la que está trabajando el PIC? El oscilador del PIC
(Ten en cuenta que la frecuencia del PIC se divide por 4 y esa es la velocidad que tarda cada instrucción de ensamblador aproximadamente)

Por otro lado, puede ser que si el PIC está conectado directamente al TIP o SCR, necesiten mucha corriente para su polarización (mayor a la que puede entregar el PIC) y por eso se te resetee. Intenta poner un transistor entre el TIP o SCR.

También tendrías que asegurarte que la tensión de entrada al PIC no supere nunca la de alimentación. Eso puede provocar un funcionamiento anómalo.
 
La frecuencia maxima es de 80 Hz, el oscilador es de 4MHz.

Estoy usando Pic Basic como programa, talves sea muy pesado?

El TIP lo estoy disparando mediante un opto, pero cuando le hago funcionar con voltaje anologico de entrada al pic, desde luego cambiando el programa para leer voltaje analogico o sea haciendo un conversor analogico digital y saco el PWM, nisiquiera necesito poner el opto porque funciona bien, pero, al cambiarle el programa para leer pulsos, no es que se resetee, sino, que se detiene o demora en el momento que esta leyendo los pulsos, porque le puse que se encienda un led en el programa antes de la linea de comando que lee los pulsos y se nota que al comenzar a leer los pulsos se demora y como le puse que controle un motor de prueba de 5VCD para ir controlandole la velocidad pierde velocidad en ese momento volviendo a retomarla despúes, cosa que no sucede cuando lo hago con la entrada de voltaje analogico.
Ya que con la entrada de voltaje analogico con conversor AD, solo baja el voltaje a 40% menos cuando baja de 5lt/s y de 6lt/s a 9 lt/s se mantine en el voltaje seteado y si sube a 10 o mas lt/s sube un 20% de VCD.
Pero con pulsos cuando esta entre 5lt/s y 10lt/s al momento de leer los pulsos baja el voltaje seteado y luego sube, y si baja a 5lt/s el programa si funciona haciendole bajar el 40% del voltaje seteado pero de igual forma en esta subrutina al momento de leer los pulsos baja de (Vset -40%) y luego sube y asi se mantiene. y asi mismo al subir de 10lt/s sube un 20% de Vset pero al momento de leer los pulsos baja de (Vset + 20%) y luego sube, es como si el motor estuviese queriendose apagar y encender.

No se si sea muy pesado con Pic Basic y por eso se demora o puedo canvertir los pulsos por hardware con otro circuito a parte y luego enviarle al Pic, qué me sugieres?

Le intente con el LM2907 pero no se si sea porque estoy utilizanzo 5VCD y en los datasheets decia que la alimentacion es de 12VCD.
 
Amigo PauJef, veamos, porque necesitas convertir una señal en fcia. a un valor analogo DC?, pues si el dispositivo te ofrece una señal asi, solo debes programar al PIC, para que funcione como frecuencimetro, una vez que tienes el valor en una variable, la manejas a tu antojo como quieras.
No esta demas mencionar, que deberas utilizar interrupciones para este cometido.
 
PauJef te hago una pregunta, ¿estás usando el conversor AD del PIC para leer los pulsos?

De ser así, y si los pulsos a la entrada del PIC son del suficiente nivel, podrías leerlos como si fuera una señal digital. Es más, si estás usando algún conversor AD del PIC, puede ser esa la causa del porque anda tan lento tu programa.

Si dudas de que sea el Pic Basic la causa de la lentitud, por lo general los compiladores generan un archivo de código intermedio escrito en assembler y comentado con cada instrucción del programa.
Podrías localizarlo o ver como generarlo para poder ver que está haciendo realmente tu programa.

Le intente con el LM2907 pero no se si sea porque estoy utilizanzo 5VCD y en los datasheets decia que la alimentacion es de 12VCD.

Yo descartaría de colocar algo en medio porque estarías introduciendo más posibles fuentes de fallas a tu proyecto.

Si posteas tu código, ayudaría un poco más.
 
No para leer los pulsos uso otro comando que es el COUNT PORTB.0,1000,dato y para la conversion AD uso el ADCIN

Bueno aqui envio un adjunto con el programa, lo que esta remarcado con rojo es la parte de los pulsos, envio el programa que lee voltaje analogico o sea la conversion AD al cual si sale OK, y tambien el programa de los pulsos.... espero puedas encontrar el problema
 

Adjuntos

  • PROGRAMA DE CONVERSION DE PULSOS A PWM.doc
    54 KB · Visitas: 81
Amigo PauJef, la instruccion COUNT, mientras se ejecuta, el microprocesador no puede realizar otra tarea, y como tu utilizas un tiempo de 1seg. para tomar la muestra, el programa puede volverse muy lento, si es muy extenso.
Para esto utiliza interrupciones.
 
Última edición:
PauJef, como te dice el amigo Gudino Roberto duberlin, efectivamente la función COUNT cuenta durante 1 segundo (o 12,5 ms en el porgrama original) la cantidad de pulsos que ingresaron en el PIN especificado.

Me parece que hay un error en la lógica que estas utilizando, ya que deberías asegurarte de empezar a contar exactamente cuando llega un pulso y no en cualquier momento como lo está haciendo el programa.
Ahora llamas a la función COUNT en el momento que sea y esto no es así porque sino estarás introduciendo un error en cada medición.

Imagina que cuentas exactamente cuando llega un pulso durante los 12,5 ms. A countinuación tu programa sigue el flujo normal pero también tienes una comunicación con el LCD la cual introduce demoras e inclusive hay un for...next de 50 repeticiones con una pausa de 10 mseg en cada interación, lo cual te da unos 500 mseg de retardo hasta la próxima lectura de la frecuencia de entrada.
Durante esos 500 mseg, perdiste un montón de información (pulsos).

Deberías comenzar la lectura al producirse una interrupción debido a la llegada del primer pulso y ahí sí contar durante 12,5 ms la cantidad de pulsos. Luego deshabilitar la interrupción, ejecutar el código que quieras (teniendo en cuenta que cuantos más retardos haya más información perderás) y luego habilitar la interrupción nuevamente para esperar el próximo grupo de pulsos.

Saludos
 
Gracias amigos todas sus sugerencias las voy a realizar es mas estoy en eso.... espero poder resolver pronto el problema con todo lo expuesto..

Estare en contacto..
 
Mas o menos.... bueno la interrupcion del B.0 que se ejecuta apenas detecta un pulso, y se va a ejecutar la accion especificada,,,,,, sino porfa instruyeme como lo puedo hacer un poco mas detallado
 
Amigo, bueno utilizar interrupciones, requiere conocimiento de la arquitectura del procesador que se vaya a utilizar.
Basicamente como funciona una interrupcion, pues como su nombre lo indica.
Toda forma de ejecutar un programa independiente del tipo de procesador que se utiliza, el sistema es el mismo, linea tras linea se ejecutan las instrucciones, con saltos de subrutinas y demas.
Ahora bien, cuando una interrupcion ha sido habilitada, las cosas cambian, pues cuando las condiciones dan lugar para que la misma intervenga. El programa que se esta corriendo, se detiene para atender imperiosamente un llamado unico, el cual tiene una direccion determinada.
Cuando la interrupcion ha sido atendida y ejecutada, retorna a la linea del programa principal para continuar lo que estaba haciendo hasta que nuevamente alguna interrupcion tenga que ser atendida.
Ahora bien, debes leer el datasheet del microcontrolador que utilizas.
Pues alli encontraras, como se habilita y define una interrupcion o grupo de interrupciones, existen terminales segun sea el mod. de procesador destinados para interrupciones especificas, como por ejem. habilitacion, por cambio de nivel, cambio de flanco, etc.
 
Última edición:
Amigos he estado un poco ocupado pero ya trate con interrupciones, y no me sale, me podrian ayudar con algun ejemplo de como utilizar interrupciones pero en Picbasic, me supongo que debo tratar de hacer un contador pero utilizando las interrupciones, pero eso els lo que no tengo claro, es decir cuando las las desabilito y todo el rollo, busque en el datasheet y habilite la interrupcion por transicion de bajo a alto para el pin RA4/T0CKI, para que me lea pulsos pero no me sale.

Me serviria algun ejemplo de como realizar ese contador con interrupciones se los agradeceria!!!!
 
Atrás
Arriba