In a couple of previous posts the noise on the Netduino AnalogInput and the impact of this on the RMS current measurement was discussed. I trialled two versions of the code to see if my approach worked. Both versions used the initial calibration phase to measure the maximum and minimum values of the noise.
int valueSum = 0; int valueNoiseMinimum = int.MaxValue; int valueNoiseMaximum = int.MinValue; int valueSumSqr = 0; int offset; AnalogInput x1 = new AnalogInput(Cpu.AnalogChannel.ANALOG_0); // Calculate the sum for offset for first run for (int i = 0; i < SampleCount; i++) { int value = x1.ReadRaw(); valueSum = valueSum + value; if (value < valueNoiseMinimum) { valueNoiseMinimum = value; } if (value > valueNoiseMaximum) { valueNoiseMaximum = value; } } offset = valueSum / SampleCount; valueNoiseMinimum -= offset; valueNoiseMaximum -= offset;
The first version used only the initial offset
Stopwatch stopwatch = Stopwatch.StartNew(); stopwatch.Start(); for (int i = 0; i < SampleCount; i++) { int value = x1.ReadRaw(); value -= offset; if ((value > valueNoiseMaximum) || (value < valueNoiseMinimum)) { valueSumSqr += (value * value); } } stopwatch.Stop();
RMS 42.2729 RMS Current 3.4A RMS Power 775W Duration = 3301 mSec 30293/sec
RMS 42.2137 RMS Current 3.4A RMS Power 774W Duration = 3302 mSec 30284/sec
RMS 42.2374 RMS Current 3.4A RMS Power 775W Duration = 3302 mSec 30284/sec
RMS 42.1307 RMS Current 3.4A RMS Power 773W Duration = 3302 mSec 30284/sec
RMS 42.1307 RMS Current 3.4A RMS Power 773W Duration = 3302 mSec 30284/sec
RMS 42.1189 RMS Current 3.4A RMS Power 773W Duration = 3302 mSec 30284/sec
RMS 42.1307 RMS Current 3.4A RMS Power 773W Duration = 3302 mSec 30284/sec
RMS 42.1070 RMS Current 3.4A RMS Power 772W Duration = 3302 mSec 30284/sec
RMS 42.1189 RMS Current 3.4A RMS Power 773W Duration = 3302 mSec 30284/sec
RMS 42.1426 RMS Current 3.4A RMS Power 773W Duration = 3303 mSec 30275/sec
The second version updated the offset every iteration
Stopwatch stopwatch = Stopwatch.StartNew(); stopwatch.Start(); for (int i = 0; i < SampleCount; i++) { int value = x1.ReadRaw(); valueSum += value; value -= offset; if ((value > valueNoiseMaximum) || (value < valueNoiseMinimum)) { valueSumSqr += (value * value); } } stopwatch.Stop(); offset = valueSum / SampleCount;
This was slightly slower due to the extra addition operation in the sampling loop
RMS 41.5933 RMS Current 3.3A RMS Power 763W Duration = 3537 mSec 28272/sec
RMS 41.6653 RMS Current 3.3A RMS Power 764W Duration = 3541 mSec 28240/sec
RMS 41.6053 RMS Current 3.3A RMS Power 763W Duration = 3538 mSec 28264/sec
RMS 41.5572 RMS Current 3.3A RMS Power 762W Duration = 3537 mSec 28272/sec
RMS 41.5572 RMS Current 3.3A RMS Power 762W Duration = 3537 mSec 28272/sec
RMS 41.5331 RMS Current 3.3A RMS Power 762W Duration = 3537 mSec 28272/sec
RMS 41.4970 RMS Current 3.3A RMS Power 761W Duration = 3540 mSec 28248/sec
RMS 41.4849 RMS Current 3.3A RMS Power 761W Duration = 3538 mSec 28264/sec
RMS 41.4849 RMS Current 3.3A RMS Power 761W Duration = 3538 mSec 28264/sec
RMS 41.4849 RMS Current 3.3A RMS Power 761W Duration = 3516 mSec 28441/sec
At 28K4 samples per second the self adjusting RMS calculation is sampling the 50Hz waveform much more frequently than required.
Pingback: Code Camp 2014 Information | devMobile's blog
Pingback: Azure Event Hub Service Gateway V0.1 | devMobile's blog