Autor Tema: sensor temperatura termocupla Pic16f877 con ccs no displaya valores correctos  (Leído 10856 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado zensejjeflz

  • PIC10
  • *
  • Mensajes: 6
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

Desconectado KIRIKU

  • PIC10
  • *
  • Mensajes: 3
Re: sensor temperatura termocupla Pic16f877 con ccs no displaya valores correctos
« Respuesta #1 en: 27 de Junio de 2011, 09:05:23 »
HOLA ESTA BIEN SU CONTROL, PERO HABRIA SIDO MAS FACIL SI HUBIERA LINEALIZADO LA TERMOCUPLA PARA QUE PRESENTARA EL MISMO COMPORTAMIENTO DEL LM35, PARA ELLO DEPENDIENDO DEL TIPO DE TERMOCUPLA ESTAN LOS INTEGRADOS AD595AQ O EL 594.

YO HUBIERA HECHO MAS REAL EL CONTROL, HABRIA TOMADO 10 LECTURAS Y HUBIERA PROMEDIADO, ESO ME DARIA UNA LECTURA OK

 
 

Desconectado beto2kar

  • PIC10
  • *
  • Mensajes: 2
Re: sensor temperatura termocupla Pic16f877 con ccs no displaya valores correctos
« Respuesta #2 en: 18 de Septiembre de 2011, 14:10:29 »
Pregunta tonta: cuando seteaste:  #device adc=16 fue así ó #device adc=10 así?


 

anything