フォト
2017年3月
      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  
無料ブログはココログ

« Raspbian Jessie のGPIOまわりの利用権限 | トップページ | aitendo I2CマトリックスキットをArduino動かしてみました »

2016年1月20日 (水)

ATtiny13Aの省電力化を試みる

前回の「ATtiny13Aをシステムクロック16kHzで利用する」でシステムクロックを落とすことで
省電力化を図りました。

更に省電力化する方法はないかと調べると次の対策があることが分かりました。

1)アナログコンパレータを停止する
    これにより消費電流が100μAほど抑えられるようです。

2)必要に応じてsleepさせる
    次の関数を使って、delayによる内部ループ待ちはせずに、CPUを必要にお応じて
    停止させる。
    set_sleep_mode(SLEEP_MODE_IDLE)
    sleep_mode()

   SLEEP_MODE_IDLEを指定したときはタイマーは可動しておりタイマー割り込みの
   利用が可能です。このタイマー割り込みを使って定期的にCPUを起こして処理し
   また寝るようにします。

実際に前回のソースを修正して試して見ました。
// アナログジョイスティック デジタル出力変換 for Lame Station
//
//       ATMEL ATTINY13 / ARDUINO
//
//                 +-\/-+
// ADC0 (D 5) PB5 1|    |8 Vcc
// ADC3 (D 3) PB3 2|    |7 PB2 (D 2) ADC1
// ADC2 (D 4) PB4 3|    |6 PB1 (D 1) PWM1
//            GND 4|    |5 PB0 (D 0) PWM0
//                 +----+

#include <avr/sleep.h>

// ピンの割り付け
#define J_UP    PB1  // UP 出力
#define J_DOWN  PB0  // DOWN 出力
#define J_RIGHT PB5  // RIGHT 出力
#define J_LEFT  PB2  // LEFT 出力

// アナログ入力ピンの割り付け(要ピン番号で指定)
#define IN1     2  // ジョイスティック UP/DOWN 
#define IN2     3  // ジョイスティック LEFT/RIGHT

void setup() {
  ACSR |= _BV(ACD);  
  pinMode(J_UP,OUTPUT);
  pinMode(J_DOWN,OUTPUT);
  pinMode(J_RIGHT,OUTPUT);
  pinMode(J_LEFT,OUTPUT); 
  
  set_sleep_mode(SLEEP_MODE_IDLE); // アイドルモードに設定
}

void readjoystic() {
  int v1,v2;
  int s1 = analogRead(IN1);
  int s2 = analogRead(IN2);
  
  if (s1 < 50) {
     digitalWrite(J_DOWN, LOW);
     digitalWrite(J_UP, HIGH);
     
  } else if (s1 > 973) {
     digitalWrite(J_UP, LOW);
     digitalWrite(J_DOWN, HIGH);
     
  } else {
     digitalWrite(J_UP, LOW);
     digitalWrite(J_DOWN, LOW);
  } 
  
  if (s2 < 50) {
    digitalWrite(J_RIGHT, LOW);
     digitalWrite(J_LEFT, HIGH);
  } else if (s2 > 973) {
     digitalWrite(J_LEFT, LOW);
     digitalWrite(J_RIGHT, HIGH);
  } else {
    digitalWrite(J_RIGHT, LOW);
    digitalWrite(J_LEFT, LOW);
  }
}

void loop() {
  readjoystic();
  sleep_mode();
}

アナログコンパレータの利用停止はsetup()内のACSR |= _BV(ACD) で設定しています。

次にスリープですが、私が利用しているsmeezekittyさん公開の「Arduino core for Attiny13
は内部的にdelay用にタイマー割り込みを使っており、256サイクルに1回割り込みが
発生するようになっています。

システムクロックが16kHzなので割り込みは62.5Hz(1秒にだいたい60回)です。
この間隔でのジョイスティックの読み込みでも実用的だと思い、ソースには単純に
setup()でset_sleep_mode(SLEEP_MODE_IDLE)、loop()でsleep_mode()を入れるだけ
としました。
(だだし、 readjoystic()の処理が1/62.5秒以上かかる場合は意味なしですが)

実際に動かして電流を測定してみると、前回の1.27mAから0.13mAほど減りました。
アナログジョイスティックが0.70mAほど流れるのでATtiny13A単体では0.44mAです。

ただし、スリープと稼働の繰り返しで電流変動が変動するため、私の安いテスター
では正確には測れていないと思います。

Dscn4702

まあ、効果はあるようなのでこの修正でいってみます。

« Raspbian Jessie のGPIOまわりの利用権限 | トップページ | aitendo I2CマトリックスキットをArduino動かしてみました »

ATtiny13A」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/571408/63093882

この記事へのトラックバック一覧です: ATtiny13Aの省電力化を試みる:

« Raspbian Jessie のGPIOまわりの利用権限 | トップページ | aitendo I2CマトリックスキットをArduino動かしてみました »