sako_DIYのアイコン画像

PPK2を用いた高精度な電子回路の消費電流測定

sako_DIY 2021年05月23日に作成  (2021年05月23日に更新)
PPK2を用いた高精度な電子回路の消費電流測定

概要

キャプションを入力できます
ここ数年、電子工作界隈にはIoTの流れがきていて、電子回路+ネットワークが簡単に扱える物が沢山増えてきています。

IoT機器において重要な要素の1つとして、省電力であることが挙げられます。
特に、電池で動作するIoT工作だと動作する時間を計算するのに、消費電力がどのぐらいなのか測定して計算する必要があります。
しかし、そういった省電力機器の消費電流測定は、一筋縄で行かないことが多いのです。

なぜIoT機器の消費電流測定が難しいのか

電池駆動のIoT機器の多くは、間欠動作をすることにより、消費電力を抑えている機器が多いです。
1日に1回起動し、あとはスリープして消費電流を抑える。
1時間に1回、1分に1回、10秒に1回......。
機器によって様々ですが、常に一定の消費電流であることのほうが少ないです。
ESP32で5秒毎にwifiスキャンをするプログラム実行時の電流

また、
IoTデバイスの起動時とスリープの消費電流は、大幅に違います。
ESP32を例に取ると、上の写真を見れば分かる通り、
起動時に突入電流が、約1A近く流れ、その後、100mA~400mAで位置していますが、
deepsleep機能を用いてスリープさせると、なんと約10μA程度まで抑えることができます。

もっと省電力向きなマイコンだと数百nAレベルまで抑えられるそうです。
駆動時とスリープ時の電流の差が、1000倍以上なんてことはザラです。

短時間で、1000倍以上レンジの変化する電流の測定は、一般的な電流計(テスター等)だと不可能に近いです。
ほか選択肢として、オシロスコープが挙げられますが、高いですよねオシロスコープ。ほしいです(小声)

そんなときにはPPK2(パワープロファイラキットII)を使おう

PPK2とはNordic Semiconductor社の販売している、動的消費電力の計測を目的としたハードウェアです。
https://www.nordicsemi.com/Software-and-tools/Development-Tools/Power-Profiler-Kit-2

ここに動画が表示されます

Nordic Semiconductor社は、超低電力(ULP) ワイヤレスチップを製造販売している会社で、有名なものとしてBLEマイコンのnRFシリーズがあります。
最近発売されたApple AirTagやMAMORIO等にそのnRFシリーズが使われているそうです。

