martes, 3 de marzo de 2015

Microchip PIC: ADC + UART + XBEE + LEDs + LM35

En este capítulo, vamos a mostrar como configurar el módulo ANALOG-TO-DIGITAL 
CONVERTER (A/D) MODULE de 8-bits, y para ello, hemos escogido al microcontrolador PIC16F77.

La idea de este programa es leer la señal analógica del sensor externo de temperatura LM35DZ y mandar dicho valor por la UART para que se muestre  por pantalla. A parte, desde el propio software se podrá cambiar el estado de un par de LEDs.

De esta manera, completamos el apartado de la UART configurándola en full-duplex ( transmisión y recepción de datos independientes ).


Y bien, como viene siendo habitual, vamos a de unas pinceladas de como funciona el módulo ADC de 8-bits. Para empezar, prestaremos especial atención al documento: Mid-Range Reference Manual, en el apartado:  21. 8-bit A/D Converter, donde viene explicado el funcionamiento de éste módulo.

Los parámetros principales que nos van a interesar son los siguientes:



· Voltaje de Referencia y Seleccionar Pines Analógicos.


Deberemos decirle a nuestro conversor ADC de 8-bits que voltajes va a usar para realizar la lectura de la señal analógica, podemos tener un voltaje de referencia externo y preciso o, escoger distintos valores de referencias internos que te ofrece el propio microcontrolador.

En nuestro caso, el PIC16F77 el voltaje de referencia disponible es a la propia tensión de alimentación VDD del microcontrolador.

Para la configuración de que tipo de voltaje de referencia vamos a usar, está el registro ADCON1, concretamente os bits: PCFG2:PCFG0, según la tabla que Microchip nos pone a nuestra disposición:


PCFG2:PCFG0 AN7  AN6AN5 AN4 AN3AN2 AN1 AN0
000
A
A
A
A
A
A
A
001
A
A
A
VREF
A
A
010
D
D
D
A
A
A
011
D
D
A
A
VREF
A
A
100
D
D
D
D
A
D
A
A
101
D
D
D
VREF
D
A
A
11x
D
D
D
D
D
D
A
Tabla: PCFG2:PCFG0


Donde:

· A ≡ Pin Analógico.
· D ≡ Pin Digital.


¿Qué quiere decir esta tabla? Pues es sencillo, desde aquí, seleccionaremos el pin o los pines de nuestro microcontrolador que queremos que sean entradas analógicas y que tipo de voltaje de referencia ( interno o externo ).

Por ejemplo, si queremos que el pin AN0 sea señal analógica y el voltaje de referencia interno, la configuración podrá ser una de las siguientes:


· PCFG2:PCFG0 = 000
· PCFG2:PCFG0 = 010
· PCFG2:PCFG0 = 100


Y si queremos que el pin AN7 sea señal analógica y el voltaje de referencia externo, la configuración será la siguiente:


· PCFG2:PCFG0 = 001


Según la tabla anterior, en caso de quererse configurar un voltaje de referencia externo, éste deberá estar conectado al pin AN3 del microcontrolador. Y otra cosa muy importante que deberemos prestar atención y nos salvará de más de un sofoco.

En aquellos microcontroladores de la familia PIC16F MID-RANGE, que tenga el módulo ADC de 8-bits, por defecto, los bits PCFG2:PCFG0 del registro ADCON1 están a cero, es decir:

· PCFG2:PCFG0 = 000

Por lo que todos los pines, desde AN0 hasta AN7 estarán configurados como entradas analógicas. ¿Por qué es esto importante? Bueno como ya sabemos, los microcontroladores generalmente comparten funciones en sus pines, así que si queremos emplear uno de esos pines como salida o entrada digital y que esté compartido con el módulo ADC8, primero deberemos configurar los bits · PCFG2:PCFG0 de manera que dichos pines sean digitales.

En caso contrario, no funcionarán.



· Reloj del módulo ADC 8-Bits.

Otro aspecto importante, ¿a qué frecuencia funcionará el módulo ADC8? Este dato es de vital importancia, ya que podremos saber cuanto tiempo se tardará en obtener un dato.

El reloj del ADC8 podrá asociarse al reloj interno principal o al propio reloj interno que el microcontrolador PIC tiene para éste módulo. Para seleccionar la fuente de reloj, están los bits · ADCS1:ADCS0 del registro ADCON0.

