要約
NordicSemiconductor社製PMICのnPM1300を使ってnPM Fuel Gaugeライブラリを動かしてみたところ、メーカ提供のサンプルコードに対して以下の工夫を施す。
- 充電中に
nrf_fuel_gauge_init
を実行してはいけない - 充電完了時には
nrf_fuel_gauge_init
を実行しよう -
nrf_fuel_gauge_process
の実行頻度は1秒毎で良い - Discharge current limitを適切に設定しよう
- BatteryModelは5℃, 25℃, 45℃の3温度でプロファイルしよう
充電中にnrf_fuel_gauge_init
を実行してはいけない
nrf_fuel_gauge_init関数を実行してからバッテリ充電を有効化する。
参考: https://devzone.nordicsemi.com/f/nordic-q-a/116777/understanding-and-improving-state-of-charge-measurement-variability-with-nordic-52840-and-npm1300/512354
例えば、以下のようなコードでBCHGENABLESETレジスタに1をセットすると良い。
fuel_gauge_init(dev2);
mfd_npm1300_reg_write(dev1, 0x03U, 0x04U, 0b1U);
※DeviceTreeでcharging-enable;
が指定されていると、RESET状態から遷移してきた時(ユーザアプリケーション実行時)には既に充電が有効化されてしまっているので、DeviceTreeで充電を有効にしておかないように注意する。
充電完了時にはnrf_fuel_gauge_init
を実行しよう
BCHGCHARGESTATUSレジスタの1bit目(COMPLETEDビット)が立ったら、nrf_fuel_gauge_initを実行すると良い。(将来的にはnPM Fuel Gaugeライブラリ側で実施されるようになるらしい)
参考: https://devzone.nordicsemi.com/f/nordic-q-a/116430/soc-values-after-battery-profiling/510928
COMPLETEDビットは状態が変化するまでラッチされるので、割り込みで実行するかポーリングで行う場合は以下のようなコードを用いて立ち上がりエッジで1回だけ実行する。
static bool flag = false;
uint8_t tmp = 0U;
mfd_npm1300_reg_read(dev1, 0x03U, 0x34U, &tmp);
if (0 != (tmp & 0x1CU)) {
flag = true;
} else if ((true == flag) && (0x03U == tmp)) {
flag = false;
fuel_gauge_init(dev2);
}
nrf_fuel_gauge_process
の実行頻度は1秒毎で良い
バッテリ消費電流が少ない場合は実行頻度を落として、バッテリ残量演算に要する電力を節約できるらしい。
参考: https://devzone.nordicsemi.com/f/nordic-q-a/110576/npm1300-fuel-gauge-update-rate-requirements-for-accuracy-nrf_fuel_gauge_process/487363
Discharge current limitを適切に設定しよう
nPM1300のデータシートにも記述があるとおり、バッテリ電流測定の分解能は電流制限値に依存する。
参考: https://docs.nordicsemi.com/bundle/ps_npm1300/page/keyfeatures_html5.html
バッテリ消費電流が少ないのであれば、例えば、データシートに記載がある200mA (MSB=42, LSB=0)に設定する場合のコード。
mfd_npm1300_reg_write(dev1, 0x03U, 0x0AU, 42U);
mfd_npm1300_reg_write(dev1, 0x03U, 0x0BU, 0b0U);
Charge current limitも併せて設定しておくと良い。
例えば、データシートに記載がある32mA (MSB=8, LSB=0)に設定する場合のコード。
mfd_npm1300_reg_write(dev1, 0x03U, 0x08U, 8U);
mfd_npm1300_reg_write(dev1, 0x03U, 0x09U, 0b0U);
BatteryModelは5℃, 25℃, 45℃の3温度でプロファイルしよう
nPM1300 EK
とnPM Fuel Gauge board
とnPM PowerUP
を用いてバッテリプロファイルを行う際は、必ず、5℃, 25℃, 45℃の3温度で測定してBatteryModelを作成する。
※なお、Nordicからプリセットとして提供されているBatteryModelは5℃, 25℃, 45℃でプロファイルされている。
参考: https://devzone.nordicsemi.com/f/nordic-q-a/114657/temperature-for-battery-profiling-npm1300-using-fuel-gauge/502553
動作確認環境
- toolchains v2.6.2
- nRF Connect SDK v2.6.2 (nRF Fuel Gauge library v0.9.2)
- nPM1300 EK (FirmwareVersion 1.2.4)
- nPM PowerUP v1.3.1