OpenEnergyMonitor Community

ACS712 - Unuseable (Low Current)


I’ve developing a custom board using the ACS712, measuring up to 500mA. ACS712 is a poor choice and I’d switch to ACS723 but even with double the resolution I can’t see it working. I’m using the standard datasheet schematic, the voltage is nice and steady and it’s connected to an Arduino that is measuring with reasonably low noise. The ACS712 however is anything but. Here’s a random set of values from the ADC at zero current:


That’s a noise spread of 19.

For a current of 0.17A, x185mV/A = 31.45mV

31.45 * (10024/5000) = 6.44

So in theory it has a 27mA resolution (0.17/6.44) but the noise is so bad I won’t be able to see it until over 0.5A of current is flowing. Is this right? Even if I were to switch to ACS723 if the noise is similar it’s much the same?

You have a peak-peak noise of 23 counts (522 - 499), according to my maths. That’s 23 ÷ 1024 × 5 (assuming yours is a 5 V Arduino), so 112.3 mV pk-pk on the output, or referring that back to the input, 600 mA pk-pk. So although I think your “(10024/5000)” is suffering finger trouble, the result isn’t far off - and it’s bad at about 5 times the expected noise.

The peak-peak noise figure on the data sheet says a “typical” value of 21 mV, at 185 mV/A, I make that 113 mA peak-peak equivalent current.

You’ve got to look at noise coming in on the supply (even though you say it is “nice and steady”, it might well have a lot of high frequency noise on it, depending on what your source of 5 V is); and look at the grounding as well. If you have digital currents that are flowing to the analogue ground, you will be adding that to the measured input.

I’ve gone back to the datasheet. From their own data the 21mV is borderline unrealistic.


I’m running a 1nF filter cap which apparently is a bit pointless, so upping this to 47nF to attempt to get the noise down. This could impair the ability to take accurate measurements however and if it adds phase it will have no benefit over using a CT. I’ll know soon.

The ACS723 on paper has better sensitivity but the noise is also higher.

I don’t believe it is the supply as I’m using it for other measurements, although I agree the offset appears to be based on the Vdd/2 rather than a vRef which is a shame.

With a 47nF I’ve a noise spread of -9 to +6, spread = 17, little difference. I also added an additional 0.1uF to the input with no improvement.

A scope shows a 21KHz, 35mV p-p deviation on Vdd, which comes from the 5v regulator I’m using. I think this is acceptable.

With a 7v AC through a 47ohm (149mA peak) I can see the waveform through the values reported by the ADC but the delta between values is barely above the noise. Ultimately I believe the ACS712 is faulty.

One other thing, it is an Arduino running at 5v. I’ve taken all measures to ensure aRef is stable (LM4040) and this is proved through other reads I’m doing elsewhere.

I left the reads going with some max/min code to keep the delta. After a few minutes it’s at 40!

You have adequate supply decoupling close to the ACS712?

That of course is possible. It might even have suffered electrostatic damage before it came to you. I don’t know how susceptible those are, but it’s worth considering.

You can of course use a multi-turn primary winding to reduce the ratio of your c.t. So a nominal 100 A : 50 mA c.t. with a 30 turn primary becomes a 3.33 A : 50 mA one - the same as your ACS712.

I’'m giving up, it’s the wrong tool for the job. I need mA accuracy and voltage is only 20v max at the full 0.5A.

I know you’re savvy from a previous thread so I thought I’d derail the thread with a second question. In the schematic I made and am testing below is there a way to remove the second offset, that way I can increase the gain a bit and use the full range of the ADC.

(halfAref = 2.5v)

I don’t understand quite what you’re doing there. You’re assuming I know or remember something that I don’t (I look at EVERY post that appears here, I can’t remember them all).

You need to explain what you want to do and how you’re proposing to do it, before I can comment.