La práctica consiste en mostrar en el LCD gráfico una tensión analógica de 5v de pico, con algún dibujo. En mi caso una simulación de osciloscopio con un dibujo animado, al llegar a 5v agita los brazos.
Características:
Para controlar el LCD gráfico nos ayudamos de las librerías del CCsC (HDM64GS12.c y GRAPHICS.C). Contiene funciones para colorear un pixel, dibujar circulos, rectas y cuadrados, e introducir texto.
Diseño del esquemático:
- Utilizaremos el microcontrolador PIC18F4550, con un reloj de 20Mz y un pulsador con circuito R-C a modo de reset:
- Un LCD gráfico 128x64 con el controlador KS0108. Le colocaremos una resistencia variable para modificar el contraste, y un condesandor de desacoplo:
- La entrada analógica de 5 voltios la obtenemos con una resistencia variable de 5K:
Código:
////////////////////////////////////////////////////////////////////////////////////
// AUTOR: Daniel de Cos Noviembre/2011 //
////////////////////////////////////////////////////////////////////////////////////
// PROGRAMA: conversor_LCDgrafico VERSIÓN: 1.0
// DISPOSITIVO: PIC 18F4550 COMPILADOR: CCS vs4.023
// Entorno IDE: MPLAB ID v8.56 SIMULADOR: Proteus 7.7 sp2
// TARJETA DE APLICACIÓN: SISTEMA_2011 DEBUGGER: ICD3
////////////////////////////////////////////////////////////////////////////////////
// //
////////////////////////////////////////////////////////////////////////////////////
// Mostrar una tensión entre 0 y 5 voltios en el LCD gráfico //
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// CABECERA ////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
#include <C:\H\18F4550.h>
#device adc=10
//#FUSES INTHS //reloj interno
#FUSES HS //reloj de alta velocidad
#FUSES MCLR //Master clear pin enable
#use delay(clock=20000000) //20MHz
//use delay(internal= 1Mhz) //velocidad del oscilador interno
#include <HDM64GS12.c>
#include <GRAPHICS.C>
#include <math.h>
////////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
char analo[10]; //Array donde se introduce la conversión AD
char text1[]="Daniel de Cos Perez";
char text2[]="Voltios=";
char text3[]="5";
char text4[]="0";
////////////////////////////////////////////////////////////////////////////////////
// FUNCIONES ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// PRINCIPAL ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
void main()
{
const long int escala= 1023; //el fondo de escala depende de los bits del conversor
const float v_max= 5.0; //Tensión máxima introducida
float voltaje;
long int valor; //si utilizamos el conversor de 10 bits, la variable tendra que ser de 16 bits
//confiduracion de CAD:
setup_adc(ADC_CLOCK_DIV_32); //seleccionamos el reloj de conversión
setup_adc_ports(AN0); //configurar el conversor
set_adc_channel(0); //selecciona el canal
//Texto:
glcd_init(on);
glcd_text57(0, 0, text1, 1, on);
glcd_text57(0, 57, text2, 1, on);
//Grafica:
glcd_text57(0, 10, text3, 1, on);
glcd_text57(0, 47, text4, 1, on);
glcd_line(6, 17, 6, 50, on);
glcd_line(6, 50, 80, 50, on);
//Monigote:
glcd_circle(107, 21, 5, no, on); //cabeza
glcd_pixel(105, 20, on); //ojos
glcd_pixel(109, 20, on);
glcd_pixel(107, 22, on); //nariz
glcd_line(106, 24, 108, 24, on); //boca
glcd_pixel(105, 23, on);
glcd_pixel(109, 23, on);
glcd_line(107, 26, 107, 45, on); //cuerpo
glcd_line(107, 45, 100, 55, on); //patas
glcd_line(107, 45, 114, 55, on);
//mano abajo
//glcd_line(107, 31, 100, 38, on);
//glcd_line(107, 31, 114, 38, on);
//mano arriba
//glcd_line(107, 31, 100, 24, on);
//glcd_line(107, 31, 114, 24, on);
//Vamos cambiando la línea de la gráfica y el valor de la conversión con cada cambio:
//sprintf(char,"%f", float); //variable tipo char, %f, variable tipo float
for(;;){
valor= read_adc(); //leemos la entrada analógica
voltaje= (valor* v_max)/ escala;
if(voltaje!= 5.0){
//mano abajo
glcd_line(107, 31, 100, 38, on);
glcd_line(107, 31, 114, 38, on);
}
if(voltaje== 0.0){
sprintf(analo,"%1.3f", voltaje); //variable tipo char; muestra; variable tipo float
glcd_text57(50, 57, analo, 1, on); //mostrar tension
glcd_line(7, 49, 80, 49, on); //linea gráfica
delay_us(1000);
glcd_text57(50, 57, analo, 1, off); //borrar tensión
glcd_line(7, 49, 80, 49, off); //borrar línea de la gráfica
}
if((voltaje<= 0.5) & (voltaje> 0.0)){
sprintf(analo,"%1.3f", voltaje);
glcd_text57(50, 57, analo, 1, on);
glcd_line(7, 47, 80, 47, on);
delay_us(1000);
glcd_text57(50, 57, analo, 1, off);
glcd_line(7, 47, 80, 47, off);
}
if((voltaje<= 1.0) & (voltaje> 0.5)){
sprintf(analo,"%1.3f", voltaje);
glcd_text57(50, 57, analo, 1, on);
glcd_line(7, 44, 80, 44, on);
delay_us(1000);
glcd_text57(50, 57, analo, 1, off);
glcd_line(7, 44, 80, 44, off);
}
if((voltaje<= 1.5) & (voltaje> 1.0)){
sprintf(analo,"%1.3f", voltaje);
glcd_text57(50, 57, analo, 1, on);
glcd_line(7, 41, 80, 41, on);
delay_us(1000);
glcd_text57(50, 57, analo, 1, off);
glcd_line(7, 41, 80, 41, off);
}
if((voltaje<= 2.0) & (voltaje> 1.5)){
sprintf(analo,"%1.3f", voltaje);
glcd_text57(50, 57, analo, 1, on);
glcd_line(7, 38, 80, 38, on);
delay_us(1000);
glcd_text57(50, 57, analo, 1, off);
glcd_line(7, 38, 80, 38, off);
}
if((voltaje<= 2.5) & (voltaje> 2.0)){
sprintf(analo,"%1.3f", voltaje);
glcd_text57(50, 57, analo, 1, on);
glcd_line(7, 35, 80, 35, on);
delay_us(1000);
glcd_text57(50, 57, analo, 1, off);
glcd_line(7, 35, 80, 35, off);
}
if((voltaje<= 3.0) & (voltaje> 2.5)){
sprintf(analo,"%1.3f", voltaje);
glcd_text57(50, 57, analo, 1, on);
glcd_line(7, 32, 80, 32, on);
delay_us(1000);
glcd_text57(50, 57, analo, 1, off);
glcd_line(7, 32, 80, 32, off);
}
if((voltaje<= 3.5) & (voltaje> 3.0)){
sprintf(analo,"%1.3f", voltaje);
glcd_text57(50, 57, analo, 1, on);
glcd_line(7, 29, 80, 29, on);
delay_us(1000);
glcd_text57(50, 57, analo, 1, off);
glcd_line(7, 29, 80, 29, off);
}
if((voltaje<= 4.0) & (voltaje> 3.5)){
sprintf(analo,"%1.3f", voltaje);
glcd_text57(50, 57, analo, 1, on);
glcd_line(7, 26, 80, 26, on);
delay_us(1000);
glcd_text57(50, 57, analo, 1, off);
glcd_line(7, 26, 80, 26, off);
}
if((voltaje<= 4.5) & (voltaje> 4.0)){
sprintf(analo,"%1.3f", voltaje);
glcd_text57(50, 57, analo, 1, on);
glcd_line(7, 23, 80, 23, on);
delay_us(1000);
glcd_text57(50, 57, analo, 1, off);
glcd_line(7, 23, 80, 23, off);
}
if((voltaje<= 4.9) & (voltaje> 4.5)){
sprintf(analo,"%1.3f", voltaje);
glcd_text57(50, 57, analo, 1, on);
glcd_line(7, 20, 80, 20, on);
delay_us(1000);
glcd_text57(50, 57, analo, 1, off);
glcd_line(7, 20, 80, 20, off);
}
//Al llegar a 4.9v agita las manos arriba y abajo
if(voltaje> 4.9){
sprintf(analo,"%1.3f", voltaje);
glcd_text57(50, 57, analo, 1, on);
glcd_line(7, 18, 80, 18, on);
//mano abajo
glcd_line(107, 31, 100, 38, on);
glcd_line(107, 31, 114, 38, on);
delay_us(1000);
glcd_line(107, 31, 100, 38, off);
glcd_line(107, 31, 114, 38, off);
//mano arriba
glcd_line(107, 31, 100, 24, on);
glcd_line(107, 31, 115, 24, on);
delay_us(1000);
glcd_line(107, 31, 100, 24, off);
glcd_line(107, 31, 115, 24, off);
glcd_text57(50, 57, analo, 1, off);
glcd_line(7, 18, 80, 18, off);
}
}
}
Simulación:
Comprobación programa:
No hay comentarios:
Publicar un comentario