TI LaunchPad. Relojes y consumo.

Hace un par de años más o menos Texas Instruments sacó la LaunchPad, una placa de muy bajo coste para empezar con sus microcontroladores de 16 bits diseñados para aplicaciones de bajo consumo, ya hicimos una entrada en el blog sobre esta placa.

Por aquel entonces con el kit nos daban un par de microcontroladores un poco limitados, estos han sido sustituidos por otros más atractivos, que podemos seguir usando con el entorno de desarrollo gratuito (limitado en el tamaño del programa a 16 kB) de la placa sin que nos afecte su restricción. Si buscamos una familia de microcontroladores y herramientas de desarrollo para circuitos de bajo consumo, como pueden ser todas las redes de sensores (IOT y similares) de las que tanto se hablan últimamente,  la LaunchPad probablemente sea la opción más interesate, por menos de 5 euros tenemos todo lo necesario para empezar con este microcontrolador.


Los microcontroladores que vienen con la última versión del kit de la LaunchPad son el MSP430G2553 y el MSP430G2452, microcontroladores de 20 pines, 16kB de Flash y 512 B de RAM el mayor, ADC, USCI, timers de 16 bit, etc.. que mejoran los que nos daban anteriormente con el kit.

Enlazo lo necesario para dar los primeros pasos con la placa:

La placa la podemos comprar directamente a TI, o en los principales distribuidores de electrónica como Farnell, si compramos en estos hay que preguntar si el stock que tienen se corresponde con la última versión (1.5 creo que es) ya que puede ser una anterior con los microcontroladores anteriores más pequeños. Creo recordar que compré una a Farnell o Mouser hace unos meses y era la versión antigua del kit, por lo que al final lo que he hecho es comprar directamente el MSP430G2553 (sobre los 2-2.5 euros). Otra opción es estar atento a esta página, donde TI suele ofrecerlas a mitad de precio y con gastos de envio gratuitos. Para pedirlas en un distribuidor hay que aprovechar a pedirlas con otras cosas, ya que tienen pedido mínimo y gastos de envio, a no ser que vayamos a pedir un montón de LaunchPads..

Mi idea con este microcontrolador es empezar a desarrollar circuitos de bajo consumo alimentados por baterías para diversas aplicaciones, como redes de sensores, o eso que ahora se oye tanto: “internet de las cosas“. Por lo que por el precio del kit es la primera familia en la que pensar, además son los microcontroladores recomendando para este tipo de aplicaciones.

Si miramos la página del microcontrolador y sus características nos lo venden como “ultra-low-power microcontroller” , buscamos estas características:

  • Ultra-Low Power Consumption
    • Active Mode: 230 µA at 1 MHz, 2.2 V
    • Standby Mode: 0.5 µA
    • Off Mode (RAM Retention): 0.1 µA
  • Five Power-Saving Modes
  • Ultra-Fast Wake-Up From Standby Mode in Less Than 1 µs
  • Internal Frequencies up to 16 MHz With Four Calibrated Frequency
  • Internal Very-Low-Power Low-Frequency (LF) Oscillator
  • 32-kHz Crystal
  • External Digital Clock Source

El consumo del microcontrolador depende de la tensión de alimentación, de la temperatura, del código, de los módulos activos, de la frecuencia y señales de reloj que utilicemos, etc..

Y con el módulo del reloj de este microcontrolador me he entretenido esta calurosa noche de sábado (no hay nada mejor que hacer =P), siguiendo los ejemplos de la guía de iniciación con la que ha sido muy fácil comenzar. Dejo aquí las pruebas.

La señal de reloj del microcontrolador es una señal cuadrada que dispara y sincroniza el hardware de los distintos módulos del microcontrolador, el microcontrolador necesita esta señal para ejecutar las instrucciones del programa. Dentro del microcontrolador hay varias señales de reloj para la CPU y los distintos periféricos, y varias fuentes de reloj que crean esas señales. El consumo del microcontrolador depende de los relojes y fuentes de reloj que utilice.

Mirando la guía de iniciación encontramos el siguiente esquema del sistema del reloj del microcontrolador:

