PIC16F877A con sensor de temperatura y presión

Hola a todos,

Soy nuevo en esta comunidad y ahora que empiezo a trastear con los PICs creo un buen momento para empezar a leeros y a escribir.

De las primeras cosas que hice fue el siguiente montaje, este lo adjunto como .jpg

Son dos sensores (temperatura y presión) que se conectan a un PIC 16F877A y muestra en un LCD los resultados, además le añado un LED que se enciende si se sobrepasan unos valores.

Aquí el código en C:

Código:
//LCD Pin Definition
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;

//LCD TRIS Definition
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;

void main (void)
{
  //Declaración de variables
  unsigned int Radct, Radcp, TemI, PreI;
  float Tem, Pre;
  char Textt[16], Textp[16];
  TRISD.F0 = 0; //Makes PORTD0 or RD0 Output Pin
  //Configura el módulo ADC con el pin AN3
  //como voltaje de referencia positiva
  ADCON1=0b11000001;
  //Inicio del LCD
  Lcd_Init();
  //Borrado del cursor
  Lcd_Cmd(_LCD_CURSOR_OFF);
  //Impresión de texto
  Lcd_Out(2, 1, "Cº:");
  Lcd_Out(1, 1, "KPa:");
  while(1) //Bucle infinito
  {
    if(TemI>100||PreI>123)
    {
    PORTD.F0 = 1; //LED ON
    }
    else
    {
    PORTD.F0 = 0; //LED OFF
    }
    //Lectura del canal 1 del ADC
    Radct=ADC_Read(1);
    //Uso de la ecuación
    Tem=0.244*Radct;
    //Se convierte el resultado a un número entero
    TemI=Tem;
    //Se convierte el número entero a una cadena de caracteres
    IntToStr(TemI, Textt);
    //Se imprime el resultado
    Lcd_Out(2, 6, Textt);
    //Retardo de 100m segundos
    delay_ms(100);
    //Reading ADC channel 0.
     Radcp=ADC_Read(0);
     //Using the equation
     Pre=0.10861*Radcp+10,5555;
     //Forces the result to the integer part.
     PreI=Pre;
     //Converts the integer to a string.
     IntToStr(PreI, Textp);
     //prints the result.
     Lcd_Out(1, 6, Textp);
     //Delay 100 m seconds.
     delay_ms(100);
  }
}


Tiene una oscilación de 4MHz y el código está hecho con Mikro C for PIC. El software de simulación es Proteus.

Todo va muy bien en la simulación salvo que la presión no la monitoriza, se queda fija en 121 kPa, he probado de todo y nada, no se que hacer. He sacado el trozo de código que afecta a la presión y simulado en un otro PIC y funciona perfectamente, estoy en un callejón, espero que puedan darme algún consejo o remitirme algún error.

Un saludo y muchas gracias ! :)
 

Adjuntos

  • Diseño del circuito.jpg
    Diseño del circuito.jpg
    111.9 KB · Visitas: 111
Última edición por un moderador:
Todo va muy bien en la simulación, salvo que la presión no la monitoriza, se queda fija en 121 kPa, he probado de todo y nada, no sé que hacer.
He sacado el trozo de código que afecta a la presión y simulado en un otro PIC y funciona perfectamente, estoy en un callejón, espero que puedan darme algún consejo o remitirme algún error.
Si estás usando VRef+ para AN0 y tienes un divisor de tensión con dos resistencias del mismo valor, siendo el voltaje de alimentación de 5V. Entonces tienes 2.5V. como voltaje de referencia para el ADC.
Por lo tanto, estás limitando al conversor a que sólo pueda medir una tensión máxima de 2.5V. en AN0.
¿Ya probaste haciendo lecturas con un voltaje inferior a 2.5V.?
Porque si existe un voltaje superior a 2.5V. en AN0, siempre obtendrás la lectura máxima.
 
Lo primero muchísimas gracias por tu respuesta.

