Noise issue on 4ch 4-20mA Current Loop Receiver Mini Module

I’ve been very excited to experiment with the ADS1115 based 4-20mA current loop receiver Mini Module (PR33-10), however I’ve found what appears to be a flaw regarding noise introduced to the measurement from the on-board power supplies.

When a pair of channels (1&2 or 3&4) collectively draw around 20mA, the reading becomes unstable for that pair of channels. For a short range of current draw around that point, there is a 3% noise added to the measurement—a magnitude of almost 0.5mA.

I spent a few days debugging the board, and it appears to be an issue with the power supply. There’s significant noise on the 16V output, and a peak right when the switching frequency is somewhere around 515KHz. (The first harmonic would be suspiciously similar to the 1MHz internal clock of the ADS1115—maybe causing a beat frequency? But I have no proof here.)

I was able to make some modifications to my board and get significantly better results, reducing the noise event at this critical current level down to 0.016mA or 0.08% noise.

I made the following modifications to my board:

  1. add a 10µF ceramic capacitor in parallel with the 100nF “CA1” power supply input capacitor (for channels 1&2)
  2. add a 1µF ceramic capacitor in parallel with each of the 5Ω current shunt resistors to additionally filter the signal before being amplified but the INA196.

I came to the conclusion it was power supply related because it is related to the sum of current draw across a pair of channels. Studying the datasheet for the TPS61040, it seems like a larger input capacitor (C1) is needed, and a smaller feed-forward (measured 100nF, expected to be 5pF) capacitor should be used, but I didn’t experiment with that.

I first noticed the issue with two industrial pressure sensors attached to channels 1 & 2. I’d have them reach full-scale, then let the pressure slowly decrease—and found that noise was induced on both channels reliably at the same time at some point in the decay.

The easiest way to reproduce the issue is simply to get a potentiometer and connect it to channel 1. Hook up another sensor (or potentiometer) and leave it at ~4ma draw on channel 2. Adjust the first potentiometer until approximately 20ma of current is drawn total

Plot the output from the ADS1115 at a high resolution and with a regular. In my plotting configuration, I am sampling 2x per second. I have configured the ADS1115 for single-ended measurements, and am using the 128 SPS sample rate to take each reading.

Watch the plot, and adjust the potentiometer up or down until the instability is located.

Unfortunately, this particular current limit is frustrating, because it’s right in the middle of the reference range.

In my testing I found that:
- The waveform on the SW node of the power supply seemed to change at this 20mA boundary, the transition seems to cause the noise.
- Since the maximum bandwidth that can be digitized by the ADC is on the order of 400Hz, a simple RC filter could go a long way in noise rejection into the INA196 current sense chip, and the ADC.
- There is something like 1.5Vp-p noise on the 16V supply output, which can be reduced to <300mV with a larger power supply input capacitor

After image (linked, because new users can only include 3 images in post)

I’d be happy to discuss the issue more, or provide additional data regarding my investigation. I hope you consider enhancing a future revision of this board to be more immune to noise for particularly sensitive measurements.

16V Before:

16V After:

1 Like

Hi Joey,
Quite an amazing detailed description.

what the 5V source in your application ?

The CA1 is connected to the 5V input supply which goes into both power supply IC. If the input supply has noise it will pass onto on board supplies.

Currently there is a 10uF and 0.1uF on the 16V supply lines as well on input lines.

A cap across the shunt resistor is definitely going to help with the noise reduction. we will add this in the next revision.

Thanks

Thanks @Bhaskar for the quick reply!

The biggest change I observed was when I installed the 10µF capacitor in parallel to CA1, the 0.1µF 5V supply capacitor. The filtering on the shunt resistor helped somewhat—but without addressing this noise I measured on the 16V line, it was still in the unacceptable range for my application.

I didn’t look at every component on the board—but I didn’t see a 10µF capacitor right near the Channel 1&2 supply input. Is the existing 10µF on the 5V input located way on the other side of the board? I could imagine some kind of long-trace inductance issue, making this 10µF capacitor less effective at doing it’s job. So perhaps board layout would be something to investigate?

I also tested using an electrolytic capacitor first—and it didn’t improve the result. This leads me to believe that since it is a high-frequency issue, something like placement and particular component selection will make a difference. When I took an EMI measurement, the 1st harmonic actually peaks at this troublesome region higher than that of the primary switching frequency(verified by direct measurement on SW):

I saw the noise on the 16V (measured across the 10µF output capacitor) at all loads, but over most of the range, it doesn’t seem to matter—only a problem at this particular switching frequency. Another way I was able to workaround the issue was put an additional load on the boost converter (820Ω resistor draws ~20mA) so the supply would be operating in a different region across my measurement domain—but that seemed like more of a hack than the real solution.

As for the complete system, I’m using a TDK-Lambda DRB-50-5-1 for my system supply and I verified it to be within spec at 30mV of ripple at the supply output. I am also powering a Raspberry PI 4b off of the same supply. I designed a small input board to supply the Raspberry Pi via header pins for a more permanent connection—so the 5V supply is more or less directly connected to the NCD.io Raspberry Pi I2C Shield.

It is very impressive that two complete switching supplies, an ADC, and 4 current shunt measurement ICs are all fit on this tiny little board! I really like this product because it provides all the functionality I need in such a small package. I prefer it to the MCP3428 based product because it does not require an external loop supply and is smaller.

This whole exploration was a lot of work, but very interesting for me. I really appreciate the level of support and detail you provide for your products here on the forums!

