
投稿日 2013/10/01
Microchip社のnanoWatt XLPテクノロジを採用したPIC 24F16KA102で、その低消費電力ぶりを見てみることにしました。
電池駆動の携帯型アプリケーションが増えてきた昨今、低消費電力がキーテクノロジとなってきています。
あらゆるデバイスが低消費電力を念頭に開発されてきていると言っても過言ではありません。
マイコンチップもそのひとつ。低消費電力をうたい文句に製品が発表されています。
Microchip社のPICシリーズにも低消費電力(XLP)をうたっているCPUがあります。
今回はそのひとつである 16bit CPUの24F16KA102で消費電流を計測してみました。
24F16KA102を選んだ理由は、Microchip社のデモボード DM240311が標準で搭載しているからです。
DM240311は20または28ピンのDIPであればCPUを交換できるので、後日他のCPUでも試してみたいと思います。

DM240311ボード電流計測端子が用意されている
低消費電力であるための要素は以下のものが考えられます。
○なるべく低電圧で駆動できるか
○低速のクロックで駆動できるか
○低速でよい場合と高速が必要な場合を柔軟に切り替えられるか
○やることがないとき、なるべくDeepなスリープ状態になれるか
○スリープ状態から如何に早く復帰できるか
○スリープ状態からの復帰イベントがより細かく設定できるか
○使わないペリフェラルを切り離せるか
○クロックの段階駆動ができるか
○リアルタイムクロックやウォッチドッグタイマのような常時動く機能がいかに軽いか
○電源電圧監視機構(BOR)がいかに軽いか。Sleep時や不要な時に切り離せるか
○DMAなどのCPUオフロードで実行できる機構の充実
○命令実行用RAMがあるか
○少ないCPUクロックサイクルで命令が実行できるか
○柔軟な割り込み機構をもっているか
○I/Oポートはリーク電流が少なく、内部プルアップできるか
そこで、PIC 24F16KA102の低消費電力関連の特徴を見てみます。
○なるべく低電圧で駆動できるか(Min 1.8V)
動作電圧は1.8Vから3.6Vです。
電池駆動を意識した電圧になっています。
AC-DC電源では3.3V、リチューム電池では3.2V。マンガン電池は2本直列で3V。ニッケル水素は2.4Vです。
電池は0.8V/本が消耗の目安ですので、2本直列の場合消耗直前の1.8Vまで使えます。昇圧DC-DCコンバータを使うこともあります。
○低速のクロックで駆動できるか(Fosc 1.95Khz Fosc/2 977Hz)
500KHzの内部発振器(LPFRC)を256分周すると、最低周波数1.95KHzです。この低速クロックでPeripheralが問題なければの話です。
8MHzの内部発振器(FRC)を256分周すると31.250KHz
Peripheral用のクロックは高い周波数にしておいて、CPUクロックだけDOZE(ドーズ)の分周器で低くすることができます。
○低速でよい場合と高速が必要な場合を柔軟に切り替えられるか(195uA/MHz)
クロック周波数はプログラマブル分周器でプログラム実行中いつでも変更することができます。Peripheralは固定周波数で、CPUクロックだけ変えたい場合はDOZEが使えます。
通常処理は低い周波数に切り替えるが、割り込み処理は切り替えずに実行することもできます。
○やることがないとき、なるべくDeepなスリープ状態になれるか(Seelpで25nA Deep Sleepで20nA)
省電力モードはIdle, Sleep, Deep Sleepの3種類が用意されています。
IdleはPeripharelへのクロックは続行するが、CPUクロックは停止します。CPU独立で動く機能は実行を続けることができます。
SleepはCPUとPeripheralともにクロックが停止します。
Deep SleepはSleepのより深い睡眠状態です。
当然ですがIdle>Sleep>Deep Sleepの順で低消費電力です。
○スリープ状態から如何に早く復帰できるか(5us)
スリープ状態から復帰して行う処理が一瞬で終わるような場合、つまりほとんどスリープしているようなアプリケーションでは、スリープから復帰するために必要な時間が電力消費に占める割合が高くなるので、早く復帰する必要があります。
○スリープ状態からの復帰イベントがより細かく設定できるか
さまざまなイベントでスリープから復帰できるなら、関係のないPeripheralaは停止させておくことができます。
○使わないペリフェラルを切り離せるか(各Peripheralごとにクロック停止可)
ADコンバータやタイマー、コンパレータ、RTCCなど、搭載されているPeripheral個々にクロック供給をスイッチできます。使わないPeripheralはオフにしておくことができます。
○クロックの段階駆動ができるか
一般的にクロック源の発振器は安定になるまでかなりの時間が必要です。それを待っているとその間無駄な電力を消費します。このため立ち上がりの早い低速クロックで先に立ち上げ、その後安定した高速クロックに切り替える2段階駆動ができます。
○リアルタイムクロックやウォッチドッグタイマのような常時動く機能がいかに軽いか
スリープ状態でも動いていなければならない機能としてリアルタイムクロック(RTC)やウォッチドッグタイマ(WDT)があります。これらがいかに低消費電力かが問題です。(SleepでRTC 500nA WDT 400nA)
○電源電圧監視機構(BOR)がいかに軽いか。Sleep時や不要な時に切り離せるか
BORも常に動かしておく必要がある機能です。これは電圧の低下時安全にCPUをリセットします。
必要なければオフできます。
○DMAなどのCPUオフロードで実行できる機構の充実
CPU独立動作可能なPeripheralは、CPUの負荷を軽減し、より早くSleep状態などの低消費電力モードに移行することを可能にします。大量のデータ転送はDMAに任せ、終わったら割り込みで処理するようにします。このため低消費電力のプログラムは割り込み多用となります。
○命令実行用RAMがあるか
一般的にフラッシュROMから命令をフェッチして実行するよりもSRAMなどからのほうが高速で低消費電力です。この機能は24F16KA102にはありません。
○少ないCPUクロックサイクルで命令が実行できるか
いかに少ないクロックで命令を実行できるかです。PIC 24Fは2クロックです。16Fや18Fは4クロック、PIC32では1クロックです。同じ周波数では必要クロック数が少ないほうが高速です。4クロック必要なPICと同じスピードが2クロックのCPUでは1/2のクロック周波数で同じスピードで動くことになります。
○柔軟な割り込み機構をもっているか
低消費電力のプログラムでは、ポーリング処理は禁物です。可能な限りイベントドリブンにし、そのイベントの割り込みによってスリープから復帰する形のプログラムとする必要があります。
このためさまざまな割り込み機構があるほうが有利です。
○I/Oポートはリーク電流が少なく、内部プルアップできるか(50nA)
I/Oポートは使わなくてもリーク電流が流れます。I/Oポートのレベルが安定するようにつけるプルアップ抵抗も、ある程度電流を流しておくわけですから電力を消費します。外部に抵抗をつなぐよりは、内部プルアップ機構を用いて、必要なときにだけプルアップします。
PIC24F16KA102のみの消費電流実測値(他の回路は含まず)
各クロック周波数における消費電流(横軸 クロック周波数(Fosc/2)Hz 縦軸 mA)
クロック源はFRC 8MHz
RCDIVで周波数を変更しているため、Peripheralのクロックも同じ値に変更される
上からすべてのPeripheralをオンでWhile(1)でループ、オフでWhile(1)でループ、オンでIdleに入る、オフでIdleに入る