Nos centraremos en el reloj propio del ADC8: fADC0 = FRC.

El tiempo de conversión con el oscilador propio del módulo ADC8 va desde 2 - 6 μs, siendo el tiempo típico de 4 μs ( para más información, echar un vistazo al datasheet de vuestro microcontrolador ).



· Interpretar Dato Leído Por Pin Analógico.

La expresión matemática que usaremos para interpretar los datos recogidos por el módulo ADC 8-bits, será la siguiente:

VADC = VREF·( ADCDATA/( 28 - 1 ) )


Donde:


· VADC ≡  Voltaje resultante del módulo ADC8
· VREF ≡ Voltaje de referencia
· ADCDATA ≡ Dato leído por el módulo ADC8


Vamos a poner un ejemplo, se lee un dato analógico por el pin AN0, donde el voltaje de referencia esta configurada de manera interna a VDD y a 4.5 V, y el dato leído es 110.

Vamos a obtener el voltaje resultante empleando la expresión anterior:


· VADC = VREF·( ADCDATA/( 28 - 1 ) ) = 4.5·( 110/( 28 - 1 ) ) ≈ 1.94 V


Por lo tanto, la señal analógica leída es de, aproximadamente 1.94 V.


Y antes de empezar código ejemplo de este capítulo, una cosa más que deberemos prestar atención, y es el siguiente, nuestro valor analógico obtenido por cualquiera de las entradas disponibles para tal fin, nunca serán mayores al valor del voltaje de referencia, es decir, seguimos con el ejemplo anterior, si esta vez el dato leído es de 255, el voltaje resultante será el siguiente:


· VADC = VREF·( ADCDATA/( 28 - 1 ) ) = 4.5·( 255/( 28 - 1 ) ) = 4.5 V


¡Exacto! El voltaje resultante será el fondo de escala, en nuestro caso 4.5 V. Si superamos este voltaje, no podremos leerlo ya que el tope, repito, es el voltaje de referencia ( ¡cuidado con la tensión máxima admisible que se le puede aplicar a un pin!, comprobarlo en el datasheet del microcontrolador ).



Y ya sin más dilación, vamos a presentar nuestro programa, éste consistirá en leer por el pin RA0/AN0 la señal analógica del dispositivo LM35DZ y enviar el dato leído por la UART para que se muestre por pantalla.

Aparte, en dicho software podremos cambiar el estado de dos LEDs dependiendo del valor enviado por la UART, y para hacerlo más vistoso, lo vamos a hacer de forma inalámbrica, con un par de módulos XBee.

Así que en nuestro ordenador tendremos un módulo XBee ( será el Coordinador ) y en nuestro protoboard tendremos al PIC16F77 con sus LEDs, el dispositivo de temperatura analógico LM35DZ y otro módulo XBee ( será End Device ).


El material que vamos a necesitar y su función, es la que se muestra a continuación:

· PIC16F77: Microcontrolador para este programa.

· Protoboard: Donde insertaremos nuestros componentes.

· PICKIT 3: Programador y depurador necesario para programar el código.

· Módulos XBee: Un par de ellos, en este caso, el módulo XBee es el modelo: XB24-ZB.

· Interfaz Gráfica: Software que se ejecuta en un ordenador con sistema operativo Windows con al menos, la versión .NET Framework 4.0. Dicha interfaz gráfica se puede descargar más adelante junto al Firmware.

· Resistor 220 Ω: Un par de resistores que irá en serie al LED y conectado al pin RB4 y RB5 para limitar la corriente.

· Resistor 4.7 kΩ: Un resistor que irá conectado entre los pins #MCLR y VDD.

· LEDs: Un par de ellos, en nuestro caso uno rojo y el otro verde.

· LM35DZ: Sensor analógico de temperatura externo LM35.



El firmware es el que se muestra a continuación:

/**
* @file      main.c
* @author    Manuel Caballero
* @date      28/2/2015
* @brief     Archivo principal.
* \copyright
*     AqueronteBlog@gmail.com
*
* Este archivo es propiedad intelectual del blog Aqueronte,
* cuya direccion web, es la siguiente:
*
*   http://unbarquero.blogspot.com/
*
* Se permite cualquier modificacion del archivo siempre y cuando
* se mantenga la autoria del autor.
*/
#include < xc.h >
#include < stdint.h >
#include "variables.h"
#include "functions.h"
#include "interrupts.h"

