HX711 Zero is not Zero

Hi guys, I have a question relating to the use of the HX711 with a strain gauge.

I’m using the green HX711 breakout board with an Arduino Nano to monitor one strain gauge mounted to a bracket for analysis. High tolerance, temperature stable resistors are used to complete the wheatstone bridge. The HX711 was calibrated to determine the correct scale factor and offset – as per the library documentation. The Nano works fine communicating with the HX711 and displays the output on my screen just fine. The code and the circuit work as expected.

Right after calibration, for an instant on/off loading situation, the HX711 seems to yield the proper results.

However, over a longer time (say 15 minutes), the HX711 seems to show problems with zero point drift. And more specifically, hysteresis of the readings. For example, I can calibrate the HX711 to show all the correct loads. I can display Load A, Load B, and Load C with acceptable accuracy – as long as A, B, and C are incrementally larger and added to the bracket.

The problem arises when I try to REMOVE the loads. So A->B->C works. C->B->A does NOT. If A is 100lb, B is 200lb, and C is 300lb, the HX711 works as weights are added. But if I start at 300lb and remove 100lb, expecting to arrive back at B – which is 200lb…..my reading is way off and terribly inconsistent. Sometimes I read 250lb. Sometimes 120lb.

So I investigated deeper and looked specifically at the raw data coming from the HX711 using the Scale.Read_Average(20) function. The readings definitely drift and I’m not sure why. The load calibration and application process only works ONCE – and when released, the readings DO NOT return to their original values. Zero is no longer zero. This, of course, affects any readings attempted AFTER the first calibration and the first load application/removal cycle.

I understand some people have implemented a Tare() function to reset the readings. I guess this works like a digital bathroom scale. You turn it on, it sets a zero (tares), you step on and add weight, it reads the weight, you step off….and the scale turns off. To measure again, you repeat the process.

Is it not possible to continuously measure with the HX711? I thought that once the system was "calibrated", it would continue to correctly measure the output of the bridge and thus the scaled load would be accurate and repeatable. If the HX711 cannot be used continuously, are there any alternative chips that can be used so seamlessly with Arduino?

Perhaps the framework for the strain gauges is unstable upon application/removal of load.

"...framework for the strain gauges..." Do you mean the actual mounting of the gauges?

I've used 6 different gauges in 4 different locations. 120-ohm and 350-ohm variants. Omega Precision strain gauges with Loctite 401 adhesive.

They all work as expected after the first calibration - like within 2% of the actual load. However, upon removal of partial load. Or upon removal and re-addition of load, the output differs by as much as 25%.

Perhaps I'm looking in the wrong spot for the source of the zero-point drift of the HX711. I've read about noise problems and temperature problems. I think I have those solved with some filtering and good wiring. But this non-zeroing problem is eluding me.

Do you mean the actual mounting of the gauges?

Yes, of course.

I guess its possible.

But great care and cleanliness was addressed in the mounting.

And they all exhibit the same problem.

I've also been reading about bridge completion resistors. Even though we used 0.1% with 5ppm temp stability, perhaps its better to use "dummy" strain gauges? Thoughts?

Zero drift of the HX711 can be tested by shorting the bridge output on the HX711 board.
Connect a wire link between A+ and A-

A Nano, when powered from USB, runs on ~4.6volt.
That is borderline for a HX711 breakout board that has to generate a stable ~4.2volt excitation voltage for the load cells.
You could measure if that ~4.2volt excitation (E+/E-) is stable over time.
If there are problems, then power the Nano with 5volt on the 5volt pin, or with >= 7volt on the V-in/raw pin.
Leo..

The_Dabbler:
I've also been reading about bridge completion resistors. Even though we used 0.1% with 5ppm temp stability, perhaps its better to use "dummy" strain gauges? Thoughts?

So you're not using a full bridge?
Leo..

Wawa:
Zero drift of the HX711 can be tested by shorting the bridge output on the HX711 board.
Connect a wire link between A+ and A-.....

I will try this and log some data for an extended period of time. I'll report back with results.

Regarding power - I have used USB power, a breadboard converter, a battery, and a 5V lab supply. Bridge excitation is good with all of them. I've stayed away from Arduino-only power just out of good practice.

Wawa:
So you're not using a full bridge?
Leo..

No - quarter bridge, single strain gauge with precision resistors (as recommended by Omega application Engineer).

A full bridge is a good idea for several reasons. You might do some more reading.

But I doubt that is the problem with observed hysteresis.

Do you have a preload on the strain gauges to make sure they are always in their linear region?

Zero point drift of the chips shorted A+ to A- is negligible. Full-scale readings are about 400000 points and maximum drift is under 700.

HX711-Chip 1

HX711-Chip 2

jremington:
A full bridge is a good idea for several reasons. You might do some more reading.

But I doubt that is the problem with observed hysteresis.

Might be something to do with the bridge resistors - more testing required.

outsider:
Do you have a preload on the strain gauges to make sure they are always in their linear region?

I thought strain gauge response WAS linear, so no preload required?????? Interesting thought - will investigate further.

I always execute the following semi low-level codes to check that the offset (no load count) of the load cell is stable, and it makes acceptable linear response to load change.

unsigned long x = 0x12345600;  //12345678 is the debug value
void setup()
{
  Serial.begin(9600);
  pinMode(A1, INPUT); //data line
  pinMode(A0, OUTPUT);  //SCK line
}

void loop()
{
  digitalWrite(A0, LOW);//SCK is made LL
  if (digitalRead(A1) == LOW) //conversion done
  {
    for (int i = 0; i < 24; i++)  //read 24-bit data from HX711
    {
      clk();      //generate CLK pulse to get MSB-it at A1-pin
      bitWrite(x, 0, digitalRead(A1));
      x = x << 1;
    }
    Serial.println(x, HEX);
    x = 0x12345600;    //12345678 is the debug value
    delay(3000);
  }
}
void clk()
{
  digitalWrite(A0, HIGH);
  digitalWrite(A0, LOW);
}

GolamMostafa:
I always execute the following semi low-level codes to check that the offset (no load count) of the load cell is stable, and it makes acceptable linear response to load change.

Thanks for the info. After further testing, we discovered that although the strain gauge response is linear....the mechanical system of the strain gauge mounted to the bracket is NOT. So I'm reading the RAW data from the HX711 and processing it through my own code to follow our measured "calibration" data. So far the loading direction is more accurate than with the standard linear formula y=mx + b.

However, it looks like the system may still have hysteresis. I'm not exactly sure why. So perhaps we need a "loading" formula and an "unloading" formula. I find it strange that the load path would not be the same loading or unloading - thus the strain the same. FEA shows it to be in the elastic region with an identical load path. But measurements do not agree. More testing required.....(still suspicious of the resistor bridge)...

What material is being strained?

High tensile steel, all in the elastic region.

Hey The_dabler I am also working on the similar basis can you suggest me how to connect quarter bridge circuit of strain gauge to hx711 amplifier and further to arduino