En él podemos ver que el microcontrolador tiene tres señales de reloj para la CPU y periféricos: ACLK, MCLK y SMCLK y como estas señales de reloj pueden ser producidas por distintas fuentes: VLO, DCO y un cristal o señal de reloj externo (algunos periféricos pueden tener también sus propios pines de reloj externos). ACLK la podemos obtener de VLO o del cristal externo, MCLK la podemos obtener desde cualquiera de las fuentes y SMCLK de DCO.

Podría haber una fuente de reloj y señal de reloj para todo el microcontrolador, pero este sistema de reloj está pensando para optimizar el rendimiento y las necesidades de consumo del microcontrolador, proporcionando una fuente reloj de baja frecuencia y bajo consumo para que el microcontrolador pueda llevar una cuenta del tiempo (cristal, VLO), y un reloj de alta frecuencia, de inicio rápido y alto consumo para ejecutar el código lo más rápido posible (DCO). Los relojes que no vayamos a usar se apagan para que no consuman.

VLO es un oscilador RC interno de baja frecuencia y consumo del microcontrolador, su frecuencia está comprendida entra 4 y 20 KHz, por lo general será de 12 KHz, siendo función de la alimentación y temperatura. Desde este oscilador vamos a poder crear la señal de reloj ACLK que va a los periféricos, y MCLK que va a la CPU del microcontrolador. Para hacer la prueba del consumo del microcontrolador usando VLO seguimos el código de la guía de iniciación (aún no estoy familiarizado con el micro/compilador por lo que puede haber algún error).

//VCO, se activan las resistencias de pull-up
//al pulsar S2.
 
#include  "msp430g2553.h"
 
#ifndef TIMER0_A1_VECTOR
#define TIMER0_A1_VECTOR    TIMERA1_VECTOR
#define TIMER0_A0_VECTOR    TIMERA0_VECTOR
#endif
 
void main(void)
{
	WDTCTL = WDTPW + WDTHOLD;		// watchdog timer setup
 
	P1DIR = 0x41;					// I/O setup
	P1OUT = 0;
	P2SEL = ~(BIT6 + BIT7); 		// P2.6 and 7 GPIO
 
	BCSCTL3 |= LFXT1S_2;			// clock system setup
	IFG1 &= ~OFIFG;
	_bis_SR_register(SCG1 + SCG0);
	BCSCTL2 |= SELM_3;
 
	while(1)
	{
	  P1OUT = 0x40; 			    // LED on
	  _delay_cycles(50);
	  P1OUT = 0x00; 			    // LED off
	  _delay_cycles(50);
 
	  if((P1IN & 0x08) == 0)
	  {
		  P1OUT |= 0x01; 			//Led Rojo
		  P1REN = 0xB6; 			//Resistencias Pullup
		  P2REN = 0xFF;
	  }
	}
 
}

El código comienza desactivando el watchdog, configura los pines de entrada y salida y desactiva los pines del cristal externo para que sean usados como entrada o salida y no consuman corriente (ya que no se va a usar el cristal externo). Se selecciona VLO para generar la señal de ACLK (periféricos) y MCLK (reloj de la CPU) y se desactiva SMCLK y DCO que no se van a usar. Una vez hecho esto el microcontrolador genera una señal cuadrada en un pin donde se puede observar la frecuencia a la que oscila VLO.

Los pines de entrada del microcontrolador que se dejan al aire no tienen un estado definido y están provocando que los transistores internos del puerto de entrada puedan tener un consumo alto de corriente, para evitar esto los pines que no se usen se configuran como salida, o se configuran como entrada y se activa una de las resistencias internas de cada pin de pull-up o pull-down, llevando la entrada y los transistores a un estado definido minimizando el consumo.

En la primera parte del vídeo se conecta un polímetro en serie con el pin de alimentación del microcontrolador para medir el consumo de éste, usando VLO para generar el reloj de la CPU, los pines que no se usan están configurados como entrada y al aire, cuando se pulsa el botón los pines se ponen a tierra mediante la resistencia de pull-down interna de cada pin, apreciando una enorme bajada de consumo del microcontrolador.