/**
 *  \brief     void main( void )
 *  \details   Este programa consiste en mostrar como funciona el módulo ADC.
 *
 *             En este caso, vamos a trabajar con el módulo ADC de 8-bits. El
 *             programa consistirá en leer una señal analógica por el pin RA0/AN0
 *             donde obtendrá la señal procedente del sensor de temperatura analógico
 *             LM35 versión DZ.
 * 
 *             Una vez obtenida la lectura del sensor LM35DZ, se mandará por la
 *             UART dicho valor, donde se mostrará por pantalla la temperatura
 *             actual.
 * 
 *             Desde el software, aparte de mostrarse la temperatura procedente
 *             del sensor LM35DZ, se podrán cambiar el estado de los LEDs, un
 *             LED rojo ( pin RB5 con un resistor en serie de 220 Ohms ) y otro
 *             LED verde ( pin RB4 con un resistor en serie de 220 Ohms ).
 * 
 *             En la transmisión y recepción de datos por el módulo UART, se van
 *             a usar un par de transceptores XBee modelo XBee XB24-ZB
 *             ( uno Coordinator y el otro End Device ).
 *
 *             Se usará el módulo Timer1, 16-bits, para gestionar tanto la
 *             lectura de temperatura procedentes del sensor LM35DZ como
 *             el envío de datos por la UART.
 *
 *             El tiempo total empleado por cada ciclo:
 *
 *              · Petición de Lectura de Temperatura + Envío datos por UART
 *
 *             es de aproximadamente 4s.
 *
 *  \author    Manuel Caballero
 *  \version   0.0
 *  \date      28/2/2015
 *  \pre       Este firmware está probado para el PIC16F77.
 *  \pre       El LED rojo estará conectado al pin RB5
 *             ( un resistor de 220 Ohms en serie ).
 *  \pre       El LED verde estará conectado al pin RB4
 *             ( un resistor de 220 Ohms en serie ).
 *
 *  \pre       MPLAB X IDE v2.30.
 *  \pre       Compiler XC8 v1.33.
 */
void main( void ) {

   conf_IO     ();     // Configura Pins
   conf_UART   ();     // Configura UART
   conf_ADC8   ();     // Configura ADC8
   conf_TA1    ();     // Configura Timer1

        
   INTCONbits.PEIE    =   1;     // Peripheral Interrupt Enable
   ei  ();                       // enable interrupts
    
   while ( 1 );        // Todo se realiza en las interrupciones
}

Como vemos, el ejemplo es bastante simple, se recomienda bajar los archivos disponibles más abajo para indagar entre sus librerías y leer sus funciones de manera más detallada.

Un vídeo que demuestra lo explicado anteriormente se presenta a continuación:



Os pongo a vuestra disposición el programa en lenguaje C (XC8 y CCS) para que lo podáis descargar y probar:

Microchip PIC: PIC16F77 + LEDs + UART + XBee + LM35
Compilador XC8Compilador CCS
CC
PIC16F77: LM35 + XBee 
PIC16F77: LM35 + XBee
PIC16F77: LM35 + XBee
PIC16F77: LM35 + XBee

· NOTA 1Lo comentarios están en formato doxygen. Aunque no se entrega dicha documentación ya que el MPLAB X no tiene ningún pulgin capaz de trabajar con dicho formato.

2 comentarios:

Bard Animatronix dijo...

Amigo esta genial tu proyecto, actualmente utilizo XC8 muy bueno de verdad; queria pedirte tu ayuda.
Estoy realizando un simple programa por pwm y usart, lo que quiero es ir sumandole unidades al pwm, osea desde el terminal enviar un uno y este uno sumarcelo a la frecuencia del pwm, Tengo ReadUSART(); y lo agrego a CCPR2L pero no sucede nada, espero que me puedas ayudar muchas gracias...

Mi correo: poncho.blas@hotmail.com

AqueronteBlog dijo...

Buenas Bard:

Te recomiendo que te mires la siguiente entrada que escribimos acerca del PWM:

· http://unbarquero.blogspot.com.es/2015/03/microchip-pic-pwm-adc-motor-pic12f683.html


Un saludo.