Measure resistance with INA226

Dependencies:   INA226 TextLCD mbed

Fork of INA226TEST by Toshihisa T

Committer:
Naoto_111
Date:
Sun May 15 01:51:55 2016 +0000
Revision:
4:04014356c355
Parent:
3:1bd37786be90
serialmode???

Who changed what in which revision?

UserRevisionLine numberNew contents of line
oteki 2:d3723c3e869b 1 /*前バージョンからの変更点
Naoto_111 4:04014356c355 2 ・シリアル通信モードでもオフセットの初期値を取得するように変更
Naoto_111 4:04014356c355 3 ・シリアル通信モードで最初に送られるデータが(0.0, 0.0, 0,0)だったのを、
Naoto_111 4:04014356c355 4 センサから取得した値を送るように変更
oteki 2:d3723c3e869b 5 */
oteki 2:d3723c3e869b 6 #include "mbed.h"
oteki 2:d3723c3e869b 7 #include "TextLCD.h"
oteki 2:d3723c3e869b 8 #include "INA226.hpp"
oteki 2:d3723c3e869b 9 //#include "limits.h"
tosihisa 0:b20f8673a7fa 10
oteki 2:d3723c3e869b 11 #define VCC 3.3//抵抗R1に供給する電圧[V]
oteki 2:d3723c3e869b 12 #define R1 10000.0//抵抗R1の値[Ω]
oteki 2:d3723c3e869b 13 #define GAUGE_STEP 17//テキストディスプレイモード:ゲージの段階数
oteki 2:d3723c3e869b 14 #define GAUGE_MAX 100.0//テキストディスプレイモード:ゲージ最大状態の値[Ω]
oteki 2:d3723c3e869b 15 #define GAUGE_NOTIFY 50.0//テキストディスプレイモード:音を鳴らし始める値[Ω]
oteki 2:d3723c3e869b 16 #define INTERVAL_SERIAL 0.5//シリアル通信モード:データを収集する間隔[秒]
oteki 2:d3723c3e869b 17 #define INTERVAL_TEXTLCD 0.1//テキストディスプレイモード:データを収集する間隔[秒]
oteki 2:d3723c3e869b 18 #define SAMPLES 10//一回の測定で取得するデータの数(これらのデータの平均を使用)
tosihisa 0:b20f8673a7fa 19
oteki 2:d3723c3e869b 20 Serial pc(USBTX,USBRX);//tx,rx :シリアル通信
oteki 2:d3723c3e869b 21 TextLCD dsp_t(p24, p23, p22, p19, p21, p20);// rs, e, d4-d7 :テキストディスプレイ
oteki 2:d3723c3e869b 22 //LocalFileSystem local("local");//内部ストレージ
oteki 2:d3723c3e869b 23 AnalogIn sensor(p18);
oteki 2:d3723c3e869b 24 InterruptIn setoffset(p17);//テキストディスプレイモード:オフセット設定
oteki 2:d3723c3e869b 25 InterruptIn mode(p16);//テキストディスプレイモード:ゲージ←→数値詳細 切替
oteki 2:d3723c3e869b 26 PwmOut speaker(p25);
oteki 2:d3723c3e869b 27 //Timer tim;
oteki 2:d3723c3e869b 28 DigitalOut led[] = {LED1, LED2};
tosihisa 0:b20f8673a7fa 29 I2C i2c(p28,p27);
tosihisa 0:b20f8673a7fa 30 INA226 VCmonitor(i2c);
tosihisa 0:b20f8673a7fa 31
oteki 2:d3723c3e869b 32 float resistance, offset;
oteki 2:d3723c3e869b 33 bool detailmode = false;
oteki 2:d3723c3e869b 34 volatile bool serialmode = false;
oteki 2:d3723c3e869b 35
oteki 2:d3723c3e869b 36 void gaugeOffset();//ゲージのオフセットを設定
oteki 2:d3723c3e869b 37 void changeMode();//ゲージモードと測定値の詳細表示の切り替え
oteki 2:d3723c3e869b 38 void isrRx();//受信イベント
tosihisa 0:b20f8673a7fa 39
oteki 2:d3723c3e869b 40 unsigned short val;
oteki 2:d3723c3e869b 41 double V,C;
oteki 2:d3723c3e869b 42 int count = 1;
tosihisa 0:b20f8673a7fa 43
oteki 2:d3723c3e869b 44 int main()
oteki 2:d3723c3e869b 45 {
oteki 2:d3723c3e869b 46 pc.baud(115200);
oteki 2:d3723c3e869b 47 VCmonitor.rawWrite(0x00,0x4EDF);
Naoto_111 4:04014356c355 48 if(!VCmonitor.isExist()) {
oteki 2:d3723c3e869b 49 pc.printf("VCmonitor NOT FOUND\r\n");
Naoto_111 4:04014356c355 50 while(1) {}
tosihisa 0:b20f8673a7fa 51 }
oteki 2:d3723c3e869b 52 pc.printf("VCmonitor FOUND\r\n");
tosihisa 0:b20f8673a7fa 53
tosihisa 0:b20f8673a7fa 54 val = 0;
Naoto_111 4:04014356c355 55 if(VCmonitor.rawRead(0x00,&val) != 0) {
oteki 2:d3723c3e869b 56 pc.printf("VCmonitor READ ERROR\r\n");
Naoto_111 4:04014356c355 57 while(1) {}
tosihisa 0:b20f8673a7fa 58 }
oteki 2:d3723c3e869b 59 pc.printf("VCmonitor Reg 0x00 : 0x%04x\r\n",val);
oteki 2:d3723c3e869b 60
oteki 2:d3723c3e869b 61 VCmonitor.setCurrentCalibration(0x0800);
oteki 2:d3723c3e869b 62 /*tim.start();
oteki 2:d3723c3e869b 63 led[0] = led[1] = 1;
oteki 2:d3723c3e869b 64
oteki 2:d3723c3e869b 65 while(serialmode == false && tim.read() < SERIAL_WAIT) {
oteki 2:d3723c3e869b 66 if(pc.readable()) {//通信相手からデータが送られてきた時
oteki 2:d3723c3e869b 67 serialmode = true;
oteki 2:d3723c3e869b 68 break;
oteki 2:d3723c3e869b 69 }
oteki 2:d3723c3e869b 70 wait(0.5);
oteki 2:d3723c3e869b 71 }
tosihisa 0:b20f8673a7fa 72
Naoto_111 4:04014356c355 73 led[0] = led[1] = */
Naoto_111 4:04014356c355 74 resistance = offset = 0;
Naoto_111 4:04014356c355 75 if((VCmonitor.getVoltage(&V) == 0) && (VCmonitor.getCurrent(&C) == 0))
Naoto_111 4:04014356c355 76 offset = (float) 10*V/C;
oteki 2:d3723c3e869b 77 //tim.stop();
oteki 2:d3723c3e869b 78 //FILE *fp = NULL;
oteki 2:d3723c3e869b 79 pc.attach(isrRx,Serial::RxIrq);//割り込みハンドラ登録
oteki 2:d3723c3e869b 80 BUNKI:
oteki 2:d3723c3e869b 81 if(serialmode == true) {//シリアル通信モード
oteki 2:d3723c3e869b 82 led[0] = 0;
oteki 2:d3723c3e869b 83 led[1] = 1;
oteki 2:d3723c3e869b 84 //if(fp!=NULL)fclose(fp);
oteki 2:d3723c3e869b 85 dsp_t.cls();
oteki 2:d3723c3e869b 86 dsp_t.printf("Serial mode");
Naoto_111 4:04014356c355 87
Naoto_111 4:04014356c355 88 float voltage = 0;
Naoto_111 4:04014356c355 89 for(int i = 0; i < SAMPLES; i++)voltage += sensor.read();
Naoto_111 4:04014356c355 90 voltage = voltage * 3.3 / SAMPLES;
Naoto_111 4:04014356c355 91 resistance = R1 / (VCC / voltage - 1);
Naoto_111 4:04014356c355 92 pc.printf("%f,%f,%f\n", voltage, resistance, offset);
Naoto_111 4:04014356c355 93 //pc.printf("%f,%f,%f\n", 0.0, 0.0, 0.0);
Naoto_111 4:04014356c355 94
Naoto_111 4:04014356c355 95 while(1)if(serialmode == false)goto BUNKI;
oteki 2:d3723c3e869b 96 } else {//テキストディスプレイモード
Naoto_111 4:04014356c355 97
oteki 2:d3723c3e869b 98 float t = 1.0/261.626;//「ド」の音(C4)の周期
oteki 2:d3723c3e869b 99 float a = (t-(t/2/2))/GAUGE_MAX;//C4の周期と2オクターブ上の音の周期の差を(GAUGE_MAX)分割
tosihisa 0:b20f8673a7fa 100
oteki 2:d3723c3e869b 101 led[0] = 1;
oteki 2:d3723c3e869b 102 led[1] = 0;
Naoto_111 4:04014356c355 103
oteki 2:d3723c3e869b 104 //offset = R1 / (VCC / (sensor.read() * 3.3)- 1);//オフセット初期値の取得
oteki 2:d3723c3e869b 105 speaker = 0.0;
oteki 2:d3723c3e869b 106
oteki 2:d3723c3e869b 107 speaker.period(0.001);
oteki 2:d3723c3e869b 108 //tim.reset();
oteki 2:d3723c3e869b 109 //tim.start();
oteki 2:d3723c3e869b 110 setoffset.rise(&gaugeOffset);//割り込みハンドラ登録
oteki 2:d3723c3e869b 111 mode.rise(&changeMode);//割り込みハンドラ登録
oteki 2:d3723c3e869b 112
Naoto_111 4:04014356c355 113 /*
Naoto_111 4:04014356c355 114 if((fp = fopen("/local/data.txt", "r")) != NULL) { //data.txtの検出
Naoto_111 4:04014356c355 115 if(fgetc(fp)!=EOF) {
Naoto_111 4:04014356c355 116 dsp_t.printf("Err:data exists\nPlease move it.");
Naoto_111 4:04014356c355 117 return EXIT_FAILURE;
Naoto_111 4:04014356c355 118 }
Naoto_111 4:04014356c355 119 fclose(fp);
Naoto_111 4:04014356c355 120 }
Naoto_111 4:04014356c355 121 */
oteki 2:d3723c3e869b 122 while(1) {
oteki 2:d3723c3e869b 123 if(serialmode == true)goto BUNKI;
oteki 2:d3723c3e869b 124 /*
oteki 2:d3723c3e869b 125 static unsigned long long int time_sum = 0;
oteki 2:d3723c3e869b 126 int now = tim.read_ms();
oteki 2:d3723c3e869b 127 if(now > 1800000) {
oteki 2:d3723c3e869b 128 time_sum += now;
oteki 2:d3723c3e869b 129 tim.reset();
oteki 2:d3723c3e869b 130 }
oteki 2:d3723c3e869b 131 if(time_sum > ULLONG_MAX - 10000000) {
oteki 2:d3723c3e869b 132 printf("Err:time out\nPlease restart now.");
oteki 2:d3723c3e869b 133 return EXIT_FAILURE;
oteki 2:d3723c3e869b 134 }*/
oteki 2:d3723c3e869b 135 float voltage = 0.0;
oteki 2:d3723c3e869b 136 for(int i = 0; i < SAMPLES; i++)voltage += sensor.read();
oteki 3:1bd37786be90 137 //voltage = voltage * 3.3 / SAMPLES;
oteki 3:1bd37786be90 138 //resistance = R1 / (VCC / voltage - 1);
oteki 2:d3723c3e869b 139 //if((fp = fopen("/local/data.txt", "a")) == NULL)return EXIT_FAILURE;
oteki 2:d3723c3e869b 140 //fprintf(fp, "%lld %f %f %f\r\n", now + time_sum, voltage, resistance, offset);
oteki 2:d3723c3e869b 141 //fclose(fp);
Naoto_111 4:04014356c355 142 if((VCmonitor.getVoltage(&V) == 0) && (VCmonitor.getCurrent(&C) == 0)) {
oteki 2:d3723c3e869b 143 voltage = V/1000;
oteki 2:d3723c3e869b 144 resistance = 10*V/C;
oteki 2:d3723c3e869b 145 }
oteki 2:d3723c3e869b 146 dsp_t.cls();
oteki 2:d3723c3e869b 147 if(detailmode == false) {
oteki 2:d3723c3e869b 148 for(int i = 0; i < (int)((resistance - offset) / (GAUGE_MAX / GAUGE_STEP)) && i < GAUGE_STEP; i++)
oteki 2:d3723c3e869b 149 dsp_t.printf("%c", 0xFF);//ゲージ
oteki 2:d3723c3e869b 150
oteki 2:d3723c3e869b 151 dsp_t.locate(0, 1);
oteki 2:d3723c3e869b 152
oteki 2:d3723c3e869b 153 if(resistance>=1000000000)dsp_t.printf("R=%3.0fG%c", resistance/1000000000,0xF4);
oteki 2:d3723c3e869b 154 else if(resistance>=1000000)dsp_t.printf("R=%3.0fM%c", resistance/1000000,0xF4);
oteki 2:d3723c3e869b 155 else if(resistance>=1000)dsp_t.printf("R=%3.0fk%c", resistance/1000,0xF4);
oteki 2:d3723c3e869b 156 else dsp_t.printf("R=%4.0f%c", resistance,0xF4);
oteki 2:d3723c3e869b 157
oteki 2:d3723c3e869b 158 if(offset>=1000000000)dsp_t.printf(" O=%3.0fG%c", offset/1000000000,0xF4);
oteki 2:d3723c3e869b 159 else if(offset>=1000000)dsp_t.printf(" O=%3.0fM%c", offset/1000000,0xF4);
oteki 2:d3723c3e869b 160 else if(offset>=1000)dsp_t.printf(" O=%3.0fk%c", offset/1000,0xF4);
oteki 2:d3723c3e869b 161 else dsp_t.printf(" O=%4.0f%c", offset,0xF4);
oteki 2:d3723c3e869b 162 } else {
oteki 2:d3723c3e869b 163 if(resistance>=1000000000)dsp_t.printf("R=%11.7f G%c", resistance/1000000000,0xF4);
oteki 2:d3723c3e869b 164 else if(resistance>=1000000)dsp_t.printf("R=%11.7f M%c", resistance/1000000,0xF4);
oteki 2:d3723c3e869b 165 else if(resistance>=1000)dsp_t.printf("R=%11.7f k%c", resistance/1000,0xF4);
oteki 2:d3723c3e869b 166 else dsp_t.printf("R=%11.7f %c", resistance,0xF4);
oteki 2:d3723c3e869b 167
oteki 2:d3723c3e869b 168 dsp_t.locate(0, 1);
oteki 2:d3723c3e869b 169
oteki 2:d3723c3e869b 170 if(offset>=1000000000)dsp_t.printf("O=%11.7f G%c", offset/1000000000,0xF4);
oteki 2:d3723c3e869b 171 else if(offset>=1000000)dsp_t.printf("O=%11.7f M%c", offset/1000000,0xF4);
oteki 2:d3723c3e869b 172 else if(offset>=1000)dsp_t.printf("O=%11.7f k%c", offset/1000,0xF4);
oteki 2:d3723c3e869b 173 else dsp_t.printf("O=%11.7f %c", offset,0xF4);
oteki 2:d3723c3e869b 174 }
oteki 2:d3723c3e869b 175
oteki 2:d3723c3e869b 176 speaker = 0.5;
oteki 2:d3723c3e869b 177 if(resistance - offset >= GAUGE_NOTIFY)speaker.period(t-a*(resistance - offset));
oteki 2:d3723c3e869b 178 else speaker = 0.0;
oteki 2:d3723c3e869b 179 wait(INTERVAL_TEXTLCD);
oteki 2:d3723c3e869b 180 }
tosihisa 0:b20f8673a7fa 181 }
tosihisa 0:b20f8673a7fa 182 }
oteki 2:d3723c3e869b 183
oteki 2:d3723c3e869b 184 void gaugeOffset()
oteki 2:d3723c3e869b 185 {
oteki 2:d3723c3e869b 186 speaker.period(0.01);
oteki 2:d3723c3e869b 187 speaker = 0.5;
oteki 2:d3723c3e869b 188 if(detailmode == false) {
oteki 2:d3723c3e869b 189 dsp_t.locate(0, 0);
oteki 2:d3723c3e869b 190 dsp_t.printf("################");
oteki 2:d3723c3e869b 191 }
oteki 2:d3723c3e869b 192 offset = resistance;
oteki 2:d3723c3e869b 193 wait(0.5);
oteki 2:d3723c3e869b 194 dsp_t.cls();
oteki 2:d3723c3e869b 195 speaker = 0.0;
oteki 2:d3723c3e869b 196 //speaker.period(0.001);
oteki 2:d3723c3e869b 197 }
oteki 2:d3723c3e869b 198
oteki 2:d3723c3e869b 199 void changeMode()
oteki 2:d3723c3e869b 200 {
oteki 2:d3723c3e869b 201 detailmode = (detailmode == false) ? true : false;
oteki 2:d3723c3e869b 202 }
oteki 2:d3723c3e869b 203
oteki 2:d3723c3e869b 204
oteki 2:d3723c3e869b 205 void isrRx()
oteki 2:d3723c3e869b 206 {
Naoto_111 4:04014356c355 207 if(serialmode == false) {
oteki 2:d3723c3e869b 208 serialmode=true;
oteki 2:d3723c3e869b 209 return;
oteki 2:d3723c3e869b 210 }
oteki 2:d3723c3e869b 211 char ch;
oteki 2:d3723c3e869b 212 //static float resistance = 0, offset = 0;
oteki 2:d3723c3e869b 213 ch = pc.getc();
oteki 2:d3723c3e869b 214
oteki 2:d3723c3e869b 215 switch(ch) {
oteki 2:d3723c3e869b 216
oteki 2:d3723c3e869b 217 case 'c'://continue
oteki 2:d3723c3e869b 218 float voltage = 0;
Naoto_111 4:04014356c355 219
oteki 3:1bd37786be90 220 for(int i = 0; i < SAMPLES; i++)voltage += sensor.read();
oteki 3:1bd37786be90 221 voltage = voltage * 3.3 / SAMPLES;
oteki 3:1bd37786be90 222 resistance = R1 / (VCC / voltage - 1);
Naoto_111 4:04014356c355 223 if((VCmonitor.getVoltage(&V) == 0) && (VCmonitor.getCurrent(&C) == 0)) {
oteki 3:1bd37786be90 224 voltage = (float) V/1000;
oteki 3:1bd37786be90 225 resistance = (float) 10*V/C;
Naoto_111 4:04014356c355 226
oteki 2:d3723c3e869b 227 }
Naoto_111 4:04014356c355 228 //pc.printf("%f,%f,%f\n", 1.1, 200.0, 0.0);
Naoto_111 4:04014356c355 229 pc.printf("%f,%f,%f\n", voltage, resistance, offset);
oteki 2:d3723c3e869b 230 count++;
oteki 2:d3723c3e869b 231 break;
oteki 2:d3723c3e869b 232
oteki 2:d3723c3e869b 233 case 'o'://offset
oteki 2:d3723c3e869b 234 offset = resistance;
oteki 2:d3723c3e869b 235 break;
Naoto_111 4:04014356c355 236
oteki 2:d3723c3e869b 237 case 'q'://quit serial mode
oteki 2:d3723c3e869b 238 serialmode = false;
oteki 2:d3723c3e869b 239 return;
oteki 2:d3723c3e869b 240 }
oteki 2:d3723c3e869b 241 }