miércoles, 28 de noviembre de 2012

Lectura Analógico-Digital

En la siguiente entrada, mediante el Pic 18F4550 vamos a hacer una lectura de tensión analógica y visualizarla en el PC con Hyperterminal vía RS232. 
Primero realizaremos una simulación en Proteus, y una vez comprobado lo cargaremos en una Pic control.

Para comenzar analizaremos el Pic que vamos a utilizar, para conocer cuales son las entradas analógicas de que dispone. Según el datasheet, los pines que podemos configurar como analógicos son RA0, RA1,RA2,RA3.

Acto seguido pasaremos a realizar el esquemático en Proteus para que una vez que tengamos el código generado, podamos simularlo antes de programarlo físicamente.
Este es el esquemático diseñado en Proteus.
Como se puede observar la lectura analógica la hacemos por el puerto RA0. Hemos conectado el Lcd en el puerto D tanto los pines de control como los de datos y mediante el Pin RC6 transferimos los datos a Virtual terminal. Para la simulación en Proteus, no es necesario el Max232 para adaptar niveles de TTL a RS232, pero físicamente lo necesitamos sin ninguna duda.  


Ahora que ya hemos creado el diseño en Proteus, el segundo punto será la programación del código mediante MPLab.
Abajo adjunto el resultado del código para su descarga, pero primero lo explicaré detalladamente.

Cabecera:

#include <18f4550.h>  //Definimos la librería del Pic.
#device adc=10           //Establecemos la conversión analógica digital a 10 bits.
#FUSES  INTHS,MCLR,PUT,BROWNOUT  // Definimos los Fuses
#use delay(INTERNAL=8MHZ)                       //El reloj interno empleado es de 8Mhz
#use rs232 (BAUD =9600 , XMIT=PIN_C6 , RCV=PIN_C7 ) //RC6= Tx
/* La funcion use rs232 es para activar el Rs232 y establecer su configuración, le hemos puesto una velocidad de 9600 baudios, el pin Tx lo hemos definido como RC6 y el pin Rx como RC7(aunque no lo vamos a utilizar en esta práctica).*/
#include <lcd.c>          /* incluimos la librería lcd.c, en la cual tenemos que comprobar los pines de control y de datos */

Variables utilizadas:

long int val;
float voltaje;

Main:

void main()
{
   setup_adc(ADC_CLOCK_INTERNAL);  //configuramos el conversor A/D con el reloj interno
   setup_adc_ports(AN0||VSS_VDD);         //configuramos el pin RA0 como analógico   
   lcd_init();                                                      //funcion que activa el lcd
 do{   
   set_adc_channel(0);                                  //canal a especificar por la funcion read_adc
   delay_us(60);
   val=read_adc();                                     //almacenamos en la variable val con funcion read_adc
   voltaje=(4.98*val/1023.0);                    /*realizamos la conversión del valor obtenido, multiplicándolo por el voltaje de referencia que es 4.98 voltios y lo dividimos entre 1024.*/
   printf("\nVoltaje:%1.2f",voltaje);           //mostramos la lectura de voltaje en el lcd
   lcd_gotoxy(1,1);
   printf(lcd_putc,"Voltaje: %f",voltaje);    //enviamos la lectura por puerto serie
   delay_ms(2000);  
 }
   while(1);
}


Como ya tenemos el programa en C generado, lo compilaremos con MPLab y cargaremos el archivo *.cof en Proteus.

Estos son los Resultados de la simulación en Proteus:

Virtual Terminal es una herramienta que tiene Proteus que simula un hyperterminal para la recepción o transmisión de datos por puerto serie.


Si hacemos una variación en la resistencia del potenciómetro, se puede observar como cambia la lectura en el Lcd y se envía un valor nuevo por el puerto serie.



Descarga aquí el código

No hay comentarios:

Publicar un comentario