viernes, 23 de noviembre de 2012

Ejemplos MMB. Lectura de temperatura.

Como comenté ya hace algún tiempo, en las navidades pasadas me compré la placa MMB for PIC32 de Mikroe. Esta placa monta un PIC32MX460f512 que funciona a 80MHz. La placa lleva un buen puñado de periféricos como son memoria FLASH y EEPROM, acelerometro de 3 ejes, sensor de temperatura analógico… así que he decidido crear un mini sección en el blog dedicada a esta placa. En esa sección iré  colgando diferentes ejemplos en los que se utilicen los distintos periféricos que trae la placa. En una entrada anterior ya os presenté la librería LCDTerminal.h, la cual nos permitía utilizar la pantalla TFT que trae la placa de una forma muy sencilla como si de un terminal se tratase, cosa que nos vendrá muy bien para visualizar diferentes datos.
En la primera de esta serie de entradas, he diseñado un programa que, como no podía ser de otra manera para ser el primero, hace una lectura del sensor de temperatura de la placa y lo muestra por pantalla. La programación que he utilizado es una “especie” de programación orientada a objetos por dos razones, la primera es que el código es más entendible, y la segunda es que muchas de las funciones que utilicemos las podremos luego meter en una librería y reutilizarlas. Cabe decir que con la placa ya viene una librería con funciones para todos los periféricos, pero en mi caso, he preferido crearme yo una librería propia. Así pues, empecemos.
El sensor de temperatura que leva la placa es un MCP9700A, el cual nos da una tensión de 10mV/ºC, con un offset de 0,5 voltios, lo que hace que podamos medir también temperaturas negativas. Para leer esta tensión necesitamos utilizar el módulo ADC del PIC32, por lo que será lo primero que configuremos. Para ello creamos la función initADC().
void initADC( int amask)
{
   AD1PCFG = amask;    // selección de pines analógicos
   AD1CON1 = 0x00E0; // conversión automática despues del muestreo
   AD1CON2 = 0;     // utilizamos MUXA, vdd y vss como referencias
   AD1CON3 = 0x1F3F;  // Tsamp = 32 x Tad;
   AD1CON1bits.ADON = 1;  // ponemos en marcha el ADC

} //initADC
A esta función le debemos pasar la mascara en la que configuramos los pines como analógicos o digitales. La siguiente función que vamos a crear es la que nos va a devolver el valor leído del ADC.
int readADC( int ch)
{
   AD1CHSbits.CH0SA = ch; // 1. select input channel
   AD1CON1bits.SAMP = 1; // 2. start sampling
   while (!AD1CON1bits.DONE); // 3. wait conversion complete
   return ADC1BUF0; // 4. read conversion result
} // readADC
A esta función le debemos pasar el canal analógico que queremos leer, y esta nos devuelve un entero entre 0 y 1024. Una vez tenemos este valor digital, debemos calcular a partir de el la temperatura, la cual almacenaremos en una variable float. Esto lo haremos mediante la función siguiente.
float readTemp(){
 
   float temp;
   temp = readADC(8);
   temp = temp * 330 / 1024;
   temp = temp - 50;
   return temp;

}
Una vez definidas las funciones auxiliares nos queda tan solo escribir el código del main(), en la que llamaremos a las funciones auxiliares. El código es el siguiente.
void main( void)
{
   float temp;
   char s[5];

// INICIALIZAMOS LA PLACA Y EL LCD
   MMBInit();          
   LCDInit();
   BacklightOn();

// SELECCIONAMOS UN COLOR PARA LAS LETRAS
   SetColor( LIGHTBLUE);     

// CONFIGURAMOS EL MÓDULO ADC
   initADC(0xFEFF); 

// MENSAJE
   LCDPutString( "Termometro LCD\nMIPS AND CHIPS\nP. Trujillo");
   LCDSetXY(0,5);

   while( 1){
  
      LCDPutString( "Temperatura:\t");
      temp = readTemp();  
      sprintf( s, "%.2f degC\n", temp);
      LCDPutString( s); 
      delay();
      LCDSetXY(0,5);

 }   
} 
Al código main se han añadido otras funciones para la configuración de la placa, además de todo el código de la visualización. En próximas entradas os podré el código para empezar a almacenar datos en la EEPROM y en la FLASH.

No hay comentarios:

Publicar un comentario