En la segunda parte se conecta el osciloscopio al pin donde el microcontrolador está generando la señal cuadrada, se puede ver que la frecuencia de VLO está sobre los 11 kHz. Con un secador de pelo se calienta el microcontrolador viendo como la señal y por tanto la frecuencia de VLO es muy sensible a la temperatura.

El oscilador interno VLO nos proporciona un oscilador de baja precisión, frecuencia y muy bajo consumo pero poco estable ante los cambios de temperatura, nos evita poner un cristal externo en las aplicaciones que no necesitemos una alta estabilidad/precisión en la medida del tiempo.

Cristal externo: con el kit nos viene un cristal externo de 32768 Hz (frecuencia con la que podemos contar el tiempo en unidades de segundo exactas) que debemos soldar a la placa si queremos utilizarlo, para ello lo abrimos y lo soldamos en el lugar correspondiente, las patas ya vienen dobladas en un sentido, con cuidado hacemos las tres soldaduras que se ven en la imagen.

Este cristal lo podemos usar en lugar de VLO para generar las señales de reloj de MCLK y ACLK, tenemos que elegir uno de los dos, la ventaja del cristal externo respecto al oscilador RC interno es que el cristal es mucho más preciso y estable, es decir la frecuencia de oscialción será la indicada en sus características (32768 Hz) y ésta tendrá una variación despreciable con el tiempo y los cambios de temperatura.

La desventaja de usar un cristal externo es que tenemos que añadir un componente más, el microcontrolador lleva condensadores internos configurables (podemos seleccionar entre varias capacidades) para cristales de baja frecuencia en los pines del cristal, por lo que nos evita tener que añadir los dos condensadores externos necesarios para generar la señal de reloj con el cristal. Notita sobre cristales. La otra desventaja importante es que un cristal desde que se enciende requiere un tiempo para empezar a oscilar a la frecuencia indicada, por lo que si tenemos que esperar a que la frecuencia de oscilación se estabilice para usarla en nuestro programa puede ser un retardo importante en un sistema de bajo consumo. Aunque en este caso el uso de este cristal es tenerlo oscilando siempre para llevar una cuenta del tiempo.

Resumiendo: cuando nuestra apliación requiera una cuenta del tiempo precisa y estable tendrémos que añadir un cristal externo, en los demás casos se usará el oscilador interno, reduciendo el consumo del microcontrolador.

//XTAL
 
#include  "msp430g2553.h"
 
#ifndef TIMER0_A1_VECTOR
#define TIMER0_A1_VECTOR    TIMERA1_VECTOR
#define TIMER0_A0_VECTOR    TIMERA0_VECTOR
#endif
 
void main(void)
{
	WDTCTL = WDTPW + WDTHOLD;		// watchdog timer setup
 
	P1DIR = 0x41;					// I/O setup
	P1OUT = 0x01;
 
	BCSCTL3 |= LFXT1S_0 + XCAP_3;	// clock system setup
 
	while(IFG1 & OFIFG)				// wait for OSCFault to clear
	{
	  IFG1 &= ~OFIFG;
	  _delay_cycles(100000);
	}
 
	P1OUT = 0;						// both LEDs off
 
	_bis_SR_register(SCG1 + SCG0);	// clock system setup
	BCSCTL2 |= SELM_3;
 
	while(1)
	{
	  P1OUT = 0x40; 			    // LED on
	  _delay_cycles(50);
	  P1OUT = 0; 			    	// LED off
	  _delay_cycles(50);
 
	  if((P1IN & 0x08) == 0)
	  {
		  P1OUT |= 0x01; 			//Led Rojo
		  P1REN = 0xB6; 			//Resistencias Pullup
		  P2REN = 0x3F;
	  }
	}
}

Para ver el consumo del microcontrolador usando el cristal externo para generar MCLK en lugar de VLO se realiza la misma prueba que antes, primero se mide la corriente que consume el microcontrolador con el polímetro, al igual que antes se mide el consumo con los pines que no se usan configurados como entrada y al aire, cuando se pulsa el botón se añade una resistencia de pull-down a los pines que no utilizamos reduciendo el consumo del microcontrolador.

