M5Stackの充電制御IC IP5306のネット上に分散していたレジスタ情報をまとめる
初めに
M5StackのLiPoの充電制御に使われているIP5306はI2Cで制御できます。バッテリーの充電レベルの取得及び充電電流の制御をしてみるために、ネット上に分散しているレジスタ情報をまとめました。
IP5306について
IP5306は中国の**英集芯科技有限公司(Injoinic Technology, http://www.injoinic.com/)**製のモバイルバッテリー用SoCです。標準品は充電電流2.1A/放電電流2.4A固定となっています。
M5Stackの発売当初は標準品が使用されていましたが、途中からI2Cバス経由で各種パラメータが制御できるカスタム版に変更されています。
標準版のデータシートはメーカーのサイトからダウンロードができます。
参考資料の入手先
I2C制御ができるカスタム版のレジスタ資料(M5Stackのドキュメントページ)
I2Cバスの仕様書(NXPから入手)
IP5306CのSlave Addressは0xEAですが、I2CのSlave Addressの0bit目はread/write bitですので、ArduinoIDEやUIFlowからは上位7bit表記の0x75でアクセスします。
その他の資料
カスタム版のレジスタ資料にはバッテリー充電量や充電モードに関するレジスタので記載がないので、ネットで公開されている情報を参考にしました。
バッテリー充電量の取得
充電モードの取得
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