jueves, 11 de agosto de 2022

ACONDISIONAMIENTO DE SENSORES **DISEÑO DEL ALGORITMO DE LECTURA ADC LM35 CON MICROCONTROLADOR PIC16F1827**

 


En este articulo voy a explicar como tratar un sensor de temperatur LM35 usando el ADC de un microcontrolador PIC16F1827 y presentar su valor de temperatura en un display LCD 2X16 con la mayor resolucion posible.

EL PIC16F1827 gama media mejorada.


Este es el microcontrolador que vengo usando para todos mis proyectos asi como sus hermanos los PIC12F1822 y PIC18F1936.

A continuacion el resumen tecnico del ADC en general que vamos a trabajar.

El ADC (Convertidor Análogo a Digital)

Parámetros principales:

Voltaje de Referencia (Vref): Voltaje externo o interno máximo y mínimo de lectura (define el rango).

Resolución en voltios por bit (Res): Según el Numero de bits usado para la conversión:

8bits=255,10bits=1023,16=65535. 

Valor de lectura del ADC (x): Es el resultado de la conversión del ADC.

Voltaje de entrada (Vin): voltaje que se aplica al ADC para su lectura.


Calculos de resolucion y de valor de temperatura.

La resolución del ADC la podemos definir teniendo en cuenta los voltajes de referencia según la siguiente formula:

Donde n es el número de bits del ADC.

En este video explico de manera mas clara como calcular la resolucion del ADC y aplicarla para optener un voltaje de entrada.



La fórmula de conversión para obtener el voltaje a la entrada de un ADC es la siguiente:
Esta formula hay que tenerla expresada y no calculada con el fin de convertirla a un algoritmo C para microcontrolador PIC (En este caso) y hacerlo de la manera mas compacta y eficiente posible.

Veamos a continuacion una animacion de la simulacion en proteus del circuito minimo necesario:

En la animacion es facil observar que vamos a usar un diodo para la referencia esto nos permitira optener un rango de temperatura de 0 a unos 50ºC como maximo o un poco mas sin problemas.

A continuacion el algoritmo usado:
#include <16F1827.h>
#device adc=10

#FUSES INTRC_IO, PUT, BROWNOUT, NOMCLR, NOLVP, PROTECT, CPD, PLL_SW, NOWDT
#use delay(internal=32MHz)

#define LCD_ENABLE_PIN  PIN_A7
#define LCD_RS_PIN      PIN_A2                                   
#define LCD_RW_PIN      PIN_A1                                   
#define LCD_DATA4       PIN_B7                                   
#define LCD_DATA5       PIN_B6                                   
#define LCD_DATA6       PIN_B5                                   
#define LCD_DATA7       PIN_B4  

#include <lcd.c>

//************************************************************************
float readtemp(){
float result;
int16 temp=0;
int8 j;
        for(j=0;j<50;j++){
        delay_ms (1);
        temp+=read_adc ();   
        }  
        result=temp;
        result*=7;                
        result/=5820;
        return result;   
}

//************************************************************************
void main()
{        
float temp;
     setup_adc_ports(sAN0 | VSS_VREF);
     setup_adc(ADC_CLOCK_INTERNAL);    
     set_adc_channel(0);
     
     lcd_init();
   
     while(1){
     lcd_gotoxy(1,1);
     temp=readtemp();
     lcd_gotoxy(1,1);
     printf(lcd_putc , "LM35: %2.1f oC     ", temp);      
     }   
      
     }


¿Como funciona todo?
A continuacion el ultimo video editado sobre el tema