1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Nordic nPM1300でnPM FuelGaugeを使ってみた

Last updated at Posted at 2025-01-22

要約

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 EKnPM Fuel Gauge boardnPM 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
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?