
投稿日 2016/09/06
最近収集したPIC 16F18857で消費電流を計測してみました。
一般的にCPUデバイスは、電源電圧(Vcc)が低いほど、またクロック周波数(Fosc)が低いほど低消費電流となります。
今回は、スリープモードやDOZEモードは使わずに、電源電圧とクロック周波数のみを変化させて、消費電流を計測してみました。
スリープモードとDOZEモードは別の機会にとり上げたいと思っています。

内部発振器 HFINTOSCは1から32MHz 2のn乗階で設定可能 x2PLLを接続できる
x2PLLを選ぶと自動的に16MHzに設定される
内部発振器 LFINTOSCは31KHz
外部発振子 EXTOSCはx4 PLLを接続できる
いずれの場合でも最高周波数32MHzを超えることはできない
今回セカンダリ外部発振(SOSC 32.768KHz)は使っていないので省略
計測の条件
CPU: PIC16F18857
原発振(Clock Source): 内部発振器(HFINTOSC, LFINOSC)、外部発振子(8MHz XTAL)
電源電圧: 2.5V から 5.0V
電源電圧、クロック周波数以外の電流消費にかかわる項目の設定(固定項目)
TRISx = 0XFF GPIOはすべて入力モード(LED点滅でクロック設定を確認するRC0のみ出力)
PMDn = 0XFF 周辺機能はすべてディセーブル
ICSPはプログラムの書き込みが済んだら外しました
プログラムの実行はwhile(1);でループ
LEDなどの電流消費要素はなし
ブレッドボードを使用したため若干の接触抵抗があると思います。
その他の設定
内部発振器(HFINTOSC, LFINTOSC)を使用するときは、CONFIG1レジスタのFEXTOSCはOFF
CONFIG2レジスタのMCLRはON(リセットスイッチ有効)
CONFIG3レジスタのWDTE OFF(ウォッチドッグはOFF)
CONFIG2レジスタのBORV LO(今回使用のPIC 16F18857のBORVは約2.46Vです。このため最低電源電圧は2.5Vとしました。)
CSWEN OFF(プログラム実行中のクロック切り替え(Clock Switching)は行いません)
電源電圧
2.5V、3.0V、3.3V、4.0V、4.5V、5.0V で計測しました。3.5Vではなく3.3Vで計測したので、グラフにへこみが出ています。(ご愛敬)電圧はDMMを見ながらmVレベルまで調整しています。
クロック周波数(Fosc)

PIC 16F18857のクロックシステム
以下の原発振と周波数で計測を行いました。
HFINTOSC 1MHz HF内部発振器の1MHz
HFINTOSC 32MHz HF内部発振器の32MHz
HFINTOSC 8MHz HF内部発振器の8MHz(OSCFRQで設定)
HFINTOSC 16MHz HF内部発振器の16MHz(OSCFRQで設定)
LFINTOSC 31KHz LF内部発振器の31KHz
EXTOSC HS 8MHz 外部発振子 8MHz
EXTOSC HS 8MHz + x4 PLL 外部発振子 8MHzをPLLで4倍して32MHz
HFINTOSC 16MHz + x2 PLL HF内部発振器 16MHzをPLLで2倍して32MHz
外部発振器(オシレータモジュール)はそれ自体消費電流があること、および5V用のものしか手持ちがないので採用しませんでした。なお外部発振器(オシレータモジュール)は結構消費電流が多いので要注意です。
計測に使用したプログラム
HFINTOSC 32MHzに設定したときの状態です。
#include <xc.h>
// CONFIG1
#pragma config FEXTOSC = OFF
#pragma config RSTOSC = HFINT32
#pragma config CLKOUTEN = OFF
#pragma config CSWEN = OFF
#pragma config FCMEN = OFF
// CONFIG2
#pragma config MCLRE = ON
#pragma config PWRTE = OFF
#pragma config LPBOREN = OFF
#pragma config BOREN = OFF
#pragma config BORV = LO
#pragma config ZCD = ON
#pragma config PPS1WAY = ON
#pragma config STVREN = ON
// CONFIG3
#pragma config WDTCPS = WDTCPS_31
#pragma config WDTE = OFF
#pragma config WDTCWS = WDTCWS_7
#pragma config WDTCCS = SC
// CONFIG4
#pragma config WRT = OFF
#pragma config SCANE = available
#pragma config LVP = ON
// CONFIG5
#pragma config CP = OFF
#pragma config CPD = OFF
#define _XTAL_FREQ 32000000
int i;
void main(void) {
TRISA = 0xFF; // PORTA すべて出力
TRISC = 0xFE; // PORTC RC0以外出力
ANSELA = 0; //すべてデジタルI/O
ANSELC = 0; //すべてデジタルI/O
PMD0 = 0xFF; //周辺機能はすべてディセーブル
PMD1 = 0xFF;
PMD2 = 0xFF;
PMD3 = 0xFF;
PMD4 = 0xFF;
PMD5 = 0xFF;
LATCbits.LATC0 = 0;
//OSCFRQbits.HFFRQ = 5; //HFINTOSCを16MHzに設定
//while (OSCSTATbits.HFOR == 0) continue; // HFINTOSCがReadyか確認
while (1);
//計測中以下には入らない
for (i = 0; i < 10; i++) {
LATCbits.LATC0 = 1; //クロック周波数確認のためのLED点滅
__delay_ms(500);
LATCbits.LATC0 = 0;
__delay_ms(500);
}
}
計測結果

