Electronic – Arduino Leonardo + 3 wire Load Cells + INA125P – Analog Signal Bounce / Noise

arduinoload cell

I actually have a software background so my experience in electrical engineering is somewhat lacking. Never the less, I have given my first Arduino project a go and for the most part I am quite happy. However I feel as though there could be a vast amount of improvement that can be achieved regarding the load cell readings.

I am building a digital scale that weighs a maximum of 40Kg. At the push of a button, the scale outputs the current weight to a pc connected via USB. Everything is working quite well except I am getting a lot of bounce when reading the analog input from the loadcells.

I have 4x 50kg 3-wire loadcells (the ones typically found in bathroom scales – similar to these load cells – my wires were different colors, blue, black, red) wired in the configuration below:

3-wire load cell arrangement

I am using an INA125P to amplify the signal to my Arduino as per the diagram below:

enter image description here

  • I have a regulated 9v dc external supply powering the entire system.
  • I am using a booster to increase the voltage to 10V to the load cells as that is the specified excitation voltage. I am also using this 10V supply to the INA125P
  • I have modified a USB cable such that it is a data-only cable by removing the voltage line, so that when the power supply is turned off the entire system turns off and is not powered by the connected USB.

I have basically followed a bunch of online articles, pulled apart a scale, read a bunch of tutorials, a bit of trial and error and came to the above arrangement. This much I was able to do on my own. I have smoothed out the analog readings dramatically on the software end by using a running median combined with an averaging function but still get to much bouncing.

There are loads of articles online that are very helpful in showing exactly how to create a scale using an Arduino and the INA125P, but I was unable to find one that clearly demonstrated how to apply a negative voltage to the INA125P. I recall reading somewhere that I should be able to achieve better resolution by applying a negative voltage to the INA125P but struggled to understand how it was done and now I can’t seem to find where I read it to begin with. Even if I somehow worked out how to create the negative voltage and then worked out how to apply it to the INA125P and managed to use the entire 10-bits of the Arduino’s built in ADC to get a resolution of 1023 I still feel as though the bounce I am experiencing is unusually high, especially on the lower end of the weight (I get almost 200 grams of swing when weighing an object that weighs 400 grams).

After a lot of tinkering and testing I discovered the following unusual behavior…

  • The voltage at A0 varies slightly when I change the USB from one pc to another (even such that the usb cable’s voltage line is removed) and as a result the reading on the scale changes slightly from one pc to another.
  • The voltage at A0 increases if the PC connected to the USB has the Arduino Leonardo drivers installed (so it is not just connected as a HID device).

I should note that…

  • Changing the USB from PC to PC shows no change to the excitation voltage or the voltage supplied to the INA125P from the buck booster.
  • Changing the USB from PC to PC shows no change to the voltage at Aref or at Vin.

I was hoping that I could get the answers to the following questions…

  1. How can I modify my circuit so as to reduce the bouncing and stabilize the analog signal from the INA125P at A0?
  2. How do I create the required negative voltage and how do I then apply it to my circuit such that I am able to achieve the full 10bits of resolution?
  3. How do I stop the voltage variation at A0 when connected via USB to different PC’s?

I really appreciate any help I get on this.

—- UPDATE —-

After some more digging I stumbled across a cheap voltage converter IC ( ICL7660A ) that I was hoping I could use in conjunction with two 10uF capacitors to create the negative 10V supply to the INA125P V- pin.

The documentation for the ICL7660A can be found here.

Is there any problem with using the ICL7660A to create the negative 10V as shown in my circuit below?

Could this cause any foreseeable issues with the INA125P or the rest of the circuit?

Negative 10V created by ICL7660A

— UPDATE 2 —

I ended up testing the above circuit and indeed it appears to supply the -10V to the V- pin of the INA125P, however it does not seem to improve the analog reading range… I am still getting readings between 300 – 1023. I was under the impression that by supplying a negative voltage to pin V- I would be able to get the full range 0 – 1023.

I am also contemplating adding a fixed 10V voltage regulator to the excitation voltage to see if that has a stabilising effect… does it matter where this is placed? I.e. close to the load cells or close to the voltage supply or is it irrelevant??

Best Answer

A few things to be aware of first: With only 10 bits your 1 bit resolution will be (Full Range)/1023, in this case 40kg/1023 = 0.0391kg (39.1g). The 1 bit noise level (39.1g) at the Arduino analog input is 5v/1023 = 4.89mv, (assuming a 5v Arduino system). At the amplifier input the 1 bit voltage value is further divided by the amplifier gain. So any system noise over these values will reduce your resolution further unless extra filtering is used. Also remember that the Arduino chip can be damaged if the A0 input goes below GND or over VCC. Protection diodes could help here if there is no other control.

The +10 and -10 supply setup only helps if needed by the amplifier chip, and/or if it brings the voltage across each load cell to the max 10v level, thereby giving the max output. But as above this could also lead to a negative voltage on A0. For example with a +- supply just lifting your system up by the weighing platform might send A0 negative. (If you do test for this be sure to disconnect A0 from the Arduino first.)

To filter the S+ and S- lines you could try placing low value series resistors onto each line then placing a parallel cap (non-polarized) across them, (with the cap nearer to the amplifier chip). 1k resistors and a 1uf cap might be good values to try. A same value series resistor and cap to GND on the A0 line may also help, (with the cap nearer the Arduino input). These filtering ideas might not help much if your system noise is already too high. The extra RC parts will reduce the response time slightly. If the slower response is unacceptable then a lot of digital filtering would be needed.

Check your zero point noise. Short S+ and S- and see if you get a stable reading near zero. (Do this first by disconnecting A0 and verify with a DVM that A0 does not go negative.) With A0 connected, any "bouncing" you see will likely be system noise from the amplifier or the Arduino. To reduce amplifier noise place larger value caps from the V+ pin to GND and from the V- pin to GND. (10uf to 47uf should do, observe correct polarity). A small cap (maybe 0.1uf) across the gain resistor might help, (check the amplifier's data sheet). To reduce Arduino noise be sure you are using the analog function that switches off the digital system before taking a reading. I don't know if the standard analogRead does this or not. Most of the Atmel chips have this capability. You may need to look up the library function and read through the Atmel chip data book.

To calibrate your system use a good resolution DVM. Temporarily disconnect the A0 input and connect it to the DVM +, with DVM - to GND (or E-). Place a full range mass (40kg) on the scale, adjust Rgain (add a small potentiometer if needed) until you get a reading very close to, but not over Vref. Next remove the 40kg mass and see if the voltage reading is very near 0v. If not near 0v you can give some voltage offset by adding a very high value potentiometer (100k to 1M) connected between E+ and E- with the center connected to a 100k then to S+ or S-. After adjusting the zero point retest and readjust Rgain if needed.