0A_avr_power - jospicant/Attiny GitHub Wiki

Librería_power.h

En el Attiny85 disponemos de un registro llamado PRR que nos permite reducir el consumo del micro habilitando/deshabilitando distintos periféricos del mismo.

PRR

Diagrama

Podremos deshabilitar los temporizadores , interface serie universal o ADC configurando adecuadamente el registro PRR.

Dentro de la libreria power.h de avr encontramos las siguientes macros que nos facilitan estas tareas:

Nota: estas funciones las probé en el Attiny85 y parecen no funcionar seguramente algún detalle se me escapa.

  • power_adc_enable() - power_adc_disable()
  • power_all_enable() - power_all_disable()
  • power_timer0_enable() - power_timer0_disable()
  • power_timer1_enable() - power_timer1_disable()
  • power_usi_enable() - power_usi_disable()

Por otra parte tenemos el registro CLKPR que nos permite decrementar la frecuencia del reloj y con ello reducir el consumo.

CLKPR

En la librería tenemos un tipo enumerado del tipo clock_div_t que nos ayudará a configurar el prescaler usado.

  • clock_div_1, clock_div_2, clock_div_4, clock_div_8, clock_div_16, clock_div_32, clock_div_64, clock_div_128, clock_div_256 ( enumeraciones del tipo clock_div_t) que corresponden con la configuración del registro CLKPR

CLKPS3:CLKPS0

Mediante las macros:

  • clock_prescale_set(clock_div_8); podemos configurar el prescaler del reloj, en este caso hemos dividido el reloj principal de 8MHz por 8 por lo que trabajaremos a 1 MHz ( delay() es correcto a 1 MHz )

  • clock_div_t clock_prescale_get(); podemos obtener el prescaler configurado.

  • En el siguiente ejemplo podemos ver como afecta al consumo del Attiny el uso de una frecuencia de reloj u otra:

//********************************************************************************************************************************************************
/*
 * Estudiamos como cambiando la frecuencia del reloj los consumos del Attiny descienden drásticamente
 *  unos 850uA a 1MHz con todo activo ( trabajando normal )
 *  unos 395uA a 31Khz con todo activo ( trabajando normal ), esto es un ahorro de unos 450 uA
 *  Si se desactiva el ADC tendremos unos 200 uA menos de consumo
 *  
 *  
 */
#include <Arduino.h>
#include <avr/power.h>

#define led 0   // led en PB0
#define adc_disable() (ADCSRA &=~(1 <<ADEN))   // ADEN = 7   1 << 7  = >  1000_0000 invertido = > 0111_1111  esto AND con lo que había lo q hace es poner a 0 el bit ADEN  ADEN=0
#define adc_enable() (ADCSRA |= (1 <<ADEN))    //                         1000_0000 or con ADCSRA =>  ADEN =1


void setup() {
  // put your setup code here, to run once:
  pinMode(led,OUTPUT);

  //Puertos no usados como INPUT_PULLUP con el fin de tener lógica controlada y evitar transiciones
  //ESto no ahorra pero controla que se produzcan transiciones incontroladas = consumo
  pinMode(PB1,INPUT_PULLUP);pinMode(PB2,INPUT_PULLUP);pinMode(PB3,INPUT_PULLUP);pinMode(PB4,INPUT_PULLUP);pinMode(PB5,INPUT_PULLUP); //Puertos no usados como INPUT_PULLUP

  clock_prescale_set(clock_div_8);  // configuro Fuses a 1MHz por defecto   --> controlo FUSES DEL RELOJ

}

void loop() {

  digitalWrite(led,1);                            
  delay(2000);
  digitalWrite(led,0);    //Enciendo 2 sg el LED                                3.6 mA con led encendido
  delay(4000);            //Mido corriente cuando se apaga el LED               850 uA con el Attiny85 Activo (con led apagado)
  adc_disable();          //Deshabilito el módulo d ADC y mido el consumo       650 uA con Attiny85 Activo pero con ADC desactivado  ( 200 uA de ahorro )           
  delay(4000);
  adc_enable();           //Habilito el módulo de ADC y mido el consumo         850 uA al reactivar el ADC.
  delay(4000);

  clock_prescale_set(clock_div_256);  // configuro reloj a  8MHz/256 = 31250 Hz   ==> 1MHz / 32   ( 1000 ms = 32 sg ) 31,25ms = 1 sg   125ms = 4sg

  digitalWrite(led,1);                            
  delay(125);            //4sg
  digitalWrite(led,0);   
  delay(125);                                                                  
  adc_disable();                     
  delay(125);                                                                 // 395 uA con ADC y 195uA sin ADC
  adc_enable();           
  delay(125);

  clock_prescale_set(clock_div_8);


}
  • podemos ver dicho código en power
⚠️ **GitHub.com Fallback** ⚠️