En la segunda parte se conecta el microcontrolador al osciloscopio para observar la señal que genera, viendo la frecuencia de oscilación del cristal. Se calienta el microcontrolador con un secador de pelo viendo como la señal y por tanto la frecuencia de la señal de reloj permanece estable.

DCO es un oscialdor interno de alta frecuencia que podemos usar para generar la señal de reloj MCLK (CPU) y SMCLK (periféricos), viene calibrado de fábrica con 4 frecuencias: 1, 8, 12 y 16 MHz. Una de sus principales características es que tiene un tiempo de encendido muy bajo, según indican en menos de 1 us tendrémos una señal de reloj estable con la frecuencia deseada, aspecto importante en las aplicaciones de bajo consumo donde se utiliza este cristal en ciertos intervalos de tiempo y estos han de ser los más breves posibles.

//DCO + XTAL
 
#include  "msp430g2553.h"
 
#ifndef TIMER0_A1_VECTOR
#define TIMER0_A1_VECTOR    TIMERA1_VECTOR
#define TIMER0_A0_VECTOR    TIMERA0_VECTOR
#endif
 
void main(void)
{
	WDTCTL = WDTPW + WDTHOLD;		// watchdog timer setup
 
 
	if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
	{
	  while(1);            			// If cal constants erased, trap CPU!!
	}
 
	BCSCTL1 = CALBC1_1MHZ; 			// Set range
	DCOCTL = CALDCO_1MHZ;  			// Set DCO step + modulation
 
 
	P1DIR = 0x41;					// I/O setup
	P1OUT = 0x01;
 
	P1REN = 0xB6; 					//Resistencias Pullup
	P2REN = 0x3F;
 
	BCSCTL3 |= LFXT1S_0 + XCAP_3;	// clock system setup
 
	while(IFG1 & OFIFG)				// wait for OSCFault to clear
	{
	  IFG1 &= ~OFIFG;
	  _delay_cycles(100000);
	}
 
	P1OUT = 0;						// both LEDs off
 
	BCSCTL2 |= SELM_0;
 
	while(1)
	{
	  P1OUT = 0x40; 			    // LED on
	  _delay_cycles(50);
	  P1OUT = 0; 			    	// LED off
	  _delay_cycles(50);
 
	  if((P1IN & 0x08) == 0)
	  {
		  P1OUT |= 0x01; 			//Led Rojo
 
		  BCSCTL1 = CALBC1_16MHZ; 	// Set range
		  DCOCTL = CALDCO_16MHZ;  	// Set DCO step + modulation
	  }
	}
}

Para ver el consumo del microcontrolador se realiza un programa como en los casos anteriores, esta vez se ponen directamente todos los pines que no se usan a tierra mediante una resistencia de pull-down, y se genera la señal de reloj de MCLK a partir de DCO. Se comienza con un DCO oscilando a 1 MHz y cuando se pulsa el botón se selecciona la frecuencia de oscilación del DCO a 16 MHz, viendo como la intensidad que consume ahora el microcontrolador es mucho mayor que con los cristales de baja frecuencia anteriores. ACLK se genera a partir del cristal externo pero este consumo es despreciable frente al de DCO.

En la segunda parte del vídeo se realiza la misma prueba, se observa la frecuencia generada en el pin de salida por el microcontrolador, observando una frecuencia de oscilación de DCO próxima a 1 MHz y a 16 MHz cuando se pulsa el botón. Se calienta el microcontrolador con un secador de pelo.. como en los casos anteriores viendo como DCO es mucho más estable que el otro oscilador interno, VLO.

Modos de bajo consumo: en la hoja de características del microcontrolador nos indican varios modos de bajo consumo, en cada uno de estos modos se activan y desactivan las distintas fuentes, señales de reloj y módulos del microcontrolador para minimizar su consumo, cuando la señal de reloj de un periférico está deshabilitada éste se apaga.