5V has a total 4 Caps on the board.
10uF, 10nF,0.1uF and 10uF.

in your testing does the CH3 and CH4 perform better than CH1 and CH2. i say that because the decoupling caps are closure top the CH3 and CH4 power supply.

16V supply 1 – has two decoupling caps. 10uF and 0.1uF

16V supply 2 – has two decoupling caps. 10uF and 0.1uF

did you try using two separate power supplies. one for pi and one for 4-20mA board.

this is a nice board but it has way too much stuff on it for its size and pain to manufacture.

Thank you for all of the details! I didn’t get much comparison testing done between ch pairs 1&2 and 3&4, but I’ll take some comparative measurements in the next couple of days. I suspect you are correct that 3&4 will perform better, if my theory about layout is to have any credence at all.

I’ll make those measurements, as well as try using separate lab supply for the 5V input on this board and the Pi, and will report back.

I’ve also got a second unit of the board on the way, which should be here this week. I’ll make measurements regarding performance on the two sets of channels and separate supply using that brand new one, so I can guarantee none of my rework have accidentally induced a problem.

Well, I must say I’m stumped about the details of where all of this ended up, but I do finally have a system that is working perfectly.

I got a brand new 4-20mA board at the end of last week, connected my two pressure sensors, ran my test of running them to full scale and letting the pressure slowly leak out of my test fixture, and I got similar noise on channels 1&2, but channels 3&4 were significantly worse. Several of the readings dropped to 0, as I suspect the supply was in oscillation.

A completely separate 5V power supply for the board didn’t improve the results.

I applied the changes that I had developed last week on the first board, plus I added a 1.2Ω resistor between the diode and the 16V output capacitors (to make an RC filter on the 16V output) and a large electrolytic on the 5V input terminal, and channels 1&2 worked perfectly; I was unable to measure any unexpected noise. I plotted the derivative of the series and it remained flat throughout the test period.

I attempted the same modification on channels 3&4, but the noise was not completely eliminated, and worse I got non-linear distortions in the final sensor output data. I suspect what happened here was that I incorrectly inserted the 1.2Ω resistor before the connection to the feedback pin—causing a control loop issue in the switching supply.

System noise is completely eliminated on channel 1&2, so I ended up just disabling the 2nd switching supply, and bridging the 16v supply over to supply power for all 4 current loops. I’ll only be using 3 channels anyway.

Everything is working great for me now—but I can’t explain why I had so much difficulty with the board throughout the process to get here. Power supplies are hard I guess. ¯_(ツ)_/¯

Thanks!

Hi,

I’m planning to purchase PR33-10 current loop receivers for 2 wire 4-20mA pressure sensors however I have now found this post and I’m concerned.

@Bhaskar can you say if there has been a modification of this module that has rectified the discussed issues and I can plug in 4 sensors to this board and read them without noise?

Thanks in advance and best regards.

Hi,
i will recommend two channel version.


Thanks

Thanks @Bhaskar. So if I need to read 4 sensors then I just have to get 2 x PR33-8 2-channel boards and chain them via I2C (so both get their power from I2C) and this will give me stable readings without mentioned noise issue?

yes, that should take care of any noise.

@Bhaskar I have installed the 2 x PR33-8 2-channel boards, one is at address 0x48, the other at 0x49, and I’m reading 4 x 4-20 mA sensors. But there is something strange: if I use the same sensor (and I’ve tried with several of them), then one board reads differently than the other. In both cases, the sensor is connected to 2nd input (AIN1). Please see attached images of -1…6 bar sensor (~6 mA) and 0…3 bar sensor (~4 mA) measuring at atmospheric pressure. One colour is with 1st board, then other is with 2nd board. The numbers on Y axis are mA readings.


how are you powering up the boards ?
are you powering both boards at same time and seeing different inputs.

There is a max 3% error rate due to INA196.

Thanks @Bhaskar for your reply. I’m powering the Spark shield with an external 12V adapter that allows plenty of amps (can look for the specs if needed). The 2 PR33-8 boards are connected to the shield via I2C and all the sensors are being read continuously one by one.

thanks for the info.
can you share the code and raw values you are getting from each device.

@Bhaskar see code attached. The raw readings are changing over time as you can see from the graphs I sent. The graphs show mA value which I get as: mA = rawADC * 0.000622
2x-pr33-8.ino (2.5 KB)

can you give this lib a go.

single ended.

Hi @Bhaskar – that lib is for Arduino, is it possible to use for Spark? I have the Spark shield and I don’t have Arduino available…

The particle code base is quite similar to arduino with some minor changes.
@TravisE_NCD_Technica do you have any particle version of this lib

@Bhaskar I do not unfortunately. However porting example code from Arduino to Particle is really pretty simple. I would build the example Bhaskar suggested in your Particle environment, build, and correct errors as needed. You’ll mainly be changing variable types and correcting included libraries.

@Bhaskar I checked the Arduino code and verified that the code I have does the same thing (except that the Arduino code doesn’t check if there is data available from the wire, so I tested without this check but the result is the same). I also adjusted the timing of readings based on the Arduino lib. But nothing changes. And now, I’ve built another control box that uses the same setup as the one I had before, but using 2nd set of the same parts and I get the same kind of result (so it doesn’t seem likely that there is a fault in one of the parts in the 1st control box). Seems like there is noise in the readings coming from the 4-20mA receiver that is further away in the I2C chain. Does that sound possible?