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



## PauJef (Feb 25, 2013)

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?


----------



## agustinzzz (Feb 25, 2013)

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.


----------



## PauJef (Feb 26, 2013)

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.


----------



## Gudino Roberto duberlin (Feb 26, 2013)

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.


----------



## agustinzzz (Feb 26, 2013)

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.


----------



## PauJef (Feb 27, 2013)

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


----------



## Gudino Roberto duberlin (Feb 27, 2013)

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.


----------



## PauJef (Feb 27, 2013)

Gudino Roberto duberlin dijo:


> 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.




Gracias por el aporte... voy a intentarlo luego comento los resultados


----------



## agustinzzz (Feb 27, 2013)

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


----------



## PauJef (Feb 28, 2013)

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..


----------



## PauJef (Feb 28, 2013)

Una pregunta amigos!!!!!

La interrupcion la genero ingresando los pulsos por el puerto B.0, para que así se ejecute el COUNt?


----------



## Gudino Roberto duberlin (Feb 28, 2013)

, Bueno no es muy claro, lo que intentas decir. Pero has utilizado interrupciones?.


----------



## PauJef (Feb 28, 2013)

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


----------



## Gudino Roberto duberlin (Feb 28, 2013)

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.


----------



## PauJef (Abr 14, 2013)

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!!!!


----------



## Gudino Roberto duberlin (Abr 14, 2013)

Amigo, PICbasic, posee un menu de ayuda, para cada instruccion, ademas un ejem,. para su implementacion.


----------

