PIC18F4550 & XC8: Uso del ADC - Controlar el tiempo de cambio de estado en un LED

En este ejemplo vamos a retomar el post anterior, agregando un potenciometo para poder trabajar con el ADC, lo que haremos sera sencillo pero demostrativo para entender de forma basica como se usan los pines analogicos de este PIC, como antes recomiendo leer la seccion del ADC del datasheet para comprender mejor el tema. lo que haremos en este ejercicio sera leer el pin AN0 y usar ese valor para aumentar o decrementar un retardo en el cambio de estado de un LED.

Un par de datos importantes antes de empezar.
  • Para configurar el ADC se utilizan los registros ADCON0, ADCON1 y ADCON2.
  • No es posible usar cualquier pin analogico (como se hace con PIC mas recientes), pero podemos seleccionar la combinacion que mejor se acomode a nuestro proyecto, esto lo hacemos configurando los bits PCFG[3:0] del registro ADCON1
  • Como el ADC de este PIC es de 10 bits, tenemos dos registros para almacenar su valor; ADRESH:ADRESL, que podemos seleccionar si queremos justificarlos a la derecha o a la izquierda (esto simplemente afecta la forma de procesar el resultado, regularmente pregiero usarlo a la izquierda) y se configura con el bit ADFM del registro ADCON2
  • Recordar que este PIC solo tiene un ADC y lo que se hace es multiplezar las entradas, para eso debemos seleecionar ell canal que queremos utilizar, esto lo hacemos con los bits CHS[3:0] del registro ADCON0.

Circuito:
El circuito que vamos a utilizar es el siguiente, al cual se ha agregado un potenciometro de 10K al pin AN0.


Código:
Para el código se ha separado algunas cosas entre ellas se han agregado los archivos adc.h y adc.c en donde se encuentra todo lo relacionado con el ADC, por lo menos la funciones que vamos a utilizar. Este archivo lo vamos a utilizar en futuros proyectos y es el motivo del por que se ha separado, regularmente recomiendo hacerlo para que su codigo pueda ser portable a otros proyectos, incluso a otros MCUs, bueno una de las funciones principales es void ADC_Initialize(uint8_t PortConfig) en donde se configura la forma en la que trabajara el ADC, importante decir que para este PIC podemos usar solo ciertos pines, mejor dicho una combinacion de pines, para este ejemplo solo voy a utilizar AN0 por lo tanto esa sera lo que le carge a uint8_t PortConfig en esta fuincion, la siguiente funcion es uint16_t ADC_GetSingleConversion(uint8_t Channel) en la cual lee el pin analogico (uint8_t Channel) y nos regresa el valor en una variable tipo unsigned int.

Tambien se ha agregado mcu.h y mcu.c en donde se encuentran las funciones para configurar nuestro micorontrolador y la funcion principal que se estara ejecutando desde nuestro archivo main.c, para este ejemplo la he llamado void IO_Task(void). Lo primero que hacemos es leer el valor de AN0 y lo multipicamos por dos para tener un valor mas grande, despues agregamos un retardo base de 100 milisegundos, seguido por el retardo con el valor del ADC, despues cambiamos el estado del LED y seguimos con una condicional para cambiar el estado de un segundo LED dependiendo del valor que se tenga en el ADC.  

Descargas:
Aquí el enlace directo para DESCARGAR los archivos disponibles, también puedes revisar o descargar la información desde mi repositorio en GitHub, si no sabes como descargarlo puedes checar aquí, bueno por el momento es todo si tienes dudas, comentarios, sugerencias, inquietudes, traumas, etc. dejarlas y tratare de responder lo mas pronto posible.


Donaciones:
Si te gusta el contenido o si los recursos te son de utilidad, comparte el enlace en tus redes sociales o sitios donde creas que puede ser de interés y la otra puedes ayudarme con una donación para seguir realizando publicaciones y mejorar el contenido del sitio. También puedes hacer donaciones en especie, ya sea con componentes, tarjetas de desarrollo o herramientas. Ponte en contacto para platicar, o puedes volverte uno de nuestros sponsors.


Pido una retroalimentación avisando cada que un enlace no sirva o tenga errores al momento de abrirlo, así también si una imagen no se ve o no carga, para corregirlo en el menor tiempo posible.

Referencias:

Publicar un comentario

0 Comentarios