인터넷을 돌아 다니다 보니 ATtiny 칩을 절전모드(Sleep Mode - Power Down Mode) 로 설정해서 3V 리튬 배터리 하나로도 수 백일을 작동하게 할 수 있다는 글을 보았다. 집안에서 AC 어댑터를 사용해서 전원을 공급한다면 별 문제가 안되겠지만 휴대기기 같이 배터리로 작동하는 장치를 만들 경우 이는 중요한 문제가 될 수도 있을 것이다. 그래서 인터넷에서 찾은 글들을 토대로 정말 전력소모가 줄어드는지 실험해 보기로 했다. 사실 MCU에 대해서 너무 깊이 들어가면 전공자도 아니고 나는 잘 모른다. 아직 계속 공부 중 이지만 이번 실험을 하면서 어려운 용어가 많이 튀어 나왔다. 인터럽트, 워치독, 레지스터... 등등 아직도 희미하게만 알고 있지 하드웨어 깊숙히 들어가면 명확히 설명하기 어려운 단어들이다. 아무튼 짬짬히 공부 중이니 언젠가는 빠삭하게 알 수 있는 날이 올 것이다. 고로 오늘의 실험은 자세한 분석용 보다는 정보의 스크랩에 의의를 두기로 하고 나중에 ATtiny 를 사용할 때 활용할 수 있도록 하는 것을 목표로 하였다.
■ 참고한 사이트
http://www.technoblogy.com/show?KX0
http://www.re-innovation.co.uk/web12/index.php/en/blog-75/306-sleep-modes-on-attiny85
http://interface.khm.de/index.php/lab/interfaces-advanced/sleep_watchdog_battery/
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
'아두이노' 카테고리의 다른 글
[아두이노] 서보모터를 이용한 자동 물고기 사료 공급장치 아두이노 버전 (0) | 2016.12.28 |
---|---|
[ATtiny] ATtiny85 칩을 이용한 LED 크리스마스 트리, 찰리플렉싱 이용 (0) | 2016.12.22 |
[ATtiny] ATtiny85 와 서보모터를 이용한 자동 물고기 사료 공급장치 (5) | 2016.12.15 |
[ATtiny] ATtiny85 서보모터 제어 (2) | 2016.12.13 |
[ATtiny] ATtiny85 MCU 프로그래밍 보드 제작 (0) | 2016.12.12 |