Arduino Pro Mini Sleep関連

Arduino Pro Miniを電池2本で動作させるための省電力トライ

WDTの発信はRCのため、正確な時間測定は出来ないが、設定は以下の通り。

WDP3

WDP2

WDP1

WDP0

Time Out時間

疑問

0

0

0

0

0

16msec

1

0

0

0

1

32msec

2

0

0

1

0

64msec

3

0

0

1

1

128msec

4

0

1

0

0

250msec

256msec?

5

0

1

0

1

500msec

512msec?

6

0

1

1

0

1.0sec

1024msec?

7

0

1

1

1

2.0sec

2048msec?

8

1

0

0

0

4.0sec

4096msec?

9

1

0

0

1

8.0sec

8192msec?

これ以降は未定義?

Arduino本家の記事から、いくつか参照。

Sleepからの復帰

  • PINからのイベント割り込み(PIN2, PIN3)
    • どちらのピンからの割り込みが入ったかで処理を変える事も可能。
  • USART(シリアルポート)からの復帰
    • これを使うには、POWER_MODE_IDLEでなくてはいけない。このモードは、USARTの電源が切られないため。これ以外のモードではだめ。当然、Sleep時の消費電力は他のモードに比べ下がらない。
  • WDTからの割り込み

avr/power.hに定義されている、各種の電源制御関連関数のいろいろ。(使用例

Disable

Enable

power_adc_disable()

power_spi_disable()

power_timer0_disable()

power_timer1_disable()

power_timer2_disable()

power_twi_disable()

=====================================================================

DeepSleep01

普通にライブラリを使って、Deep Sleepへ入る。

Power LEDLDOも付いたままで、Sleep時、約 1.1mA。復帰時約5mA

電源は、単三アルカリ2本直列。約3V 2.9V

WDTのタイマーがRC発振のため、電源電圧に振られるのか、設定時間より長い。

空きピンの処理は、すべてPullup付のINPUTにして設定した。ネットの記事によると、この方が消費電力が少なるという説明もあるが、この時点で、InputOutputに変えてみても、目立つ変化はなかった。 もっと微妙な差分なのだろう。

FTDIでシリアル通信出力を出してみたが、モニターに何も出てこない。なぜだろう?とりあえず、コメントアウトしておく。・・・あっ、シリアルの初期化をしていなかった。それが原因かな。あと、関係する周辺回路を、Wakeup後にちゃんと、電源ONしておかないといけないはず。

割り込みの中で、変数を使うためには、Volatile宣言が必要。

AtMega328Pの内部の動作の電源を切って消費電力を抑える関数を使ってみた。ADCも当然OFFされる。ただ、Delay関数がTimer0を使っているため、Timer0だけは、電源を入れておかないと、Delayが動作しない。

★コード (DeepSleep01)

DeepSleep02

ライブラリを使わず、Assembly言語で少し書く。

(参考:ArduinoSleep – TetsuakiBaba.jp

Power LEDを外してみた(1kΩの抵抗だけを外した)。LDOはそのまま。

BODBrown Out Detect)回路の設定が効いているのかな?

WDTも完全に切って、単純にDeep Sleepに落ちるだけ。復帰しないコード。

空きピンは、この例では、OUTPUTにしてみたが、それほど変化を感じない。

この状態で、33uAまで落ちた。

電源は同じく、アルカリ単三電池2本(ちょっと古め)

Net情報では、数uA程度まで落ちているらしいが、Arduino Pro Mini環境としては、多分最小なのではと思う。(あと、LDOを外すと、どのくらい減るのかは楽しみだが)。

電流の測定が、適当なテスターの uAレンジなのだが、mAレンジだと起動するのに、uAレンジだと電池で起動しない事がある。テスターの内部電圧ドロップで、ATMEGAへの電圧不足か。(既に、だいぶ使った単三アルカリ電池2本直結なので)

★コード (DeepSleep02)

=====================================================================

DeepSleep03

02と同様に、アセンブラを一部使ってSleepに入り、WDTで復帰する。

なぜか、使っているうちに徐々に電流消費量が増えてきている気がする。

最初は 48uA程度でSleep出来ていたと思うのだが、使っているうちに、約90uA程度要するようになってきている。02に比べ、WDTを走らせているので消費電力はおおくなると思うが、現時点(2018/03/06 )で、当初出ていた 48uAでSleepすることは出来なくなっている。何か、コード上の間違いをしているのかもしれないが、何度見ても、おかしくない気がする。

オリジナルのネット上のコードとの違いは、割り込み中の処理を最小限にしたことと、WDTBODの設定を、毎回Sleep時に行わず、初期設定だけで行っている事。 これをもう一度、戻したときに、消費電力がどうなるのか、確かめる必要はあると思われる。

LED Blinkの関数をちょっと変えた。

★コード (DeepSleep03)

============================================================

LDOを外してみる。(使っていないLDOを外してどれだけ減るのか?)

まだ、試していない・・・。

電流と電圧を正確に測定するために工夫が必要。

INA226を使った電圧・電流計を製作し、出力をProcessingを使ってプロットした。たとえば、こんな感じで出力できる。(製作記事


ちなみに、この測定は、2msec割り込みで500サンプルとった場合(ひとメモリ:50sample, 100msec, グラフ全体で1秒。LEDをチカチカさせたもの。50msecON50msecOFF4回繰り返す例)

LED点灯時は7.5mALED消灯時は3.7A程度、DeepSleep時は測定ノイズ程度と分かる。Deep Sleep時の正しい電流を測定するには、今のINA226のシャント抵抗値では無理(25mOhmで、分解能は 0.1mA)。


シェアする

  • このエントリーをはてなブックマークに追加

フォローする