아두이노2016. 12. 16. 16:56

인터넷을 돌아 다니다 보니 ATtiny 칩을 절전모드(Sleep Mode - Power Down Mode) 로 설정해서 3V 리튬 배터리 하나로도 수 백일을 작동하게 할 수 있다는 글을 보았다. 집안에서 AC 어댑터를 사용해서 전원을 공급한다면 별 문제가 안되겠지만 휴대기기 같이 배터리로 작동하는 장치를 만들 경우 이는 중요한 문제가 될 수도 있을 것이다. 그래서 인터넷에서 찾은 글들을 토대로 정말 전력소모가 줄어드는지 실험해 보기로 했다. 사실 MCU에 대해서 너무 깊이 들어가면 전공자도 아니고 나는 잘 모른다. 아직 계속 공부 중 이지만 이번 실험을 하면서 어려운 용어가 많이 튀어 나왔다. 인터럽트, 워치독, 레지스터... 등등 아직도 희미하게만 알고 있지 하드웨어 깊숙히 들어가면 명확히 설명하기 어려운 단어들이다. 아무튼 짬짬히 공부 중이니 언젠가는 빠삭하게 알 수 있는 날이 올 것이다. 고로 오늘의 실험은 자세한 분석용 보다는 정보의 스크랩에 의의를 두기로 하고 나중에 ATtiny 를 사용할 때 활용할 수 있도록 하는 것을 목표로 하였다.




1. LED Blink 시의 소비전류

그냥 일반적인 LED Blink 예제를 실행했을때의 소비전류이다. 소비전류의 측정은 테스터기를 전류측정(20m)에 두고 테스터기의 + 는 전원 + 에 연결하였고 테스터기 - 는 ATtiny VCC 에 연결하고 측정 하였다.


1
2
3
4
5
6
7
8
9
10
11
12
int led = 0//Attiny PB0
 
void setup() {                
  pinMode(led, OUTPUT);     
}
 
void loop() {
  digitalWrite(led, HIGH);
  delay(4000);
  digitalWrite(led, LOW);
  delay(4000);
}
cs


 

LED 가 ON 되었을 경우 12.1mA 정도의 전류를 소모했고 꺼질 시 3.5mA 정도를 소모했다.



2. ADC Off 만 했을때 소비전류

이건 Power Down 모드가 아니라 그냥 일반모드에서 ADC (Analog to Digital Converter) 만 꺼도 소비전류가 조금은 줄어든다고 하여 실험해 보았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//*** Utility macros ***//
#define adc_disable() (ADCSRA &= ~(1<<ADEN)) // disable ADC (before power-off)
// #define adc_enable()  (ADCSRA |=  (1<<ADEN)) // re-enable ADC
 
int led = 0//Attiny PB0
 
void setup() {                
  pinMode(led, OUTPUT);
  adc_disable(); // ADC uses ~320uA
}
 
void loop() {
  digitalWrite(led, HIGH);
  delay(4000);
  digitalWrite(led, LOW);
  delay(4000);
}
 
cs


 

프로그램의 주석에도 있지만 정말 0.32mA 정도가 줄어 들었다.



3. Sleep Mode 설정 했을 때 소비전류

LED 가 4초간 켜졌다가 꺼지면 Sleep Mode(Power Down)로 들어가고 다시 4초 후에 켜지는 것을 반복한다. Sleep Mode 로 들어가면 다시 깨워줄 이벤트가 필요한데 외부의 스위치나 핀 체인지 동작을 통해서 인터럽트를 발생시켜 깨울 수도 있다. 하지만 위의 경우는 자신이 알아서 깨어났다 잠을 잤다가 해야 하기 때문에 Watch Dog Timer 라는 것을 이용해서 깨우게 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <avr/sleep.h>
#include <avr/wdt.h>
 
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
 
volatile boolean f_wdt = 1;
 
int pinLed = 0;
 
 
void setup() 
  {
    pinMode(pinLed, OUTPUT);
    setup_watchdog(9);// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
                      // 6=1sec, 7=2 sec, 8=4 sec, 9= 8sec
  }
 
//****************************************************************
void loop()
  {
    if (f_wdt == 1)  // wait for timed out watchdog / flag is set when a watchdog timeout occurs
    {
      f_wdt = 0;     // reset flag
      
      digitalWrite(pinLed, HIGH);
      delay(4000);
      digitalWrite(pinLed, LOW);
      system_sleep();
    }
  }
 
//****************************************************************  
// set system into the sleep state 
// system wakes up when wtchdog is timed out
  void system_sleep()
  {
    cbi(ADCSRA, ADEN);                    // switch Analog to Digitalconverter OFF
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);  // sleep mode is set here
    sleep_enable();
    sleep_mode();                         // System sleeps here
    sleep_disable();                      // System continues execution here when watchdog timed out 
    sbi(ADCSRA, ADEN);                    // switch Analog to Digitalconverter ON
  }
 
  //****************************************************************
// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
  void setup_watchdog(int ii)
  {
    byte bb;
    int ww;
    if (ii > 9 ) ii = 9;
    bb = ii & 7;
    if (ii > 7) bb |= (1 << 5);
    bb |= (1 << WDCE);
    ww = bb;
    MCUSR &= ~(1 << WDRF);
    WDTCR |= (1 << WDCE) | (1 << WDE);
    WDTCR = bb;
    WDTCR |= _BV(WDIE);
  }
  //****************************************************************
  // Watchdog Interrupt Service / is executed when  watchdog timed out
  ISR(WDT_vect)
  {
    f_wdt = 1;  // set global flag
  }
  
cs


 

LED가 켜졌을 때는 일반적인 모드와 다를게 없는 소비전류이다. 하지만 LED 가 꺼지고 Sleep Mode 로 집입했을 때 소비전류는 0.01 또는 그 이하가 측정이 되었다.


Sleep Mode를 잘 이용하면 배터리가 오래가는 휴대장치를 만들 수 있을 것으로 생각된다.


■ ATtiny 관련 참고

※ ATtiny 프로그래밍 환경 참고 : http://deneb21.tistory.com/455, http://deneb21.tistory.com/462

※ ATtiny 서보모터 제어 & 라이브러리 참고 : http://deneb21.tistory.com/463


반응형
Posted by 대네브 (deneb)

댓글을 달아 주세요