INA226 Library

Dependents:   HYBRYD2018_IZU_ROCKET Hybrid_IZU2019 SWAN_IZU2019_v1 Hybrid_OB2021_MAIN

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