Te he leído atentamente y creo que se por donde vas, efectivamente tengo limitado a 2'5V con el montaje del divisor de tensión, creía que el voltaje de ambos sensores sería pequeño pero el de presión no lo es, adjunto una imagen con sondas.

LLegado a este punto la pregunta es, ¿Que debería de hacer a nivel software o hardware para que funcionase bien? Porque he estado tocando ambas cosas y no me sale nada :rolleyes:

Muchas gracias !
 

Adjuntos

  • circuito.jpg
    circuito.jpg
    113.4 KB · Visitas: 56
Llegado a este punto, la pregunta es; ¿Que debería de hacer a nivel software o hardware para que funcionase bien? Porque he estado tocando ambas cosas y no me sale nada :rolleyes:
Ok. La solución es relativamente sencilla y será por software.
Necesitas cambiar la configuración de ADCON1 y modificar la fórmula para el LM35.
ADCON1 = 0b11000100;
Y para el LM35 usa esta:
Tem = (Radct * 150 / 308);

Con esos cambios ya deben funcionar ambas lecturas.
 
Hice lo que comentaste pero no funcionó, al contrario, empeoró las cosas :eek: jaja.

Ahora la medida de presión que recoge es 115kPa y la temperatura la sigue monotorizando y regulando pero con 1ºC de error.

¿Se te ocurre otra cosa? Quizás modificando algo de hardware sería más simple.

A estas alturas de mirarlo y mirarlo no tengo ni idea de que puede ser, pero estoy seguro de que hay algo por lo que se estorban ambos diseños. Tengo por separado funcionando perfectamente el sensor de presión con un PIC y LCD y exactamente igual para el de temperatura pero es juntarlos y salir mal.

Muchas gracias de nuevo ! :D

Adjunto imagen con nueva situación.
 

Adjuntos

  • circuito.jpg
    circuito.jpg
    115.4 KB · Visitas: 60
Pues seguramente algo hiciste mal.
Mira, aquí te adjunto el proyecto junto con la simulación.
 

Adjuntos

  • 16F877A Sensor de presión.rar
    58.7 KB · Visitas: 208
Muchísimas gracias por tu tiempo.

No me arranca proteus con el .pdsprj que me mandaste, si puedes hacer un pantallazo del circuito mejor que mejor, después de esto si no me va ya a ti te funciona tiro el portátil jaja
 
No me arranca proteus con el .pdsprj que me mandaste.
Debe ser porque está realizado con una versión superior al que tienes.
Cómo quiera, pudiste probar el código con la simulación que tienes tú.
Si puedes hacer un pantallazo del circuito mejor que mejor, después de esto si no me va, y a a ti te funciona, tiro el portátil jaja
Es básicamente lo mismo, pero sin la tensión de referencia. LM35 - MPX4115.jpg
 
Lo acabo de probar de nuevo,

El código que me pasaste no daba resultado en mi diseño. Para asegurarme bien cree un proyecto nuevo y he calcado tu diseño y usado tu código, a parte le he implantado el LED.

Todo perfecto pero con dos fallos, la temperatura a partir de 18ºC sube con un desfase entre el sensor y el LCD de 1ºC y la presión no cambia a partir de 115kPa, se queda fija. A ti te ocurre esto?

Muchísimas gracias por tu ayuda ! =D
 
Muy fino jaja

No me lo imaginé porque sencillamente el MPX4115 de Proteus te permite llegar hasta 125kPa creo que es :LOL:, debería de haber mirado el data sheet del sensor.

Zanjado el tema de la presión. Supongo que en el caso de la temperatura se deberá a que al eliminar la referencia positiva y la salida máxima del sensor es 1'5V se pierde precisión, miraré a ver como puedo ser más preciso sin volver a joder la presión.

EDITADO: Solucionado la temperatura también ! Funciona de lujo ! Gracias de nuevo !

Muchas gracias a los dos por vuestra ayuda !! ;)
 
Última edición:
Atrás
Arriba