hola a todos nuevamente
eh implementado un sensor de temperatura con una termocupla tipo k y un lm35 para compensación de la unión fria, el incoveniente es que el lcd donde displayo la temperatura no corresponde a los sensores de temperatura. todo apunta al codigo en ccs que es:
#include <16f877A.h>
#use delay(clock=4000000)
#include <D:\proteus_pic16f84a\owen\lcds.c>
#use standard_io (D)
void main(void)
{
int medi;
float temper,medicion;
lcd_init(); //inicia LCD
lcd_putc("sejje\n"); //saca texto
delay_ms(500);
lcd_putc("\f"); //limpia pantalla
lcd_putc("temperatura\n"); //saca texto
delay_ms(500);
lcd_gotoxy(14,2); //acomoda cursor lcd
lcd_putc("oC");
while (1)
{
lcd_gotoxy(8,2); //acomoda cursor lcd
lcd_putc(""); //limpia ese sector de la pantalla
lcd_gotoxy(8,2); //acomoda cursor lcd
setup_adc_ports (RA0_RA1_analog_RA3_ref);
setup_adc (adc_clock_div_32); //enciende adc
set_adc_channel(0); //elige canal a medir RA0
delay_us(20);
medicion=read_adc(); //hace conversión adc
set_adc_channel(1); //elige canal a medir RA1
delay_us(20);
medi=read_adc(); //hace conversión ad
setup_adc (adc_off); //apaga adc
temper=((medicion/0.41*0.48875))+(medi*(0.48875));
printf(lcd_putc,"%02.1f",temper);
delay_ms(100);
}
}
el codigo que modifique para el lcd es este:
// funciones para la gestion del display LCD.
// lcd_init() debe ser llamada antes de las otras funciones.
// lcd_putc(c) visualiza c en la siguiente posicion del display.
// caracteres especiales de control:
// \f Borrar display.
// \n saltar a la segunda linea.
// \b retroceder una posición.
// lcd_(x,y) selecciona la nueva posición de escritura en el display.
// (la esquina superior izquierda es 1,1)
// lcd_getc(x,y) devuelve el caracter x,y del display.
#bit lcd_enable = 9.0
#bit lcd_rw = 9.1
#bit lcd_rs = 9.2
#byte lcd_e = 9
#byte lcd_b = 6
#define LCD_LINEA2 0x40 // direccio de memoria para la segunda linea
#define LCD_DATO 1
#define LCD_COMANDO 0
#define LCD_CLEAR 0x01
#define LCD_HOME 0x02
#define LCD_DISPLAY_OFF 0x08
#define LCD_DISPLAY_ON 0x0C
#define LCD_CURSOR_ON 0x0E
#define LCD_CURSOR_BLINK 0x0F
#define LCD_CURSOR_SHIFT_RIGHT 0x10
#define LCD_CURSOR_SHIFT_LEFT 0x14
#define LCD_DISPLAY_SHIFT_RIGHT 0x18
#define LCD_DISPLAY_SHIFT_LEFT 0x1C
int lcd_leer()
{
int valor;
set_tris_e(0x18);
set_tris_b(0xFF);
lcd_rw = 1;
delay_cycles(1);
lcd_enable = 1;
delay_cycles(1);
valor = lcd_b;
lcd_enable = 0;
delay_us(40);
set_tris_b(0x00);
return valor;
}
void lcd_enviar(int dir, int valor)
{
set_tris_e(0x00);
set_tris_b(0x00);
lcd_rs = 0;
while(bit_test(lcd_leer(),7));
lcd_rs = dir;
delay_cycles(1);
lcd_rw = 0;
delay_cycles(1);
lcd_enable = 0;
lcd_b = valor;
delay_cycles(1);
lcd_enable = 1;
delay_us(2);
lcd_enable = 0;
delay_us(40);
}
void lcd_init()
{
int i;
set_tris_e(0x18);
set_tris_b(0x00);
lcd_enable = 0;
lcd_rw = 0;
lcd_rs = 0;
delay_ms(15);
for(i=0; i<3; i++)
{
lcd_enviar(LCD_COMANDO,0x38);
delay_ms(5);
}
lcd_enviar(LCD_COMANDO,LCD_DISPLAY_ON);
lcd_enviar(LCD_COMANDO,0x06);
lcd_enviar(LCD_COMANDO,LCD_CLEAR);
lcd_enviar(LCD_COMANDO,LCD_HOME);
}
void lcd_gotoxy(byte x, byte y)
{
byte dir;
if(y!=1)
dir=LCD_LINEA2;
else
dir=0;
dir+=x-1;
lcd_enviar(LCD_COMANDO,0x80|dir);
}
void lcd_putc(char c)
{
switch (c)
{
case '\f' : lcd_enviar(LCD_COMANDO,0x01);
delay_ms(2);
break;
case '\n' : lcd_gotoxy(1,2);
break;
case '\b' : lcd_enviar(LCD_COMANDO,0x10);
break;
default : lcd_enviar(LCD_DATO,c);
break;
}
}
char lcd_getc(int x, int y)
{
char valor;
lcd_gotoxy(x,y);
lcd_rs = 1;
valor = lcd_leer();
lcd_rs = 0;
return valor;
}
bien, mi relación de conversión de temperatura esta bien, creo yo, ps explicandolo
tenemos que la termocupla tiene una sensibilidad de 41uV/º y el lm 35, 10mv/ºC
entonces la temperatura a una resolucion de 10 bits sera :
temper=(medicion en volts)/(0.41*100 uV/ºC)*(5V/1023)) + ((medi en volts)/(10 mV/ºC))*(5V/1023)
lo que nos da:
temper=((medicion/0.41*0.48875))+(medi*(0.48875));
donde
medicion es la salida de la termocupla
medi es la salida del lm35
adjunto la figura donde muestra un valor erroneo de la temperatura real
espero sus observaciones sugerencias soluciones
gracias