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); } }
No hay comentarios:
Publicar un comentario