PIC 16F18857 電源電圧、クロック周波数の変化の消費電流への影響
途中が3.5Vではなく3.3Vなのでグラフに若干折れがあります。
データ

電源電圧(Vcc)とクロック周波数の消費電力への影響
室温 30℃ 電流値はmA
なお、PIC 16F18857のデータシート記載のELECTRICAL SPECIFICATIONは現在PRELIMINARY(暫定)ですが、SUPPLY CURRENTに消費電流についての記載があります。Vccが3.0V、PMDn = 0(周辺機能はイネーブル)ということ以外、計測条件の詳細は分かりません。それによると、
HFINTOSC = 16MHz Typ. 1.4mA (実測では1.3mA)
HFINTOSC = 32MHz Typ. 2.6mA (実測では2.3mA)
HS + PLL =32MHz Typ. 2.6mA (実測では2.2mA)
実測ではPMDn = 0xFFですべてディセーブルにしているので、そのぶん少なくなっていると思われます。とすれば実測結果はよく合っています。
実測結果から、
○最も低消費電流はVcc 2.5V LFINTOSC(LF内部発振器) 31KHz 36uA
電源電圧が低く、クロック周波数が低ければ低消費電流
○LFINTOSC 31KHzは最も低消費電力だが、HFINTOSC 1MHzも健闘している
31KHzより1MHzの方が速度面と消費電流の兼ね合いでリーズナブルと言える
○1MHz、8MHz、16MHz、32MHzと周波数相応に消費電流がアップする
とても素直です。
○最も高消費電力はVcc 5.0V EXTOSC HS x4 PLL 32MHz 3.440mA
外部発振器を使用し、x4 PLLを使うと最も高消費電力
ただし4.5Vを境にHFINTOSC32より下回る
○HFINTOSC 32MHzでx2 PLLを使う/使わないはほぼ同じ
つまりx2 PLLは常に動いている?
○同じ8MHzでも、外部発振子と内部発振器では、4.0Vくらいから外部発振子のほうが消費電流が大きくなる
原因は不明。
○内部発振器自体はどんな周波数でも消費電力は一定と思われる
内部発振器の消費電力は発振周波数によって変化しない。
○全体的に見て32MHzは使わないほうがよいと言える。8MHz以下で使うのがよい。
32MHzにすると大幅に消費電流が増えます。アマチュア用途では一般的には8MHz以下で十分では。
以上の結果から、なるべく低消費電流で使いたい場合は、電源電圧を低くし、低クロック周波数で使うことになります。しかし、電源電圧は接続する他のデバイスとの兼ね合いや、バッテリ等で決まってしまうものです。
クロック周波数については、内部発振か外部発振かは周波数精度にかかわります。周波数精度があまり問題にならないのであれば内部発振器が周波数の切り替えも簡単で便利です。周波数のチューニングもできます。PICのクロックシステムは非常に融通が効くようにきめ細かい配慮がされていますので、プログラムの処理内容によって臨機応変にクロックを切り替えて使うこともできます。
ただしCPUデバイスによっては高い周波数で使う場合は高めの電源電圧が必要なものもあるので要注意です。今回の16F18857はVcc 2.5V以上であれば全周波数OKです。
今回とり上げませんでしたがスリープ・モードやDOZEモードもあります。最も低消費電流にするテクニックは、間欠処理に軍配が上がります。間欠処理、つまりなにも処理することが無ければCPUをスリープさせ、割り込みでウェークアップさせるのが最も理想的です。DOZEモードでは割り込み処理だけは高いクロック周波数ですばやく処理できるなど便利な機能もあります。
関連記事:PIC 16F18857のクロック設定と切り替え時間の計測
(JF1VRR)