DOZEによる各クロック周波数における消費電流(横軸 クロック周波数(Fosc/2)Hz 縦軸 mA)
DOZEで周波数を変更しているので、Peripheralのクロックは16MHz一定
上からすべてのPeripheralをオンでWhile(1)でループ、オフでWhile(1)でループ、オンでIdleに入る、オフでIdleに入る
DOZEの場合、Peripheralのクロックは一定なので、Idleの場合消費電流はPeripheralのみの一定となっている。

各クロック周波数における消費電流(横軸 クロック周波数(Fosc/2)Hz 縦軸 mA)
クロック源はLPFRC 500KHz
RCDIVで周波数を変更しているため、Peripheralのクロックも同じ値に変更される
上から
すべてのPeripheralをオンでWhile(1)でループ、オフでWhile(1)でループ、オンでIdleに入る、オフでIdleに入る
発振器自体の消費電力が、先のグラフのFRCよりもLPFRCが如何に低消費電力かがわかる。

Sleep、Deep Sleepは計測の下限を下回るので実測していません。
計測に使用したプログラム
FNOSC_FRC を変更してクロック源を変える FNOSC_FRCPLL, FNOSC_LPFRCなど
CLKDIVbits.RCDIV = 0; クロック分周比でFoscを変える 0 - 7
CLKDIVbits.DOZEN = 0; 1にするとDOZEがイネーブル
CLKDIVbits.DOZE = 0; DOZE分周比でCPUクロックを変える 0 - 7
PMD1-4 Peripheralのオンオフ 1 = Off 0 = On
//Idle(); コメントを外すとIdleモードに入る
#include <p24f16ka102.h>
_FOSCSEL(FNOSC_FRC & IESO_OFF)
_FOSC(POSCMOD_NONE & OSCIOFNC_OFF & POSCFREQ_MS & SOSCSEL_SOSCLP & FCKSM_CSECMD)
int main(void){
PMD1 = 0xFFFF;
PMD2 = 0xFFFF;
PMD3 = 0xFFFF;
PMD4 = 0xFFFF;
CLKDIVbits.RCDIV = 0;
CLKDIVbits.DOZEN = 0;
CLKDIVbits.DOZE = 0;
while(1); //Idle();
}
(JF1VRR)