0A_avr_power - jospicant/Attiny GitHub Wiki
En el Attiny85 disponemos de un registro llamado PRR que nos permite reducir el consumo del micro habilitando/deshabilitando distintos periféricos del mismo.
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.
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
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