スリープ・モードを使うことにより、MCU内の使われていないモジュールを停止して消費電力を抑えることができます。AVRには様々なスリープ・モードがあり、ユーザーが各種用途の要求に応じて消費電力を調整することができるようになっています。
Figure 8-1 (p.26)にATmega48/88/168内の各クロック・システムとその分配の様子が示されています。この図は、適切なスリープ・モードを選択するのに役に立ちます。Table 9-1には、各スリープモードとそれぞれのウェークアップ要因が記されています。
Table 9-1. 各スリープモードで有効となるクロック、およびウェークアップ要因
有効なクロック | 発振器 | ウェークアップ要因 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
スリープ・モード | clkCPU | clkFLASH | clkI/O | clkADC | clkASY | 主クロック発振器 | タイマー・クロック発振器 | INT1, INT0, 端子電圧の変化 | TWIアドレス・マッチ | タイマー2 | SPM/EEPROMレディ | ADC | WDT | その他 |
アイドル・モード | X | X | X | X | X (2) | X | X | X | X | X | X | X | ||
ADCノイズ低減モード | X | X | X | X (2) | X (3) | X | X (2) | X | X | X | ||||
パワーダウン・モード | X (3) | X | X | |||||||||||
パワーセーブ・モード | X | X (2) | X (3) | X | X | X | ||||||||
スタンバイ・モード | X | X (3) | X | X |
注意
5つのスリープ・モードのどのモードに入る場合でも、SMCRレジスタのSEビットに1を書き込み、SLEEP命令を実行する必要があります。SMCRレジスタのSM2、SM1、SM0ビットは、どのスリープ・モード(アイドル・モード、ADCノイズ低減モード、パワーダウン・モード、パワーセーブ・モード、スタンバイ・モード)がSLEEP命令により有効になるか、を選択します。42ページのTable 9-2に各ビットとモード選択についての要約を記します。
スリープ・モード中に有効となっている割込みが発生するとMCUはスリープ・モードから復帰(ウェークアップ)します。そしてMCUはスタートアップ時間に加えて4サイクルの間停止状態となり、その後発生した割込み処理ルーチンを実行してからSLEEP命令の次の命令から実行を再開します。レジスタ・ファイルとSRAMの内容はスリープ・モードからウェークアップする際には変更されません。スリープ・モード中にリセットが発生した場合は、MPUはウェークアップし、リセット・ベクトルから実行を開始します。
SM2..0ビットに000が書き込まれている場合、SLEEP命令によりMPUはアイドル・モードとなり、SPI、USART、アナログ・コンパレータ、A/Dコンバータ、2線式シリアル、タイマー/カウンター、ウォッチドッグ、割込み処理回路を動作継続した状態でCPUを停止します。このスリープ・モードでは基本的にclkCPUとclkFLASHが停止し、他のクロックは動作状態になります。
アイドル・モードでは、MCUは外部割込み要因とタイマー・オーバーフロー割込みやUSART送信完了割込みのような内部割込み要因によりウェークアップ可能です。アナログ・コンパレータ割込みが必要でなければ、アナログ・コンパレータ・コントロール/ステータス・レジスタ(ACSR)のACDビットを設定して停止させることができます。A/Dコンバータが有効になっている場合、アイドル・モードに入るとA/D変換が自動的にスタートします。
SM2..0ビットに001が書き込まれている場合、SLEEP命令によりMPUはADCノイズ低減モードになり、A/Dコンバータ、外部割込み、2線式シリアル・インターフェースのアドレス監視、タイマー/カウンター2(1)、ウォッチドッグを(それぞれ有効になっている場合)動作継続した状態となります。このスリープ・モードでは、基本的にclkI/O、clkCPU、clkFLASHが停止し、他のクロックは動作状態になります。
このモードはA/D変換での周辺回路のノイズを低減し、より精度の高い計測を可能にします。A/Dコンバータが有効になっていると、このモードに入ると自動的にA/D変換がスタートします。A/D変換完了割込み以外には、外部リセット、ウォッチドッグ・リセット、ウォッチドッグ割込み、ブラウン・アウト・リセット、2線式シリアル・インターフェースのアドレス・マッチ、タイマー/カウンター2割込み、SPM/EEPROMレディー割込み、INT0およびINT1のレベル変化割込み、および、ポート端子電圧変化による割込みで、MCUをA/Dノイズ低減モードからウェークアップさせることができます。
注意
SM2..0ビットに010が書き込まれている場合、SLEEP命令によりMCUはパワーダウン・モードになります。このモードでは、外部発振回路を停止し、外部割込み、2線式シリアル・インターフェースのアドレス監視、ウォッチドッグを(有効に設定されていれば)動作継続します。外部リセット、ウォッチドッグ・システムリセット、ウォッチドッグ割込み、ブラウン・アウト・リセット、2線式シリアル・インターフェースのアドレス・マッチ、INT0およびINT1の外部レベル変更割込み、およびポート端子電圧変化による割込みのいずれかによってのみ、MCUをウェークアップすることができます。このスリープ・モードでは、すべての内部生成クロックが停止し、非同期動作のモジュールのみが動作します。
電圧変化による割込みをパワーダウン・モードからのウェークアップに使う場合、MCUを復帰させるために、レベルの変化が一定時間保持される必要があります。詳細については、「外部割込み」(p.65)を参照してください。
パワーダウン・モードからウェークアップする際、ウェークアップの条件が発生してからウェークアップが有効になるまでには遅延時間があります。この遅延時間において停止していたクロックを再スタートし安定化させます。「クロックの供給源」(p.27)に記載されているとおり、ウェークアップ期間は、リセット時のタイムアウト期間を設定するCKSELヒューズ・ビットにより決定されます。
SM2..0ビットに011が書き込まれている場合、SLEEP命令により、MCUはパワーセーブ・モードになります。このモードは一つの違いを除いてパワーダウン・モードと同じです。
タイマー/カウンター2が有効になっている場合、スリープ中も動作を継続します。デバイスはタイマー・オーバーフロー、あるいは、出力コンペア・マッチがタイマー/カウンター2において発生した場合、該当するタイマー/カウンター2の割込み許可ビットがTIMSK2レジスタでセットされており、SREGのグローバル割込み許可ビットがセットされていれば、ウェークアップすることができます。
タイマー/カウンター2が動作していない場合は、パワーセーブ・モードではなく、パワーダウン・モードを使用することが推奨されます。
タイマー/カウンター2は、パワーセーブ・モードにおいて、同期クロックでも非同期クロックでも動作させることが可能です。タイマー/カウンター2が非同期クロックを使用していない場合、タイマー/カウンターの発振器はスリープモード中には停止しています。タイマー/カウンター2が同期クロックを使用していない場合、スリープモード中はクロック源は停止します。なお、パワーセーブ・モードにおいて同期クロックが動作する場合であっても、このクロックはタイマー/カウンター2においてのみ有効となることにご注意ください。
SM2..0ビットに110が書き込まれており、外部接続のクリスタル/セラミック発振子を使用する設定となっている場合、SLEEP命令によりMCUはスタンバイ・モードになります。このモードは、発振回路が動作を継続することを除いて、パワーダウン・モードと同じです。スタンバイ・モードから復帰する際、デバイスは6クロック期間でウェークアップします。
消費電力低減レジスタ(PRR)について、「PRR - 消費電力低減レジスタ」(p.43)を参照ください。これは、消費電力を低減するために、個々の周辺回路への供給クロックの停止について設定を行います。周辺回路の設定はそのままとなり、入出力レジスタは読むことも書くこともできなくなります。該当する周辺回路が使用しているリソースは、クロックが停止している間も占有されたままとなり、多くの場合、その周辺機能はクロックが停止する前に無効になります。PRRレジスタ中の該当ビットをクリアすることにより周辺モジュールをウェークアップすると、そのモジュールは停止以前と同じ状態に戻ります。
各モジュールごとの停止機能はアイドル・モードおよびアクティブ・モードにおいて使用でき、全体の電力消費を大幅に低減することができます。使用例については、「パワーダウン・モード時の供給電流」(p.322)を参照してください。他のスリープ・モードでは、クロック供給は最初から停止されています。
AVR使用のシステムにおける消費電力を最小にしようとする場合に考慮すべき手段がいくつかあります。一般に、スリープ・モードを可能な限り使用し、動作しているデバイスの機能をできるだけ少なく設定することです。すべての機能を必ずしも停止する必要はありません。特に以下のモジュールについては、消費電力を最小にしようとする際には特別な考慮が必要です。
A/Dコンバーターは、有効になっていれば全てのスリープ・モードで使用可能です。消費電力を抑えるため、A/Dコンバーターはスリープモードに入る前に停止させておくべきです。A/Dコンバーターを停止させ、再度オンした後、最初のA/D変換時間は長くなります。A/Dコンバーターの動作の詳細については、「A/Dコンバーター」(p.243)を参照してください。
アイドル・モードに入る場合、使用しないアナログ・コンパレータは停止させておくべきです。ADCノイズ低減モードに入る場合、アナログ・コンパレータは無効にしておくべきです。その他のスリープ・モードでは、アナログ・コンパレータは自動的に停止します。しかしながら、アナログ・コンパレータが内蔵の電圧リファレンスを使用するように設定されている場合は、全てのスリープ・モードでアナログ・コンパレータを無効に設定するべきです。そうしないと、内蔵の電圧リファレンスがスリープモードと関係なく有効になります。アナログ・コンパレータの設定方法の詳細については、「アナログ・コンパレータ」(p.240)を参照してください。
ブラウン・アウト検出回路が必要ない用途にでは、このモジュールを停止しておくべきです。ブラウン・アウト検出回路がBODLEVELヒューズ・ビットにより有効になっている場合、すべてのスリープモードで有効になり電力を消費します。より消費電力の小さいスリープ・モードでは、この回路は全体の消費電力に大きく影響します。ブラウン・アウト検出回路の設定方法についての詳細は「ブラウン・アウト検出」(p.46)を参照してください。
ブラウン・アウト検出回路、アナログ・コンパレータ、A/Dコンバータで必要な場合、内蔵の電圧リファレンスが有効になります。上の節で述べたように、これらのモジュールが無効になっている場合、内蔵の電圧リファレンスは無効になり電力は消費されません。再びオンにするとき、ユーザーはその出力を利用する前に電圧リファレンスをスタート・アップさせるようにしておかなければなりません。電圧リファレンスがスリープ・モード中もオン状態になっている場合は、その出力はすぐに使用可能です。スタート・アップ時間の詳細については、「内蔵の電圧リファレンス」(p.47)を参照してください。
ウォッチドッグ・タイマーが必要のないアプリケーションでは、このモジュールを停止しておくべきです。ウォッチドッグ・タイマーが有効になっていると、すべてのスリープ・モードで有効となり電力を消費します。より消費電力の小さいスリープ・モードでは、この回路は全体の消費電力に大きく影響します。ウォッチドッグ・タイマーの設定方法の詳細については、「ウォッチドッグ・タイマー」(p.48)を参照してください。
スリープ・モードに入る場合、全てのポート端子は消費電力が最小になるように設定しておくべきです。抵抗負荷をドライブしたままの端子がないように確実に設定することが最も重要です。I/Oクロック(clkI/O)とADCクロック(clkADC)が両方とも停止してるスリープモードでは、デバイスの入力バッファは無効になっています。これにより、必要のない場合に、入力回路により電流が消費されることのないようにします。ウェークアップ要因を検出するために入力回路を動作させる必要がある場合には、回路は有効になります。どの端子が有効になるかについての詳細は、「デジタル入力の有効化とスリープモード」(p.74)を参照してください。入力バッファが有効になっており、入力信号がフロート状態、またはVCC/2に近いアナログ信号電圧が端子に印加されている場合、入力バッファは非常に大きな電力を消費します。
アナログ入力として使用する端子については、デジタル入力バッファを常に無効にしておくべきです。VCC/2に近いアナログ信号電圧が端子に印加されている場合、アクティブ・モードにおいても入力バッファで非常に大きな電力が消費されます。デジタル入力バッファは、デジタル入力無効化レジスタ(DIDR1およびDIDR0)に書き込むことで無効化できます。詳細については、「DIDR1 – デジタル入力無効化レジスタ1」(p.242)、「DIDR0 – デジタル入力無効化レジスタ0」(p.258)を参照してください。
DWENヒューズ・ビットによりオンチップ・デバッグ・システムが有効になっているときにチップがスリープ・モードに入ると、主クロック源は有効となり、したがって常に電力を消費します。より消費電力のスリープ・モードにおいて、これは全体の消費電力のうち、非常に大きな割合となります。
スリープ・モード・コントロール・レジスタには、消費電力管理のための制御ビットがあります。
ビット | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0x33 (0x53) | - | - | - | - | - | SM2 | SM1 | SM0 | SMCR |
Read/Write | R | R | R | R | R | R/W | R/W | R/W | |
初期値 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
これらのビットは未使用であり、ATmega48/88/168では、読み出し時に常にゼロとなります。
これらのビットにより、Table 9-2に示されたとおりに、5つあるスリープ・モードから選択されます。
Table 9-2. スリープ・モードの選択
SM2 | SM1 | SM0 | スリープ・モード |
---|---|---|---|
0 | 0 | 0 | アイドル・モード |
0 | 0 | 1 | ADCノイズ低減モード |
0 | 1 | 0 | パワーダウン・モード |
0 | 1 | 1 | パワーセーブ・モード |
1 | 0 | 0 | (予約) |
1 | 0 | 1 | (予約) |
1 | 1 | 0 | スタンバイ・モード (1) |
1 | 1 | 1 | (予約) |
注意
MCUをSLEEP命令の実行によりスリープ・モードにする場合には、SEビットに1を書き込んでおく必要があります。プログラマが意図していないスリープ・モードになるのを防止するため、SLEEP命令の実行の前にスリープ有効(SE)ビットを1にセットし、ウェークアップ直後にクリアすることが推奨されます。
ビット | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
(0x64) | PRTWI | PRTIM2 | PRTIM0 | - | PRTIM1 | PRSPI | PRUSART0 | PRADC | PRR |
Read/Write | R/W | R/W | R/W | R | R/W | R/W | R/W | R/W | |
初期値 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
このビットに1を書き込むとTWIモジュールへのクロック供給を止め、停止します。TWIを再びウェークアップして使用する場合には、TWIをもう一度初期化し正しく動作するように設定する必要があります。
このビットに1を書き込むと、タイマー/カウンター2モジュールが同期動作モード(AS2を0に設定)になっている場合、停止させます。タイマー/カウンター2を有効にすると、停止される前と同じように継続動作します。
このビットに1を書き込むと、タイマー/カウンター0モジュールを停止します。タイマー/カウンター0を有効にすると、停止される前と同じように継続動作します。
このビットはATmega48/88/168では予約となっており、読み出し時には常にゼロとなります。
このビットに1を書き込むと、タイマー/カウンター1モジュールを停止します。タイマー/カウンター1を有効にすると、停止される前と同じように継続動作します。
debugWIREオンチップ・デバッグ・システムを使用している場合には、このビットに1を書き込まないでください。
このビットに1を書き込むと、SPIへのクロック供給を止め、停止します。SPIを再びウェークアップして使用する場合には、SPIをもう一度初期化して正しく動作するように設定してください。
このビットに1を書き込むと、USARTへのクロック供給を止め、停止します。USARTを再びウェークアップして使用する場合には、USARTをもう一度初期化して正しく動作するように設定してください。
このビットに1を書き込むと、A/Dコンバータを停止します。A/Dコンバータは停止前に無効にしておいてください。A/Dコンバータが停止している場合、アナログ・コンパレータは、A/Dコンバータのマルチプレクス入力を利用することはできません。