積算電流計のためのスケッチ(プログラム)です。 正確な値を得るために、出来る限りのスピードで繰り返し電流値を読み取り、 1秒間積算し、その都度平均値を求めています。
// Stand-alone Current Integrator by Toda Yorzu Kenkyujyo #include < LiquidCrystal.h > // include LCD driver #define ResetPin 9 // To define Digital 9 pin as input #define analogPin 3 // To define analog 3 pin as input // lcd(RS,RW,E,DB4,DB5,DB6,DB7) Arduno board numbers for LCD SD1602VBWB-XA LiquidCrystal lcd(7,6,5,10,11,12,13); unsigned long time1=0; // time in msec unit unsigned long time2=0; // time2 in msec unit unsigned long timeForAverage=1000; // nearly=1000 msec, time for average Current unsigned long SecNow=0; // time in second unit unsigned long MeasN=0; // number of measurement times in 1 second unsigned long CurrentNow=0; // Current value unsigned long SumCurrent=0; // Sum of Current float CurrentAve=0; // Current average for 1 sec double IntCurrent=0; // Integrated Current float Coeff=0.488281; // 10 bit=1024 / 5 Volts / 10 OHM *1000 ,Series resistance (10 OHM), unit mA void setup(){ pinMode(ResetPin, INPUT); // for reset button Serial.begin(9600); // Serial communication begins at a speed of 9600 lcd.begin(16,2); // This LCD is 16*2 lcd.clear(); // Clear the display lcd.setCursor(1,0); // Cursor at the original position lcd.print("Current"); lcd.setCursor(1,1); // Cursor at the 2nd column lcd.print("Integrator"); delay(300); CurrentNow=0; IntCurrent=0; SumCurrent=0; MeasN=0; time2=millis(); } void loop(){ MeasN=0; //reset the measurement times SumCurrent=0; //rest the sum of current time1=millis(); //check time now while(millis()<time1+1000){ // repeat for 1000 msec=1 second CurrentNow=analogRead(analogPin); //Direct measurement of analog 3 pin SumCurrent=SumCurrent+CurrentNow; // Sum of the current MeasN++; // number of measurement times // delay(300); } SecNow=time1/1000; // time in the unit of second CurrentAve=Coeff*(float)SumCurrent/(float)MeasN; // average current for 1 sec timeForAverage=millis()-time2; IntCurrent=IntCurrent+(double)timeForAverage*(double)CurrentAve/1000.0; // Integrated current time2=millis(); lcd.clear(); // LCD clear lcd.setCursor(0,0); //In the 1st column, original position lcd.print("Sum="); //Integrated Current= lcd.setCursor(4,0); // Set the Position lcd.print(IntCurrent); // Display Integrated Current unit mA*sec lcd.setCursor(0,1); // In the 2nd column lcd.print("I="); // Current= lcd.setCursor(2,1); // Set the Cursor position to (2,1) lcd.print(CurrentAve); // Display averaged current lcd.setCursor(9,1); //Set the Cursor position to (7,1) lcd.print(SecNow); // Display averaged current lcd.setCursor(15,1); // In the 2nd column lcd.print("s"); // Unit of second // Output to PC throgh USB/serial Serial.print("MeasN/SumCurrent/CurrentAve/IntegratedCurrent"); Serial.print(MeasN); Serial.print("/"); Serial.print(SumCurrent);Serial.print("/"); Serial.print(CurrentAve);Serial.print("/"); Serial.println(IntCurrent); if(digitalRead(ResetPin)==HIGH){IntCurrent=0;} // reset the Integrated Current when the button pushed }
ここで公開するアイデア/装置は安全性を保障しておりません。 用途に応じた設計を行い、十分な安全検査を行ってからご利用ください。 本サイトの情報の営利目的での利用はご遠慮ください。 本サイトの内容の無断転載を禁じます。© 2011 TYK