En los programas anteriores el microcontrolador estaba en el modo activo, la CPU estaba siempre encendida con su señal de reloj ejecutando código de programa, y no se apagaba o encendía nada que no pusiesemos en el programa. Cuando seleccionamos uno de los modos de bajo consumo la CPU se apaga, es decir el micro deja de ejecutar instrucciones del programa, y sólo se despierta mediante una interrupción disparada por un periférico o de manera externa.

Por ejemplo se va a programar el microcontrolador para que entre en el modo de bajo consumo LPM3, cuando el microcontrolador entra en este modo desactiva la CPU y todas las señales de reloj excepto ACLK, ACLK es generada por el cristal externo o por VLO. Esta señal ACLK va a alimentar a uno de los periféricos, un timer, que incrementará su cuenta con cada pulso de ACLK disparando una interrupción cuando el número de pulsos de ACLK alcance el valor deseado. Al dispararse la interrupción el microcontrolador sale del modo de bajo consumo LPM3 y pasa al modo activo, encendiendo la CPU y el resto de señales de reloj para ejecutar el código indicado en la subrutina de interrupción, una vez que ejecuta el código de la interrupción sale de ésta restaurando el registro de estado del microcontrolador y volviendo al modo de bajo consumo LPM3, del que no volverá a salir hasta que el timer u otro periférico dispare otra interrupción.

Para minimizar el consumo nos interesa que el microcontrolador pase la mayor parte del tiempo en LPM3, donde tenemos un reloj de bajo consumo y la CPU y demás señales de reloj apagadas, por lo que el consumo va a ser muy bajo. Para ello nos interesa que cuando salte la interrupción ésta se ejecute en el menor tiempo posible. Por lo que lo normal es utilizar para MCLK un reloj de alta frecuencia, DCO (por lo general a más de 3V la frecuencia óptima de éste reloj es la máxima), que ejecute el código de la interrupción en el menor tiempo posible volviendo al modo de bajo consumo LPM3 cuanto antes.

//DCO + XTAL + LPM
 
#include  "msp430g2553.h"
 
#ifndef TIMER0_A1_VECTOR
#define TIMER0_A1_VECTOR    TIMERA1_VECTOR
#define TIMER0_A0_VECTOR    TIMERA0_VECTOR
#endif
 
void main(void)
{
	WDTCTL = WDTPW + WDTHOLD;		// watchdog timer setup
 
 
	if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
	{
	  while(1);            			// If cal constants erased, trap CPU!!
	}
 
	BCSCTL1 = CALBC1_1MHZ; 		// Set range
	DCOCTL = CALDCO_1MHZ;  		// Set DCO step + modulation
 
 
	P1DIR = 0x41;					// I/O setup
	P1OUT = 0x01;
 
	P1REN = 0xB6; 					//Resistencias Pullup
	P2REN = 0x3F;
 
	BCSCTL3 |= LFXT1S_0 + XCAP_3;	// clock system setup
 
	while(IFG1 & OFIFG)				// wait for OSCFault to clear
	{
	  IFG1 &= ~OFIFG;
	  _delay_cycles(100000);
	}
 
	P1OUT = 0;						// both LEDs off
 
	BCSCTL2 |= SELM_0; 				//Reloj
	BCSCTL1 |= DIVA_2;
 
	CCTL0 = CCIE;					//Timer_A2
	CCR0 = 32768;						//100 Hz
	TACTL = TASSEL_1 + MC_2;
 
	_bis_SR_register(LPM3_bits + GIE);
	while(1)
	{
 
	}
}
 
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
	  P1OUT = 0x40; 			    // LED on
	  _delay_cycles(1000000);               //Mirar pa.
	  P1OUT = 0; 			    	// LED off
	  CCR0 += 32768;
}

Para probar lo anterior se realiza un programa sencillito, donde seleccionamos al cristal externo para generar la señal ACLK, a DCO para generar la señal MCLK. Configuramos un timer que cuenta los pulsos de ACLK para que genere una interrupción cada 4 segundos aproximadamente, en su ISR encendemos y apagamos el led verde de la placa. Cuando el programa llega a _bis_SR_register(LPM3_bits + GIE); el micro pasa a modo LPM3, parando la CPU y sólo sale de este modo cuando salta la interrupción encendiendo el led verde.

