INA226 Library

Dependents:   HYBRYD2018_IZU_ROCKET Hybrid_IZU2019 SWAN_IZU2019_v1 Hybrid_OB2021_MAIN

Committer:
zebrin1422
Date:
Mon Jul 17 09:38:13 2017 +0000
Revision:
4:6e48af29852f
Parent:
2:eccb118370eb
Child:
5:76dc889ffe3c
INA226 Library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
zebrin1422 0:ad712ebc38d6 1 #include"mbed.h"
zebrin1422 0:ad712ebc38d6 2 #include"INA226.h"
zebrin1422 0:ad712ebc38d6 3
zebrin1422 0:ad712ebc38d6 4 //Serial pc(USBTX, USBRX); //tx, rx
zebrin1422 0:ad712ebc38d6 5
zebrin1422 0:ad712ebc38d6 6 myINA226::myINA226(I2C &i2cBus){
zebrin1422 0:ad712ebc38d6 7 i2c = &i2cBus;
zebrin1422 0:ad712ebc38d6 8 i2c->frequency(400000);
zebrin1422 0:ad712ebc38d6 9 }
zebrin1422 0:ad712ebc38d6 10
zebrin1422 1:9c367d227582 11 /************
zebrin1422 1:9c367d227582 12 電流を取得したいときに必要
zebrin1422 1:9c367d227582 13 これをセットしないと電流は取れない
zebrin1422 0:ad712ebc38d6 14
zebrin1422 1:9c367d227582 15 @example
zebrin1422 1:9c367d227582 16
zebrin1422 1:9c367d227582 17 float current;
zebrin1422 1:9c367d227582 18
zebrin1422 1:9c367d227582 19 myINA226.set_callibretion();
zebrin1422 1:9c367d227582 20 current = myINA226.get_current();
zebrin1422 1:9c367d227582 21 ************/
zebrin1422 0:ad712ebc38d6 22 void myINA226::set_callibretion(unsigned int val)
zebrin1422 0:ad712ebc38d6 23 {
zebrin1422 0:ad712ebc38d6 24 char reg = cal_reg;
zebrin1422 0:ad712ebc38d6 25 char cmd[3];
zebrin1422 0:ad712ebc38d6 26 cmd[0] = reg;
zebrin1422 0:ad712ebc38d6 27 cmd[1] = static_cast<char>(val>>8 & 0x00FF);
zebrin1422 0:ad712ebc38d6 28 cmd[2] = static_cast<char>(val & 0x00FF);
zebrin1422 0:ad712ebc38d6 29
zebrin1422 4:6e48af29852f 30 i2c->write(SLV_WRITE, cmd, 3);
zebrin1422 0:ad712ebc38d6 31 }
zebrin1422 0:ad712ebc38d6 32
zebrin1422 1:9c367d227582 33 /*************
zebrin1422 1:9c367d227582 34 INA226の接続確認
zebrin1422 1:9c367d227582 35 0が返ってくればOK
zebrin1422 1:9c367d227582 36 1が返ってくればError
zebrin1422 1:9c367d227582 37 *************/
zebrin1422 0:ad712ebc38d6 38 int myINA226::Connection_check()
zebrin1422 0:ad712ebc38d6 39 {
zebrin1422 0:ad712ebc38d6 40 char reg = check_reg;
zebrin1422 1:9c367d227582 41 char check[2];
zebrin1422 0:ad712ebc38d6 42
zebrin1422 0:ad712ebc38d6 43 i2c->write(SLV_WRITE, &reg, 1);
zebrin1422 0:ad712ebc38d6 44 i2c->read(SLV_READ, check, 2);
zebrin1422 0:ad712ebc38d6 45
zebrin1422 2:eccb118370eb 46 if(check[0] == 0x54 && check[1] == 0x49){return 0;}
zebrin1422 2:eccb118370eb 47 else{return 1;}
zebrin1422 0:ad712ebc38d6 48 }
zebrin1422 1:9c367d227582 49 /*************
zebrin1422 1:9c367d227582 50 0x01か,0x02の値、またはその両方の値を
zebrin1422 1:9c367d227582 51 取得するかどうかを決める
zebrin1422 1:9c367d227582 52 i=0のとき、両方の値を取得
zebrin1422 1:9c367d227582 53 i=1のとき、0x02のみ取得
zebrin1422 1:9c367d227582 54 i=2のとき、0x01のみ取得
zebrin1422 1:9c367d227582 55 印加電圧は0x02に入っているので基本的にはi=1
zebrin1422 1:9c367d227582 56 デフォルトでは、両方の値を取得できるようになっている
zebrin1422 1:9c367d227582 57 *************/
zebrin1422 0:ad712ebc38d6 58 void myINA226::setup(int i)
zebrin1422 0:ad712ebc38d6 59 {
zebrin1422 0:ad712ebc38d6 60 char reg = Ctrl_reg;
zebrin1422 0:ad712ebc38d6 61 char cmd[3][3];
zebrin1422 0:ad712ebc38d6 62 int j;
zebrin1422 0:ad712ebc38d6 63
zebrin1422 0:ad712ebc38d6 64 for(j=0;j<3;j++){cmd[j][0]=reg; cmd[j][1]=0x41;}
zebrin1422 0:ad712ebc38d6 65 cmd[0][2]=0xFF;cmd[1][2]=0xFE;cmd[2][2]=0xFD;
zebrin1422 0:ad712ebc38d6 66
zebrin1422 0:ad712ebc38d6 67 i2c->write(SLV_WRITE, cmd[i], 3);
zebrin1422 0:ad712ebc38d6 68 }
zebrin1422 1:9c367d227582 69 /*******************
zebrin1422 1:9c367d227582 70 INA226で測定したいだろう電圧と電流の値を
zebrin1422 1:9c367d227582 71 まとめて取得する
zebrin1422 1:9c367d227582 72 もしsetupでi=2、つまり0x01の値だけを取得するようにしていたら
zebrin1422 1:9c367d227582 73 事前に設定しておかなければならない
zebrin1422 0:ad712ebc38d6 74
zebrin1422 1:9c367d227582 75 @example
zebrin1422 1:9c367d227582 76
zebrin1422 1:9c367d227582 77 float V_bus,current;
zebrin1422 1:9c367d227582 78
zebrin1422 1:9c367d227582 79 myINA226.setup(0) or myINA226.setup(1);
zebrin1422 1:9c367d227582 80 myINA226.get_Voltage_current(&V_bus,&current);
zebrin1422 1:9c367d227582 81 *******************/
zebrin1422 0:ad712ebc38d6 82 void myINA226::get_Voltage_current(float *V_bus, float *current)
zebrin1422 0:ad712ebc38d6 83 {
zebrin1422 0:ad712ebc38d6 84 char reg = V_bus_reg;
zebrin1422 0:ad712ebc38d6 85 char buff[2];
zebrin1422 0:ad712ebc38d6 86 unsigned int val[2];
zebrin1422 0:ad712ebc38d6 87
zebrin1422 1:9c367d227582 88 //setup(0);
zebrin1422 0:ad712ebc38d6 89
zebrin1422 0:ad712ebc38d6 90 i2c->write(SLV_WRITE, &reg, 1);
zebrin1422 0:ad712ebc38d6 91 wait_ms(10);
zebrin1422 0:ad712ebc38d6 92 i2c->read(SLV_READ, buff, 2, false);
zebrin1422 0:ad712ebc38d6 93
zebrin1422 0:ad712ebc38d6 94 val[0] = (unsigned int)buff[0]<<8;
zebrin1422 0:ad712ebc38d6 95 val[1] = (unsigned int)buff[1];
zebrin1422 0:ad712ebc38d6 96
zebrin1422 0:ad712ebc38d6 97 *V_bus = (float)(val[0] | val[1]);
zebrin1422 0:ad712ebc38d6 98 *V_bus = *V_bus*1.25;
zebrin1422 0:ad712ebc38d6 99
zebrin1422 0:ad712ebc38d6 100 reg = current_reg;
zebrin1422 0:ad712ebc38d6 101
zebrin1422 0:ad712ebc38d6 102 i2c->write(SLV_WRITE, &reg, 1);
zebrin1422 0:ad712ebc38d6 103 wait_ms(10);
zebrin1422 0:ad712ebc38d6 104 i2c->read(SLV_READ, buff, 2, false);
zebrin1422 0:ad712ebc38d6 105
zebrin1422 0:ad712ebc38d6 106 val[0] = (unsigned int)buff[0]<<8;
zebrin1422 0:ad712ebc38d6 107 val[1] = (unsigned int)buff[1];
zebrin1422 0:ad712ebc38d6 108
zebrin1422 0:ad712ebc38d6 109 *current = (float)(val[0] | val[1]);
zebrin1422 0:ad712ebc38d6 110 *current = *current;//1.25;
zebrin1422 0:ad712ebc38d6 111 }
zebrin1422 1:9c367d227582 112 /**************
zebrin1422 1:9c367d227582 113 0x01の値を取得
zebrin1422 1:9c367d227582 114 もしsetupでi=1、つまり0x02の値だけを取得するようにしていたら
zebrin1422 1:9c367d227582 115 事前に設定しておかなければならない
zebrin1422 0:ad712ebc38d6 116
zebrin1422 1:9c367d227582 117 @example
zebrin1422 1:9c367d227582 118
zebrin1422 1:9c367d227582 119 float V_shunt;
zebrin1422 1:9c367d227582 120
zebrin1422 1:9c367d227582 121 myINA226.setup(0) or myINA226.setup(2);
zebrin1422 1:9c367d227582 122 V_shunt = myINA226.get_Shunt_voltage();
zebrin1422 1:9c367d227582 123 **************/
zebrin1422 1:9c367d227582 124 float myINA226::get_Shunt_voltage()
zebrin1422 0:ad712ebc38d6 125 {
zebrin1422 0:ad712ebc38d6 126 char reg = V_shunt_reg;
zebrin1422 0:ad712ebc38d6 127 char buff[2];
zebrin1422 0:ad712ebc38d6 128 unsigned int val[2];
zebrin1422 1:9c367d227582 129 float V_shunt;
zebrin1422 0:ad712ebc38d6 130
zebrin1422 1:9c367d227582 131 //setup(2);
zebrin1422 0:ad712ebc38d6 132
zebrin1422 0:ad712ebc38d6 133 i2c->write(SLV_WRITE, &reg, 1);
zebrin1422 0:ad712ebc38d6 134 wait_ms(10);
zebrin1422 0:ad712ebc38d6 135 i2c->read(SLV_READ, buff, 2, false);
zebrin1422 0:ad712ebc38d6 136
zebrin1422 0:ad712ebc38d6 137 val[0] = (unsigned int)buff[0]<<8;
zebrin1422 0:ad712ebc38d6 138 val[1] = (unsigned int)buff[1];
zebrin1422 0:ad712ebc38d6 139
zebrin1422 1:9c367d227582 140 V_shunt = (float)(val[0] | val[1]);
zebrin1422 1:9c367d227582 141 V_shunt = V_shunt*1.25;
zebrin1422 1:9c367d227582 142
zebrin1422 1:9c367d227582 143 return V_shunt;
zebrin1422 0:ad712ebc38d6 144 }
zebrin1422 1:9c367d227582 145 /**************
zebrin1422 1:9c367d227582 146 0x01の値を取得
zebrin1422 1:9c367d227582 147 もしsetupでi=2、つまり0x01の値だけを取得するようにしていたら
zebrin1422 1:9c367d227582 148 事前に設定しておかなければならない
zebrin1422 0:ad712ebc38d6 149
zebrin1422 1:9c367d227582 150 @example
zebrin1422 1:9c367d227582 151
zebrin1422 1:9c367d227582 152 float V_bus;
zebrin1422 1:9c367d227582 153
zebrin1422 1:9c367d227582 154 myINA226.setup(0) or myINA226.setup(1);
zebrin1422 1:9c367d227582 155 V_bus = myINA226.get_Bus_voltage();
zebrin1422 1:9c367d227582 156 **************/
zebrin1422 1:9c367d227582 157 float myINA226::get_Bus_voltage()
zebrin1422 0:ad712ebc38d6 158 {
zebrin1422 0:ad712ebc38d6 159 char reg = V_bus_reg;
zebrin1422 0:ad712ebc38d6 160 char buff[2];
zebrin1422 0:ad712ebc38d6 161 unsigned int val[2];
zebrin1422 1:9c367d227582 162 float V_bus;
zebrin1422 0:ad712ebc38d6 163
zebrin1422 1:9c367d227582 164 //setup(1);
zebrin1422 0:ad712ebc38d6 165
zebrin1422 0:ad712ebc38d6 166 i2c->write(SLV_WRITE, &reg, 1);
zebrin1422 0:ad712ebc38d6 167 wait_ms(10);
zebrin1422 0:ad712ebc38d6 168 i2c->read(SLV_READ, buff, 2, false);
zebrin1422 0:ad712ebc38d6 169
zebrin1422 0:ad712ebc38d6 170 val[0] = (unsigned int)buff[0]<<8;
zebrin1422 0:ad712ebc38d6 171 val[1] = (unsigned int)buff[1];
zebrin1422 0:ad712ebc38d6 172
zebrin1422 1:9c367d227582 173 V_bus = (float)(val[0] | val[1]);
zebrin1422 1:9c367d227582 174 V_bus = V_bus*1.25;
zebrin1422 1:9c367d227582 175
zebrin1422 1:9c367d227582 176 return V_bus;
zebrin1422 0:ad712ebc38d6 177 }
zebrin1422 1:9c367d227582 178 /***********
zebrin1422 1:9c367d227582 179 電流の値を取得
zebrin1422 1:9c367d227582 180 事前にset_callibretionをセットしておかないと
zebrin1422 1:9c367d227582 181 0しか返ってこない
zebrin1422 1:9c367d227582 182 @example
zebrin1422 0:ad712ebc38d6 183
zebrin1422 1:9c367d227582 184 float current;
zebrin1422 1:9c367d227582 185
zebrin1422 1:9c367d227582 186 myINA226.set_callibretion();
zebrin1422 1:9c367d227582 187 current = myINA226.get_current();
zebrin1422 1:9c367d227582 188 ************/
zebrin1422 1:9c367d227582 189 float myINA226::get_current()
zebrin1422 0:ad712ebc38d6 190 {
zebrin1422 0:ad712ebc38d6 191
zebrin1422 0:ad712ebc38d6 192 char reg = current_reg;
zebrin1422 0:ad712ebc38d6 193 char buff[2];
zebrin1422 0:ad712ebc38d6 194 unsigned int val[2];
zebrin1422 1:9c367d227582 195 float current;
zebrin1422 0:ad712ebc38d6 196
zebrin1422 0:ad712ebc38d6 197 i2c->write(SLV_WRITE, &reg, 1);
zebrin1422 0:ad712ebc38d6 198 wait_ms(10);
zebrin1422 0:ad712ebc38d6 199 i2c->read(SLV_READ, buff, 2, false);
zebrin1422 0:ad712ebc38d6 200
zebrin1422 0:ad712ebc38d6 201 val[0] = (unsigned int)buff[0]<<8;
zebrin1422 0:ad712ebc38d6 202 val[1] = (unsigned int)buff[1];
zebrin1422 0:ad712ebc38d6 203
zebrin1422 1:9c367d227582 204 current = (float)(val[0] | val[1]);
zebrin1422 1:9c367d227582 205 current = current;//*1.25;
zebrin1422 1:9c367d227582 206
zebrin1422 1:9c367d227582 207 return current;
zebrin1422 0:ad712ebc38d6 208 }
zebrin1422 1:9c367d227582 209 /***********
zebrin1422 1:9c367d227582 210 電力の値を取得
zebrin1422 1:9c367d227582 211 事前にset_callibretionをセットしておかないと
zebrin1422 1:9c367d227582 212 0しか返ってこない
zebrin1422 1:9c367d227582 213 @example
zebrin1422 1:9c367d227582 214
zebrin1422 1:9c367d227582 215 float power;
zebrin1422 1:9c367d227582 216
zebrin1422 1:9c367d227582 217 myINA226.set_callibretion();
zebrin1422 1:9c367d227582 218 power = myINA226.get_power();
zebrin1422 1:9c367d227582 219 ************/
zebrin1422 1:9c367d227582 220 float myINA226::get_power()
zebrin1422 0:ad712ebc38d6 221 {
zebrin1422 0:ad712ebc38d6 222 char reg = power_reg;
zebrin1422 0:ad712ebc38d6 223 char buff[2];
zebrin1422 0:ad712ebc38d6 224 unsigned int val[2];
zebrin1422 1:9c367d227582 225 float power;
zebrin1422 0:ad712ebc38d6 226
zebrin1422 0:ad712ebc38d6 227 i2c->write(SLV_WRITE, &reg, 1);
zebrin1422 0:ad712ebc38d6 228 wait_ms(10);
zebrin1422 0:ad712ebc38d6 229 i2c->read(SLV_READ, buff, 2, false);
zebrin1422 0:ad712ebc38d6 230
zebrin1422 0:ad712ebc38d6 231 val[0] = (unsigned int)buff[0]<<8;
zebrin1422 0:ad712ebc38d6 232 val[1] = (unsigned int)buff[1];
zebrin1422 0:ad712ebc38d6 233
zebrin1422 1:9c367d227582 234 power = (float)(val[0] | val[1]);
zebrin1422 1:9c367d227582 235
zebrin1422 1:9c367d227582 236 return power;
zebrin1422 0:ad712ebc38d6 237 }