PPK2の特徴は以下のとおりです。引用元(https://www.mouser.jp/new/nordic-semiconductor/nordic-power-profiler-kit-2/)

・カスタムボードに加えてすべてのNordic DKで瞬時および平均電流を計測
・0.8V~5.0V (ソフトウェア構成式)の可変電源電圧範囲
・最大1A電流計測
・最小200nAまでの正確な測定
・最小0.2µAの分解能
・100kS/sサンプリング速度
・最適な分解能を確実にする5通りの電流計測範囲の間での自動スイッチング
・±20%より優れた測定精度(平均電流計測)
・他のアプリケーションへのシンプルな移植が可能になるUSB通信
・計測解析のためのデスクトップ・アプリケーション
・リアルタイム電流計測ディスプレイ
・ローエンド・ロジック・アナライザ・サポート用の8つのデジタル入力
・デスクトップのパワープロファイラ・アプリ用のnRF Connectを介したサポート
・後処理を目的とした計測データのエクスポート

まとめると、IoT機器のダイナミックに変化する電流の測定に対応、リアルタイムで確認でき、電源供給もでき、計測データのログを取りエクスポート
さらに、8つのデジタル入力簡易ロジアナ付き。

至れり尽せりっていう感じですね。

値段及び入手先

これだけの機能がついていて、値段は約10,000円です。
安いと思うか高いと思うかは、人それぞれだと思いますが、少なくとも私はお買い得だと感じました。

私はdigikeyで購入しました、ほかにもMouserでも扱っているようです。
digikey
mouser

たまたま在庫切れのタイミングで注文してしまい、約1ヶ月待たされました。

ハード

ハードは以下の写真のとおりです。
キャプションを入力できます

1 .USB電源専用入力
 電源入力用のUSB端子です。
 接続しなくても動きますが、後述するソースメーターモード(PPK2から電源供給)で400mA以上使用する場合は、接続することが望ましいです。
2. 電源SW
 PPK2の電源SWです。
3.USBデーター/電源入力
 PPK2とPCとの通信用ポート
4.電流測定用端子類
 GND:グランド
 VIN:外部電源入力(電流計モードのみで使用)
 VOUT:電源出力端子
5.デジタル入力ピン
 8入力のデジタル入力ピン、簡易ロジアナとして使える。

ソフトウェア

PPK2はPCに接続して使用します。
その際に使用するソフトは、Nordic Semiconductor社の開発ツールソフトnRFConnectに含まれている、Power Profilerというアプリケーションを使用します。

ダウンロード先
nRF Connect for Desktop
https://www.nordicsemi.com/Software-and-tools/Development-Tools/nRF-Connect-for-desktop#infotabs

キャプションを入力できます

インストール後起動し、Power Profilerをinstallしましょう。
インストールするとOpenが押せるようになります。
キャプションを入力できます
ここでPPK2をPCに接続すると左上SELECT DEVICEから選べるようになります。
キャプションを入力できます

データロガーモードのみ軽く解説します。

1.MODE選択
 Souce meter/Ampere meter: ソースメーターモードと電流計モードの選択
  ソースメーターモードは、PPK2のVOUTから電源を供給します。供給した電流を測定できます。
  電流計モードは、測定したい回路にPPK2のVIN-VOUTを直列につなぐことで電流計として使用できます。

Set supply voltage : ソースメーターモードにて供給する電圧を指定します。(0.8V~5V)
 Enable power output : ソースメーターモードにて、電源出力のON/OFFができます。

2.サンプリングパラメーター設定
 データーロガーモードのパラメータ設定です。

XXXXXX samlpes per second: 1秒間に測定する回数を指定できます。1回/秒~最大10万回/秒 まで指定できます。
 samlpes for XXX seconds: ログを取る最大時間を指定します。
 上記2つの設定によりログのデータ容量が計算され表示されています。

3.スタート
 押すと測定がスタートします。

4.Display Options
 右のグラフへの表示オプション設定です。
 Timestamp: 右の測定グラフにタイムスタンプが表示されます。
 Digital channels: PPK2のデジタル入力端子の情報を表示するかの設定です。

5.Save Export/Screenshot
 Save Export: ロギングしたデータをCSV等で保存できます。
 Screenshot: グラフ部分のスクリーンショットが撮れます。

6.DATALOGGER/REAL-TIME/ABOUT
 DATALOGGER: データロガーモード、測定した電流をロギングできます。
 REAL-TIME: リアルタイムモードにすると、測定データーがリアルタイムで表示されます。オシロスコープのように使用できます。
 ABOUT: ソフトウェアバージョンや、PPK2の情報が見れます。

7.グラフ
 LOCK Y-AXIS: 縦軸を固定できます。大きく電流変化する場合は、固定したほうが見やすいです。
 10ms/100ms/1s/3s/10s/1min: 横軸の時間を変更できます。
 LIVE VIEW: OFFにするとグラフの描画更新を止める事ができます。
 電流グラフ: マウスドラッグで移動、マウスホイールで拡大縮小できます。
 WINDOW: グラフに表示されている領域の平均電流、最大電流、時間、充電量(電流✕時間)が表示されます。
 SELECTION: SHIFTを押しながらマウスドラッグで選択した領域の平均電流、最大電流、時間、充電量(電流✕時間)が表示されます。

8.デジタル入力
 PPK2のデジタルに入力されたデジタル信号が表示できます。
 表示するポートは、DIsplay Optionsで変更できます。

8.ログ出力
 ログが表示されます。

Arduino (Nano)の消費電流を測定してみる

ATMEGA-328Pの搭載された5V仕様のArduino NanoにサンプルスケッチのBlinkを書き込んで測定してみます。
接続は以下の通り、ソースメーターモードで測定するため、VOUTとArduinoのVIN、LOGICPORTのD0をArduinoD13ピンに接続します。
キャプションを入力できます

Lチカ

#define LED_PIN 13 void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); delay(1000); digitalWrite(LED_PIN, LOW); delay(1000); }

Power Profilerの設定は、
・ソースメーターモード(5V)
・100000 samples per second
・Digitalcannels を0のみ表示
に設定しました。

PPK2で測定した結果は以下の通りです。
キャプションを入力できます
起動後1秒毎に電流が変化する様子が確認できると思います。
また下部のデジタル入力表示もそれに合わせて変化しています。
次にLチカ部を拡大2周期分選択してみます。
キャプションを入力できます
LED ON時の消費電流が約17mA
LED OFF時の消費電流が約14.5mA
平均して15.53mAであることが確認できます。

もし5V 2000mAhのバッテリーが存在して、このシステムを動作させた場合
2000[mAh]/15.53[mA]=128.78[h]=5.37[day]
ということで、約5日弱動作すると概算できました。
実際は、使用するバッテリーの時間率、電圧変化を考慮する必要があるため、この計算通りにはなりません

RaspberryPi picoの消費電流を測定してみる

Raspberripi pi picoを使用しCircuitPythonで内蔵LEDのLチカさせての電流を測定してみます。
接続は以下の通りです。VOUTからPICOのVSYSへ、GP25はピンアウトされていないようなので、LOGICPORTは未接続です。
キャプションを入力できます

Lチカ(CircuitPython)

from machine import Pin import time while True: led = Pin(25, Pin.OUT) led.value(1) time.sleep(1) led.value(0) time.sleep(1)

Power Profilerの設定は、
・ソースメーターモード(5V)
・100 samples per second
・Digitalcannels 非表示
に設定しました。

PPK2で測定した結果は以下の通りです。
キャプションを入力できます
拡大すると、

キャプションを入力できます
LED ON時の消費電流が約21.5mA
LED OFF時の消費電流が約20.5mA
平均して20.89mAであることが確認できます。

ESP32の消費電流を測定してみる

ESP32(ESPr® Developer 32)では3パターン測定してみようと思います。
・ただのLチカ
・待ち時間にdeepsleepしてLチカ
・deepsleepしたままulp(コプロセッサ)でLチカ

回路は3パターンとも同じで以下のとおりです。VOUTは3V3端子に、内蔵LEDがないため、D13にLEDを接続しています。
fritzingライブラリをお借りしました。DEKOのアヤシいお部屋。
キャプションを入力できます

Power Profilerの設定は、
・ソースメーターモード(3.3V)
・100 samples per second
・Digitalcannels D0のみ表示
に設定しました。

1. まずただのLチカ

Lチカ

#define LED_PIN 13 void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); delay(1000); digitalWrite(LED_PIN, LOW); delay(1000); }

測定結果は以下の通り、
キャプションを入力できます
平均電流は38.83mAとなりました。

2. 1秒間待つ間deepsleepするLチカ。

Lチカ(deepsleep

#include "driver/rtc_io.h" #include "esp_deep_sleep.h" RTC_DATA_ATTR int bootCount = 0; void setup() { bootCount++; rtc_gpio_init(GPIO_NUM_13); rtc_gpio_set_direction(pin_led,RTC_GPIO_MODE_OUTPUT_ONLY); if( bootCount% 2){ rtc_gpio_set_level(pin_led,0); }else{ rtc_gpio_set_level(pin_led,1); } esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON); esp_sleep_enable_timer_wakeup(1000000); esp_deep_sleep_start(); } void loop() { }

測定結果は以下の通り、
キャプションを入力できます
プログラムの仕様上約1.1秒ごとのLチカになってしまいましたが、
平均電流は6.07mAとなりました。

3. deepsleepしたままulp(コプロセッサ)でLチカ
以下のプログラムを参考にさせていただきました。
Lang-ship ESP32でULPを使ったBlink その2と逆アセンブラ (https://lang-ship.com/blog/work/esp32-ulp-blink-2/)
github ESP32 ULP Debugger(https://github.com/tanakamasayuki/UlpDebug)
プログラムの内容は一切、理解ができておりません。ご了承ください。

Lチカの例

#include "esp32/ulp.h" #include "driver/rtc_io.h" // Slow memory variable assignment enum { SLOW_BLINK_STATE, // Blink status SLOW_PROG_ADDR // Program start address }; void ULP_BLINK(uint32_t us) { // Set ULP activation interval ulp_set_wakeup_period(0, us); // Slow memory initialization memset(RTC_SLOW_MEM, 0, 8192); // Blink status initialization RTC_SLOW_MEM[SLOW_BLINK_STATE] = 0; // PIN to blink (specify by +14) const int pin_blink_bit = RTCIO_GPIO13_CHANNEL + 14; const gpio_num_t pin_blink = GPIO_NUM_13; // GPIO26 initialization (set to output and initial value is 0) rtc_gpio_init(pin_blink); rtc_gpio_set_direction(pin_blink, RTC_GPIO_MODE_OUTPUT_ONLY); rtc_gpio_set_level(pin_blink, 0); // ULP Program const ulp_insn_t ulp_prog[] = { I_MOVI(R3, SLOW_BLINK_STATE), // R3 = SLOW_BLINK_STATE I_LD(R0, R3, 0), // R0 = RTC_SLOW_MEM[R3(SLOW_BLINK_STATE)] M_BL(1, 1), // IF R0 < 1 THAN GOTO M_LABEL(1) // R0 => 1 : run I_WR_REG(RTC_GPIO_OUT_REG, pin_blink_bit, pin_blink_bit, 1), // pin_blink_bit = 1 I_MOVI(R0, 0), // R0 = 0 I_ST(R0, R3, 0), // RTC_SLOW_MEM[R3(SLOW_BLINK_STATE)] = R0 M_BX(2), // GOTO M_LABEL(2) // R0 < 1 : run M_LABEL(1), // M_LABEL(1) I_WR_REG(RTC_GPIO_OUT_REG, pin_blink_bit, pin_blink_bit, 0),// pin_blink_bit = 0 I_MOVI(R0, 1), // R0 = 1 I_ST(R0, R3, 0), // RTC_SLOW_MEM[R3(SLOW_BLINK_STATE)] = R0 M_LABEL(2), // M_LABEL(2) I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_DELAY(60000), I_HALT() // Stop the program }; // Run the program shifted backward by the number of variables size_t size = sizeof(ulp_prog) / sizeof(ulp_insn_t); ulp_process_macros_and_load(SLOW_PROG_ADDR, ulp_prog, &size); ulp_run(SLOW_PROG_ADDR); } void setup() { ULP_BLINK(1000000); esp_sleep_enable_timer_wakeup(60 * 1000 * 1000); // wakeup(restart) after 10secs esp_deep_sleep_start(); } void loop() { }

測定した結果が以下のとおりです。
キャプションを入力できます
平均0.5mA(514μA)まで抑えることができました。

最後に

実際に購入して使ってみて、計測可能な電流が1Aまでというのが多少ネックになると思っていましたが、省電力デバイスに限っての使用では十分な機能でした。
特に、ソースメーターモードで0.8V~5Vを自由に可変できる機能が、3.3V系マイコン、5V系マイコン両方で使用できる為とても便利に感じました。

自分の作ったデバイスの詳細な消費電流を知りたい方は、ぜひ使ってみてはいかがでしょうか。
本投稿の情報の利用、内容によって、利用者にいかなる損害、被害が生じても、著者は一切の責任を負いません。ユーザーご自身の責任においてご利用いただきますようお願いいたします。

1
sako_DIY さんが 2021/05/23 に 編集 をしました。 (メッセージ: 初版)
sako_DIY さんが 2021/05/23 に 編集 をしました。
sako_DIY さんが 2021/05/23 に 編集 をしました。 (メッセージ: ulpでのLチカについて追記しました。)
ログインしてコメントを投稿する