Se trata de un sencillo ejemplo de uso del conversor AD del PIC. Mediante un divisor de tensión formado por dos LDR en la entrada analógica obtendremos un valor de tensión proporcional a la diferencia de luminosidad entre ambas LDR. En un display LCD mostraremos los porcentajes de luz de una de las LDR respecto de la otra.
Para configurar el conversor AD del pic primeramente definiremos el número de bits para la conversión. Pueden ser 8, 10, 11 ó 16. En este caso se ha optado por una conversión a 10 bits:
#device adc=10
Dentro ya de la función principal del programa, definimos el canal de entrada analógico que se va a emplear, el canal al que conectaremos el valor de tensión a medir. Aquí se ha empleado en canal AN0, pin 2 del PIC 16F876A.
setup_adc_ports(AN0);
Se selecciona el tipo de oscilación para el tiempo de conversión, en este caso se ha optado como fuente de reloj RC:
setup_adc(ADC_CLOCK_INTERNAL);
Finalmente se habilita el canal para la lectura. Hemos quedado que empleabamos el canal AN0.
set_adc_channel(0);
A partir de este momento, cada vez que queramos optener la lectura ejecutamos la instrucción:
valor_digital=read_adc();
En la variable "valor_digital" optendremos la lectura correspondiente a la tensión analógica en un valor digital de 10 bits, de 000h a 3FFh.
Este es el programa completo.
En la simulación bajo Proteus se puede ver el funcionamiento.
Y en la animación de la demostración de su funcionamiento real.
Todos los archivos del proyecto se pueden descargar en este enlace:
El proyecto contenido en el artículo ha sido diseñado y probado con éxito utilizando las siguientes versiones de software:
- Windows xp y windows 7
- Proteus V7.7 SP2
- CCS PIC C COMPILER v4.084
- Windows xp y windows 7
- Proteus V7.7 SP2
- CCS PIC C COMPILER v4.084
9 comentarios:
hola.. deseo preguntar como fue la conexion de tu lcd en tu proyecto de lectura de luminosidad, actualmente he intentado funcionar un lcd 16x2 JHD 162A pero no logro que mande el mensaje: utilizo la libreria lcd.c de ccs. utilizo un pot de 10k para el contraste pero aun asi no funciona lo simulo en proteus y funciona. no se que estoy haciendo mal no se si es el por el tipo del lcd o es la conexion.....
gracias...!
te envio el codigo
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP
#use delay( clock=4000000 )
#use fast_io(D)
#include
void main()
{
lcd_init();
lcd_putc( "\f" );
lcd_putc("inicializando");
delay_ms(1000);
lcd_putc( "\f" );
lcd_gotoxy(2,1);
lcd_putc("hola");
}
Hola Israel.
Fijate en el código del programa del PIC del artículo.
Debes definir el puerto para el LCD:
#define use_portb_lcd TRUE
y luego carga el archivo del LCD:
#include
Conecta el LCD al puerto b para evitarte problemas.
El ejemplo del artículo esta probado como se ve en el video de demostración. Puedes partir desde ese programa si tienes problemas. Si aun asi no te funciona puede ser posiblente que el lcd fisico que uses no sea compatible con la libreria lcd cargada.
muchisimas gracias por contestar mi pregunta y los consejos, ya proble cambiando del puerto-d al puerto-b en proteus y funciona. voy hacer la prueba en real aver q sucede, si veo que sigue el problema voy a cambiar de lcd.
la conexiones que voy hacer para la prueba por si estoy conectando mal es:
lcd-D7 a B7-micro
lcd-D6 a B6-micro
lcd-D5 a B5-micro
lcd-D4 a B4-micro
D3-D0 no lo conecto.
E a B0
RS a B1
RW B2
B3- micro NO SE UTILIZA
pin 1 del lcd a tierra
pin 2 del lcd a positivo
pin 3 contraste pot 10k(tu lo conectaste a tierra en el proyecto?)
15 y 16 la de blacklight la utilizastes?
otra pregunta mas cual es la marca de lcd 16x2 que utilizastes en el proyecto u otro que sepas que no te haya generado problemas con la libreria del ccs y la compre por si persiste el problema.
muchas graciass!!!!
saludos....!
El LCD que he empleado para la demostración real es un C-2602. Los patillajes son como indicas, con pines 15 y 16 al aire, puesto que no dispone de iluminación. Yo no he empleado potenciómetro para el contraste dado que lo tenía que ajustar casi al límite para que se viera bien por lo que lo conecté directamente sin él.
Hola, soy nuevo en esto de la electrónica y me surge una duda acerca del montaje, he visto que has puesto las 2 LDR como un divisor de tensión por lo que a la entrada del pic tendrás la mitad de la tensión de entrada aproximadamente. Por lo que no entiendo porque en el código que usas para pasar del valor digital al analógico multiplicas por 5 en lugar de por 2.5 que es lo que tendrías a la entrada del pic.
Un saludo y enhorabuena por la entrada me ha ayudado muchísimo.
Javier.
2,5v habrá cuando las dos LDR tengan el mismo valor. Según los valores que adquieran, la tensión de entrada puede oscilar entre valores cercanos a 0v y 5v.
Como el conversor se ha configurado para 10 bits debes dividir para 1024. Y para ese valor digital, la tensión analógica que le corresponde va a ser 5V, por lo que se multiplica por 5. Da igual si nunca se van a alcanzar los 5v, debe haber una relación entre el valor analógico y el valor digital.
Muchas gracias por la respuesta y enhorabuena por el blog me hago fan desde ya ;)
hola disculpa soy nuevo programando y queria ver si me podrias ayudar a configurarlo pero para el pic 4550 con ccs .. gracias
Jose. Debes cargar el PIC 18f4550 en lugar del pic 16f876 en #include <16f876a.h> y utilizar los fuses en funcion de tus requerimientos. En este enlace tienes un proyecto con un ejemplo del 18f4550 donde explico como configurarlos.
http://robotypic.blogspot.com.es/2013/02/comunicacion-pc-pic-por-usb.html
Publicar un comentario