Modos de bajo consumo en MSP430

Detalle MSP430

En el artículo hicimos un repaso al módulo de reloj, que está íntimamente ligado a los modos de bajo consumo del microcontrolador MSP430. Una de las ventajas de éste sobre otros microcontroladores es la gran flexibilidad que ofrece a la hora de configurar los relojes y, por ende, el modo de bajo consumo.

El MSP430 permite la desactivación de las fuentes de reloj y de los propios relojes, lo que permite desactivar la CPU y los periféricos mientras no sean necesarios. Además, el módulo de gestión de energía (PMM o Power Management Module) hace posible incluso apagar el core (CPU) del microcontrolador.

En la práctica, la mayoría de las aplicaciones no requieren que la CPU o los periféricos estén siempre funcionando. Imaginemos un dispositivo IoT que envía información sobre contaminación atmosférica a un servidor remoto. En este caso, no es necesario estar constantemente consultando el estado de los sensores y enviando información, sino que puede hacerse cada pocos segundos o incluso minutos. Si la operación de lectura de los sensores más en envío de los datos necesitan, por simplificar, 1 segundo y esta operación se realiza cada 60 segundos, aproximadamente el 98% del tiempo el microcontrolador está ocioso, pero consumiendo energía. Si “dormimos” la CPU y los periféricos durante ese tiempo, el consumo cae drásticamente, y eso en un dispositivo autónomo es lo más importante. Además de poder “dormirlo” necesitaremos una forma de “despertarlo”, lo que en general conseguiremos mediante el uso de interrupciones. Evidentemente, esta operación de dormir-despertar conlleva una penalización en tiempo que podría no ser viable en un dispositivo que necesita responder en tiempo real.

Modos de bajo consumo

Los modos de bajo consumo se configuran mediante el registro de estado de la CPU (registro SR).

Registro de estado SR

En concreto se utilizan los bits SCG0, SCG1, OSCOFF y CPUOFF. Mediante la activación de estos bits podemos seleccionar alguno de los modos de bajo consumo definidos en la siguiente tabla.

Modos de bajo consumon LPM

Los modos LPM3.4 y LPM4.5 no están disponibles en todas las versiones del microcontrolador. En el MSP430F5529, que es el que estoy usando, el modo LPM3.5 no está disponible.

Con todos los bits a 0 el microcontrolador se encuentra en estado activo. En este modo, la CPU y las fuentes de reloj están activas, por lo tanto es el modo de mayor consumo. A cambio la respuesta es más rápida.

En el modo LPM0 y LPM1 se para la CPU como consecuencia de la desactivación del reloj MCLK. La diferencia entre ambos es que en el modo LPM0 el bloque FLL se desactiva si no se está usando el DCO y en el modo LPM1 el FLL se desactiva siempre.

En el modo LMP2 y LMP3 además de MCLK (y por ende la CPU) también se desactiva SMCLK. ACLK permanece activo. Se diferencian en que LPM2 mantiene parte del FLL activo lo que facilita una más rápida estabilización del DCO (y también algo más de consumo).

En el modo LPM4 la CPU y todos los relojes de desactivan.

Los modos LPM3.5 y LPM4.5 paran la CPU y todos los relojes, pero además el PMM desactiva la alimentación del core, lo que implica la perdida del contenido de los registros y la memoria RAM dinámica.

Código de ejemplo

Partimos del mismo código de ejemplo que ya utilizamos en el artículo sobre interrupciones. La única diferencia con aquel código es una sola línea dentro del bucle while:

__low_power_mode_3();

Esta línea hace que el microcontrolador entre en modo LPM3 (es fácil adivinar cómo se entra en, por ejemplo, LPM2 ¿no?), lo que implica que el reloj MCLK (por lo tanto también la CPU) y SMLK están parados. Sin embargo ACLK está activo, lo que permite que el sistema mantenga los sistemas periféricos en marcha y por lo tanto, aunque la CPU esté parada, en el momento en que se produzca una interrupción, la rutina de gestión la va a tratar. Cuando esto sucede, obviamente el reloj MCLK se pone en marcha y permite que se ejecute dicha rutina. Al terminar la rutina restaura desde la pila los valores del registro de estados SR, que recordemos, permiten gestionar los modos de bajo consumo. Así pues, tras la ejecución de la rutina de interrupción el microcontrolador vuelve al estado de bajo consumo en el que se encontraba antes de entrar, ya que se restaura el registro SR tal y como estaba antes de la interrupción.

 

#include <msp430.h>
int main(void)
{
  WDTCTL = WDTPW + WDTHOLD; // Detiene el watchdog
  P1DIR |= BIT0;            // P1.0 (LED) como salida digital
  P1REN |= BIT1;	    // Resistencia en P1.1 (pulsador derecho)
  P1OUT |= BIT1;	    // Modo pull-up
  P1IE |= BIT1;		    // habilita la interrupción de P1.1
  P1IES |= BIT1;	    // Interrupción por flanco de bajada
  P1IFG &= ~(BIT1);	    // baja flag de interrupción de P1.1

  // Activar interrupciones
  // también puede usarse: __enable_interrupt()
  __bis_SR_register(GIE);   

  // bucle infinito.
  while (1) {
    __low_power_mode_3(); // entramos en modo LPM3
    __no_operation();
  }
}

#pragma vector=PORT1_VECTOR
__interrupt
void P1_ISR(void) {
  if (P1IFG & BIT1) {	// comprobar fuente de la interrupción P1.1
    if (P1IN & BIT1) {	// Estado de P1.1: si está a 1 (no pulsado)
      P1OUT &= ~BIT0;   // Apaga LED
      P1IES |= BIT1;	// activación por flanco de bajada
    } else {            // y si no (pulsado),
      P1OUT |= BIT0;    // Enciende LED
      P1IES &= ~BIT1;	// activación por flanco de subida
    }
    P1IFG &= ~BIT1;	// puesta a cero del flag de interrupción P1.1
  }
}

Vamos a medir, polímetro en mano, qué efecto produce la línea que hemos añadido en el consumo del sistema. Podemos medir la corriente consumida usando el jumper de 3.3V de la placa launchpad (al quitar el jumper tenemos dos pines sobre los que medir).

Consumo en modo activo

Como se puede observar en la imagen, sin utilizar el modo de bajo consumo (modo activo) tenemos un consumo en stand by (sin tener en cuenta el consumo al pulsar el botón y encender el LED) de alrededor de 1mA. Ahora veamos el consumo en modo LPM3.

Modo bajo consumo LPM3

Tenemos 0,66mA de consumo en LPM3. Este consumo aun puede mejorarse, pero nos vale como ejemplo práctico del uso de los modos de bajo consumo del MSP430.

 

CompartirShare on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

Sé el primero en comentar en "Modos de bajo consumo en MSP430"

Deja un comentario.

Tu dirección de correo no será publicada.


*