Observamos el consumo del microcontrolador entre los destellos del led verde, aunque seguimos generando ACLK con el reloj externo el consumo es mucho menor que antes (si se hubiese elegido VLO para generar ACLK el consumo sería menor), ya que apagamos la CPU y su reloj cuando no la necesitamos. Es importante que este reloj de alta frecuencia tenga un tiempo de encendido pequeño, ya que queremos estar el menor tiempo posible en el modo activo y no tener que esperar a que la frecuencia se estabilice, usando DCO nos indican un tiempo menor a 1 uS.

Resultados (Vcc: 3.5 V, T: 30-32 ºC):

  • MCLK generada por VLO, consumo 4.5 uA, frecuencia poco estable con la temperatura.
  • MCLK generada con un cristal externo de 32768 Hz, consumo 12.7 uA, frecuencia estable con la temperatura.
  • MCLK generada con DCO, consumo a 1 MHz: 0.4 mA, consumo a 16 MHz: 5.52 mA, la frecuencia parece estable con la temperatura.
  • Modo LPM3: ACLK generada con el cristal externo, consumo en espera 1.85 uA.
  • No dejar los pines sin usar como entradas sin conectarlas a nada, ya que incrementan notablemente el consumo.

Aquí dejo detallados los resultados  del “experimento del MSP430G2553″, todo lo comentado es muy superficial ya que el tema del bajo consumo es amplio, y aún no estoy nada familiarizado con el microcontrolador, de momento lo que he visto me ha gustado, a ver si se lleva bien con los módulos ZigBee.

Por los 4 ó 5 euros que nos cuesta la LaunchPad.. merece la pena hacerse con un kit cuando se tenga la oportunidad, está visto que sirve para entretenerse una calurosa y aburrida noche de sábado…

Visitas :10573
Both comments and pings are currently closed.

8 Responses to “TI LaunchPad. Relojes y consumo.”

  1. Gremio says:

    Ho!, que articulo más completo, enhorabuena y como siempre, muy interesante.

    Tuve la suerte de asistir en la Universidad de Lausanne en Suiza a un curso de un par de días con el mencionado LauchPad, y la verdad que es imprsionante sabiendo que solo cuesta unos 3 o 4€…

    • JMN says:

      Hola Gremio, gracias por el comentario, que suerte tener la posibilidad de poder asistir a esa clase de cursos.

      Con el precio de la placa no deben ni cubrir costes ya que muchas veces las venden desde TI a $2 y envio gratis.

      La idea es atraer gente a sus micros por lo que es ideal para un curso/clase, ya que el alumno se lleva a casa todo lo que necesita prácticamente gratis (comparando con alternativa similares).

      Para los aficionados a la electrónica es una auténtica ganga, te dan algo que hasta hace poco costaba cientos de euros:

      Placa + micro + programador/emulador + compilador/Ide = 4 euros. Desde mi punto de vista la mejor alternativa con diferencia para empezar con microcontroladores (8/16 bits).

  2. […] took some time to look at the MSP430G2553 mircocontroller (translated). Specifically, he was interested in the clock options and the low power modes. This […]

  3. anonimo says:

    Muchas gracias por el articulo, esta muy completo! gracias

  4. Wilfran Yaraure says:

    Hola, solo tengo una inquietud, para utilizar el cristal externo, debo escribir todo es codigo? o solo los:
    #include “msp430g2553.h”
    #ifndef TIMER0_A1_VECTOR
    #define TIMER0_A1_VECTOR TIMERA1_VECTOR
    #define TIMER0_A0_VECTOR TIMERA0_VECTOR
    #endif
    Son suficientes?… ademas necesito realizar varios retardos de 5seg y de 7seg, Como me recomiendan hacerlo? utilizo la launchpad 1.5 que trae el micro MSP430G2553 ya instalado y el MSP4302452 en la caja; agradezco la ayuda que me puedan prestar… saludos

  5. Wilfran Yaraure says:

    Disculpen, no sabia eso…. gracias por la ayuda, intentare a ver que tal

Subscribe to RSS Feed Follow me on Twitter!