なんでも作っちゃう、かも。

Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。

Arduinoで遊ぼう - 動作クロックを切り替えて省電力制御

Posted by arms22 on 2010年03月04日 2  0

Arduinoの動作クロックを変更するライブラリ「Prescaler」を作った。普段、Arduinoは16MHz(Proは8MHz)で動いている。このライブラリを使えば8MHz、4MHz、2MHz、1MHzと動的に動作クロックを切り替えることができる。USB電源やDC電源を使って動作させている場合はそれほど省電力に気を使う必要はないだろう。でも、電池やソーラーセルで動作させたい場合は別だ。動作クロックを切り替えて、積極的に省電力制御を行おう。

次の図はATmega168Pの動作クロックと消費電流の関係を表している。当然、動作クロックが低いほど消費電流は少なくなる。
ATmega168P ACTIVE SUPPLY CURRENT vs. FREQUENCY
(ATmega168Pのデータシートより)

次の関数・ライブラリはArduinoが16MHz(Proは8MHz)で動いていることを前提に作られている。その為、Prescalerで動作クロックを切り替えると正しく動作しなくなる。

  • Serialライブラリ
  • tone()
  • analogRead()
  • micros()
  • millis()
  • delayMicroseconds()
  • delay()

delay()/millis()については代替関数を用意しているので、これらを使う。
  • scaledMillis()
  • scaledDelay(ms)


ライブラリのインストール


次のURLからPrescalerライブラリをダウンロードし、Arduinoのライブラリフォルダにコピーする。

Prescalerライブラリ
http://arms22.googlecode.com/files/Prescaler001.zip

サンプルスケッチ


#include <Prescaler.h>

const int led_pin = 13;

void setup()
{
  pinMode(led_pin, OUTPUT);
  Prescaler.set(clock_div_8);
}

void loop()
{
  scaledDelay(500);
  digitalWrite(led_pin, HIGH);
  scaledDelay(500);
  digitalWrite(led_pin, LOW);
}

Prescaler.set()でSystem Clock Prescalerの分周比を設定する。Arduino Pro 3.3V 8MHz 168を使って分周比1から256まで設定した時の消費電流を計測してみた。
div18MHz5.0mA
div24MHz3.4mA
div42MHz2.5mA
div81MHz1.8mA
div16500kHz1.5mA
div32250kHz1.3mA
div64125kHz1.2mA
div12862.5kHz1.2mA
div25631.25kHz1.1mA



※実は Arduino playground 全く同じようなライブラリがすでにあったりする。。

Arduino playground - Prescaler
http://www.arduino.cc/playground/Code/Prescaler



Making Things Talk ―Arduinoで作る「会話」するモノたち
Tom Igoe
オライリージャパン
売り上げランキング: 107826




Ads by Google

Leave a reply






管理者にだけ表示を許可する

該当の記事は見つかりませんでした。