10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2020-10-25

#初めに
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
image.png

##SYS_CTL1
resister: 0x01
image.png

##SYS_CTL2
resister: 0x02
image.png

##Charge_CTL0
resister: 0x20
image.png

##Charge_CTL1
resister: 0x21
image.png

##Charge_CTL2
resister: 0x22
image.png

##Charge_CTL3
resister: 0x23
image.png

##CHG_DIG_CTL0
resister: 0x24
image.png

##REG_READ0
resister: 0x70
image.png

##REG_READ1
resister: 0x71
image.png

##REG_READ2
resister: 0x72
image.png

##REG_READ3
resister: 0x77
image.png

##REG_READ4
resister: 0x78
image.png

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

2022/06/10追記

POWERクラスが変更されて、電流値の定義がライブラリ外から参照できなくなってしまいました。
使用する場合は、スケッチの中で以下の各電流値の定数を定義してください。

Power.cpp
//- 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の劣化をある程度防げるはずです。

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

#まとめ
これでIP5306の情報取得及び設定が一通り可能になります。
UIFlowでの動作確認までは出来ているので、Arduino IDEでも動作確認したらスケッチをgithubにでもアップする予定です。

10
10
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
10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?