RobTillaart/ACS712

optimization for mA_AC_sampling()

RobTillaart opened this issue · 4 comments

Current implementation of mA_AC_sampling() takes ~20 ms per call (50 Hz assumed) as it samples a whole period.

If the wave is symmetric (fair assumption for AC) code could sample half the period and double that value.
Should reduce the duration to ~10 ms (50 Hz).
For 60 Hz it would save about ~8.4 ms.

As the sampling period is shorter, there is more time for other tasks.

Might also work for some other AC functions.

Analysis

Core formula is : sum += sqrt(sumSquared / samples);

Assuming that both halves are equal, sampling for half a period means sum += sqrt((sumSquared/2) / (samples/2));

These formulas are equal, so sampling half a period gives same value.

The only difference is that sampling for whole period can have a positive effect on cancelling noise,
so it might be more accurate.

A test with a simulated AC signal of 50 Hz gave the following output.

Half period sampling

ACS712_LIB_VERSION: 0.3.6
MidPoint: 507. Noise mV: 21
mA: 13974. Form factor: 0.71  time: 10288
mA: 13860. Form factor: 0.71  time: 10136
mA: 13747. Form factor: 0.71  time: 10136
mA: 13957. Form factor: 0.71  time: 10168

Full period sampling

ACS712_LIB_VERSION: 0.3.6
MidPoint: 507. Noise mV: 21
mA: 13851. Form factor: 0.71  time: 20280
mA: 13847. Form factor: 0.71  time: 20212
mA: 13835. Form factor: 0.71  time: 20228
mA: 13802. Form factor: 0.71  time: 20268
mA: 13765. Form factor: 0.71  time: 20240
mA: 13747. Form factor: 0.71  time: 20292

Observations

  • the values measured are similar ==> good!
  • the half period sampling shows more variation
  • the full period sampling shows less variation
  • average ~30 samples 13801 (full) vs 13809 (half)
  • stdev ~30 samples 36 (full) vs 143 (half)
  • The price for the factor 2 time gained is a factor 4 in accuracy, not unexpected.

Some more playing resulted in this trick. (to be added to readme.md)

mA_AC_sampling trick.

A trick to sample faster is to set the frequency to 2 times the actual frequency 100 or 120 Hz.
This results in sampling half a period, and on average the same current will be measured,
while the function only blocks for ~10 ms @ 50Hz (8.5 @ 60Hz).
The drawback is that there is about 4x as many variation, but performance might be needed.

In a similar way one can increase the accuracy by setting the frequency a factor 2 lower.
Drawback is a far longer blocking time.

Use with care!

Added the sampling trick to the readme.md of 0.3.7
Will not be a specific function or so.
Close this issue for now.