lunes, 26 de diciembre de 2011

SPI Sensor de temperatura TC77



En el LCD alfanumérico 16x2 vamos a mostrar la temperatura que capta el sensor TC77. Este integrado irá comunicado al PIC mediante el bus serie SPI.

Características:

TC77:
Este integrado esta compuesto por un diodo interno que actúa como sensor, un conversor analógico digital Delta-Sigma de 13 bits, tres registros digitales y el bus SPI de comunicación. Los datos de medición de la temperatura se almacenan en el registro de  temperatura, mientras que el registro de configuración se utiliza para seleccionar el modo de funcionamiento del sensor. El Manufacture ID Register (ID) se utiliza para registrar e identificar el sensor como un componente de Microchip.
Utiliza palabras de 13 bits en complemento a dos. Su consumo en operación es de 250 uA con la posibilidad de activar el modo de bajo consumo (Shutdown mode) y reducirse en tan solo 0.1 uA.


Utilizaremos la librería personal para controlar el LCD alfanumérico.


Diseño del esquemático:

- El microcontrolador utilizado será el PIC18F4550, con un reloj externo de 20Mz y un pulsador con circuito R-C a modo de reset:


- Conectaremos el sensor TC77 con el bus SPI del PIC, pondremos una resistencia de 1k entre los pines SDI y SDO del bus SPI.


- Mostraremos el valor de la temperatura en un LCD alfanumérico 16x2, tendrá un potenciómetro para modificar el contraste, y un condensador de desacoplo.


- Utilizaremos el depurador SPI para depurar el programa.



Código:

////////////////////////////////////////////////////////////////////////////////////
//   AUTOR: Daniel de Cos                                       Noviembre/2011    //
////////////////////////////////////////////////////////////////////////////////////
//   PROGRAMA:    Sensor Temperatura                              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:  interface_2011             DEBUGGER:   ICD3
////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////
//               LEER LA Tº DEL SENSOR TC77 EN EL LCD ALFANUMERICO                                                 //
////////////////////////////////////////////////////////////////////////////////////
/*
El sensor consta de tres registros (CONFIGURACIÓN-TEMPERATURA-FABRICANTE)
Puede trabajar en dos modos:
.-SHUTDOWN (0xFFH)
.-CONTINUO (0x00H)
Para configurar los modos hace falta leer 16bit(en dos veces) y luego escribir otros 16
EJEMPLO:
   1. CS goes low to initiate the communication cycle.
   2. Read 16 bits of temperature data from the
   Temperature register.
   3. Write 16 bits of data (i.e. XXFF hex) to the Configuration
   register to enter Shutdown mode.
   4. Read the 16 bits from the Manufacturer's ID register
   (C15:C8 = 54 hex) to verify that the sensor
   is a Microchip device.
   5. Write 8 to 16 bits of data (00 or 0000 hex) to
   enter Continuous Conversion Mode.
   6. Return CS high to terminate the communication
   cycle.
------------------------------------------------------------------------------------
El registro da la temperatura en complemento a 2 y trabaja de la siguiente forma:
bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8 bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
T15   T14   T13   T12   T11   T10   T9   T8   T7   T6   T5   T4   T3   T2   T1   T0
2^8   2^7   2^6   2^5   2^4   2^3   2^2  2^1  2^0  2^-1 2^-2 2^-3 2^-4 *    X    X
EJEMPLO:
   Temperature = 85.125°C
   Temperature Register = 00101010 10010111b
   = 2^6 + 2^4 + 2^2 + 2^0 + 2^-3
   = 64 + 16 + 4 + 1 + 0.125
   = 85.125°C
*/
////////////////////////////////////////////////////////////////////////////////////
// He cambiado los pines CS1 Y CS2 del LCD grafico para poder utilizar el bus SPI //                                                                                                                                                                                                                          //
////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////
// CABECERA ////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

#include <C:\H\18F4550.h>
#FUSES HS                           //External clock
#FUSES MCLR                     //Master Clear pin enabled
#use fast_io(c)
#use fast_io(b)
#use delay(clock=20000000)
#define CS PIN_A0
//#fuses INTHS                                  //Selecciona el oscilador interno
//#use delay(internal=1Mhz)              // Selecciona la velocidad del oscilador interno
#include <LCD_flexible.c>

////////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

int Templ=0;
int Temph=0;
signed int16 Temp16Bits=0;             //Variable donde se introduce el codigo binario de la temperatura, trabajamos en complemento a 2
float decimales=0;                                         //parte decimal
float enteros=0;                                             //parte enetra
int1 banderanegativo=0;                                //esta variable es para saber si el numero es posotivo o negativo
float Temperatura;                                         //Variable donde se introduce la temperatura en decimal

////////////////////////////////////////////////////////////////////////////////////
// FUNCIONES ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////
// PRINCIPAL ///////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
void main()
{
            set_tris_b(0b00000001);
            set_tris_c(0X00);                                                                                                                                         //configuramos los pines de entrada o salida de los puertos b y c
            setup_spi(spi_master | spi_l_to_h | spi_ss_disabled);           //configuración SPI
           
            //configuracion del sensor en modo continuo
            /*
            output_low(CS);
            spi_read(0);//leemos byte alto
            spi_read(0);//leemos byte bajo
            spi_write(0x00);
            spi_write(0xFF);
            spi_read(0);//leemos byte alto
            spi_read(0);//leemos byte bajo
            spi_write(0x00);
            spi_write(0x00);
            output_high(CS);
            */

            lcd_init();
           
            while(1){
                        output_low(CS);                                                                                                                              //habilito el sensor de temperatura que trabaja en bajo activo
                        Temph=spi_read(0);                                                                                                             //obtenemos el Temp alto del registro de temperatura
                        Templ= spi_read(0);                                                                                                             //obtenemos el Temp bajo del registro de temperatura
                        output_high(CS);                                                                                                                             //deshabilito el sensor de temperatura que trabaja en bajo activo
                        Temp16Bits= make16(Temph,Templ);                                                                                //convertimos en un registro de 16bits
                        banderanegativo= 0;
                        if(Temp16Bits< 0){
                                   banderanegativo= 1;
                                   Temp16Bits=~Temp16Bits+8;                                                                                            //si es negativo lo complementamos a 2 y le sumamos 8
                        }
                        Temp16Bits= Temp16Bits>>3;                                                                                           //descartamos los 3 bits menos significativos
                        decimales= (float)(Temp16Bits&0b0000000000001111)*0.0625; //damos formato a los decimales
                        enteros=(float)(Temp16Bits>>4);                                                                            //damos formato a los enteros, solo descartamos los ultimos 4 bits
                        if(banderanegativo)                                                                                                                          //sumamos la parte decimal y la parte entera de la temperatura y la damos signo
                                   Temperatura= -1*(enteros+decimales);
                        else
                                   Temperatura=(enteros+decimales);
                       
                        //Mostrar los valores en el LCD alfanumérico:
                        lcd_gotoxy(1,1);
                        printf(lcd_putc,"Temp= %3.4fC   \n",Temperatura);
                        delay_ms(100);
            }
}


Simulación:



Comprobación programa:

No hay comentarios:

Publicar un comentario