💬

M5Stackの充電制御IC IP5306のネット上に分散していたレジスタ情報をまとめる

2021/07/20に公開

初めに

M5StackのLiPoの充電制御に使われているIP5306はI2Cで制御できます。バッテリーの充電レベルの取得及び充電電流の制御をしてみるために、ネット上に分散しているレジスタ情報をまとめました。

IP5306について

IP5306は中国の**英集芯科技有限公司(Injoinic Technology, http://www.injoinic.com/)**製のモバイルバッテリー用SoCです。標準品は充電電流2.1A/放電電流2.4A固定となっています。
M5Stackの発売当初は標準品が使用されていましたが、途中からI2Cバス経由で各種パラメータが制御できるカスタム版に変更されています。
標準版のデータシートはメーカーのサイトからダウンロードができます。
http://www.injoinic.com/wwwroot/uploads/files/20200221/0405f23c247a34d3990ae100c8b20a27.pdf

参考資料の入手先

I2C制御ができるカスタム版のレジスタ資料(M5Stackのドキュメントページ)

https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/docs/datasheet/core/IIC_IP5306_REG_V1.4_cn.pdf

I2Cバスの仕様書(NXPから入手)

https://www.nxp.com/docs/ja/user-guide/UM10204.pdf

IP5306CのSlave Addressは0xEAですが、I2CのSlave Addressの0bit目はread/write bitですので、ArduinoIDEやUIFlowからは上位7bit表記の0x75でアクセスします。

その他の資料

カスタム版のレジスタ資料にはバッテリー充電量や充電モードに関するレジスタので記載がないので、ネットで公開されている情報を参考にしました。

バッテリー充電量の取得

http://www.szjuquan.com/news/bencandy.php?&fid=18&id=2091

充電モードの取得

https://github.com/lovyan03/M5Stack_LovyanLauncher/blob/master/LovyanLauncher/src/Header.cpp

IP5306_I2Cのレジスタマップ(日本語版)

赤字の箇所はオリジナルのレジスタ資料には存在しないため追記

SYS_CTL0

resister: 0x00

SYS_CTL1

resister: 0x01

SYS_CTL2

resister: 0x02

Charge_CTL0

resister: 0x20

Charge_CTL1

resister: 0x21

Charge_CTL2

resister: 0x22

Charge_CTL3

resister: 0x23

CHG_DIG_CTL0

resister: 0x24

REG_READ0

resister: 0x70

REG_READ1

resister: 0x71

REG_READ2

resister: 0x72

REG_READ3

resister: 0x77

REG_READ4

resister: 0x78

充電電流の制御方法

LiPoバッテリーの充電電流は、CHG_DIG_CTL0(0x24)の[4:0]に設定値を書き込むことでコントロールできます。
Arduino IDEのM5Stack libraryではPOWERクラスにある
setVinMaxCurrent()関数で充電電流が設定できます。
各ビットの電流値は
Power.cpp
で定義されていますので、これをORして引数で渡してやればOKです。

//- CHG
#define CURRENT_100MA  (0x01 << 0)
#define CURRENT_200MA  (0x01 << 1)
#define CURRENT_400MA  (0x01 << 2)
#define CURRENT_800MA  (0x01 << 3)
#define CURRENT_1600MA  (0x01 << 4)

例えば、M5Stack BASICのボトム(LiPo:110mAh)を使うときは、スケッチのsetup()の最初に以下のように記載してやることで、充電電流オーバーによるLiPoの劣化をある程度防げるはずです。

setup(){
  M5.begin();
  M5.Power.begin();
  M5.Power.setVinMaxCurrent(CURRENT_100MA) ;

まとめ

これでIP5306の情報取得及び設定が一通り可能になります。

Discussion