INA226 Library
Dependents: HYBRYD2018_IZU_ROCKET Hybrid_IZU2019 SWAN_IZU2019_v1 Hybrid_OB2021_MAIN
INA226.cpp@2:eccb118370eb, 2017-07-13 (annotated)
- Committer:
- zebrin1422
- Date:
- Thu Jul 13 08:02:27 2017 +0000
- Revision:
- 2:eccb118370eb
- Parent:
- 1:9c367d227582
- Child:
- 4:6e48af29852f
INA226 Library
Who changed what in which revision?
User | Revision | Line number | New 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 | 0:ad712ebc38d6 | 30 | i2c->write(SLV_WRITE, cmd, 1); |
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, ®, 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,¤t); |
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, ®, 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, ®, 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, ®, 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, ®, 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, ®, 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, ®, 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 | } |