Just found out one unpleasant thing: when I read the current from 2 different channels and voltage from the same channel I get way higher idle value for current as when I read only one channel current. The code:
#include <MCP3208.h>
#include <SPI.h>
#define ADC_BITS 12
#define ADC_COUNTS (1 << ADC_BITS)
#define ICAL 61.5
#define VCAL 255.8
#define PHASECAL 1.00
MCP3208 adc(4);
unsigned int current = 0;
unsigned int voltage = 0;
/*unsigned int currentChannel = 4;
unsigned int voltageChannel = 5;*/
double offsetV, offsetI, filteredV, filteredI, lastFilteredV, phaseShiftedV;
double sqI, sumI, Irms, sqV, sumV, Vrms, sumP, instP;
double realPower, apparentPower, powerFactor;
int startV;
unsigned long start;
unsigned int numberOfSamples;
boolean lastVCross, checkVCross;
unsigned int timeout, crossCount, crossings;
void calcVI(unsigned int currentCh,
double currentCal,
unsigned int voltageCh,
double voltageCal,
double voltagePhaseShift)
{
boolean st = false;
start = millis();
while(st == false)
{
startV = adc.analogRead(voltageCh);
if((startV < (ADC_COUNTS * 0.55)) && (startV > (ADC_COUNTS * 0.45))) st = true;
if((millis() - start) > timeout) st = true;
}
numberOfSamples = 0;
crossCount = 0;
start = millis();
while(((millis() - start) < timeout) && (crossCount < crossings))
{
numberOfSamples++;
lastFilteredV = filteredV;
current = adc.analogRead(currentCh);
voltage = adc.analogRead(voltageCh);
offsetV = offsetV + ((voltage - offsetV) / ADC_COUNTS);
filteredV = voltage - offsetV;
offsetI = offsetI + ((current - offsetI) / ADC_COUNTS);
filteredI = current - offsetI;
sqI = filteredI * filteredI;
sumI += sqI;
sqV = filteredV * filteredV;
sumV += sqV;
phaseShiftedV = lastFilteredV + voltagePhaseShift * (filteredV - lastFilteredV);
instP = phaseShiftedV * filteredI;
sumP += instP;
lastVCross = checkVCross;
if(voltage > startV) checkVCross = true;
else checkVCross = false;
if(numberOfSamples == 1) lastVCross = checkVCross;
if(lastVCross != checkVCross) crossCount++;
}
double I_RATIO = currentCal * ((5000 / 1000.0) / (ADC_COUNTS));
Irms = I_RATIO * sqrt(sumI / numberOfSamples);
double V_RATIO = voltageCal * ((5000 / 1000.0) / (ADC_COUNTS));
Vrms = V_RATIO * sqrt(sumV / numberOfSamples);
realPower = V_RATIO * I_RATIO * sumP / numberOfSamples;
apparentPower = Vrms * Irms;
powerFactor = realPower / apparentPower;
sumI = 0;
sqI = 0;
sumV = 0;
sqV = 0;
sumP = 0;
}
void setup()
{
adc.begin();
SPI.setFrequency(1000000); // 1MHz max samplerate
Serial.begin(115200);
timeout = 1000;
crossings = 50;
}
void loop()
{
calcVI(3, ICAL, 5, VCAL, 1.00);
Serial.println("Phase A:");
Serial.println("----------");
Serial.print(Vrms);
Serial.print("V, ");
Serial.print(Irms);
Serial.print("A, ");
Serial.print(realPower);
Serial.print("W, ");
Serial.print(apparentPower);
Serial.print("VA apparent, PF = ");
Serial.println(powerFactor);
Serial.println("-----------------------------");
delay(2000);
calcVI(4, ICAL, 5, VCAL, 1.00);
Serial.println("Phase B:");
Serial.println("----------");
Serial.print(Vrms);
Serial.print("V, ");
Serial.print(Irms);
Serial.print("A, ");
Serial.print(realPower);
Serial.print("W, ");
Serial.print(apparentPower);
Serial.print("VA apparent, PF = ");
Serial.println(powerFactor);
Serial.println("=============================");
Serial.println("");
Serial.println("");
delay(2000);
}
If for one CT reading I had 0.1A value for two of them I have 0.4A which is very strange… Could it be somehow related to ADC or it’s just my program bug?