I've been fighting with load cells for something like two weeks now. Lost two USB ports on my laptop to 12V in the process. Yet to hear of anyone having this much trouble. Looking for help.
Here are ~30 minutes worth of readings from a 100g load cell connected to a ADS1232 analog to digital converter module (tare done, no weight on the scale, using online dashboard InfluxDB to see data and store and process it):
Huge drift/creep to the point that I wouldn't even call it creep/drift.
Here is my setup (lots of other stuff going on here, dw about it).
Started with HX711 load cell ADC module. Then ADS1232 module. Added TLV1117 5V LDO with input and output filtering capacitors (10pF and 10µF for both) for excitation voltage. Nice, clean 5.005V supply voltage. I've checked with a multimeter. Tried with a 100g load cell (datasheet). 128x gain for range of +/-20mV. Tried with an expensive 300g load cell (datahsheet). 1x gain for range of +/-2.5V because output is 1.3V with no load (that's just how the Wheatstone bridge design is).
I've lost my mind.
I need to get to 10mg resolution. I'll be measuring samples' mass in a chemistry test--absorption of CO2 with passive air contacting. I read this scholarly article saying you can get 5mg accuracy with 100g TAL221 load cells available on eBay easy peezy. Imagine my frustration.
I read this article explaining how to perform temperature correction of load cells. That worked well with the 300g load cell. Its readings wouldn't wander, but then I got relatively little change with it when I applied a load, and variation in readings stayed bad. Way too inaccurate, basically.
(Here is link to ADS1232 library example program: link. Much of the calibration function can be ignored. Deleted everything and replaced with weight.OFFSET = weight.raw_read(20);
Here's my code:
#include "ADS1232.h" //https://github.com/ciorceri/ADS1232/tree/master
#include "BufferedOutput.h" //not using rn
#include <stdint.h>
#define _dout 16
#define _sclk 17
#define _pdwn 19
ADS1232 weight = ADS1232(_pdwn, _sclk, _dout);
void setup() {
Serial.begin(115200);
weight.power_up();
delay(10*1000); //wait for 10 seconds
weight.OFFSET = weight.raw_read(20); //tare
}
void loop() {
if (weight.is_ready()) {
Serial.println(weight.raw_read()); //it turns out weight.raw_read() spits out reading minus tare weight.
}
delay(500);
}
No idea what to do anymore. My teammates are looking at me like an idiot.
A huge thank you in advance to any helpful wizards out there.
Edit: At your guys' behest, I've gotten out my oscilloscope. Was shocked to see my excitation voltage is far from clean. I don't think this will solve the drift issue, but I think I'll solve it first, anyways. I need microvolt order ripple, not millivolt order ripple. Images with 100MHz bandwidth and 20MHz bandwidth, respectively:
I'll twist my voltage supply cables, and I'll twist the differential signal cables from the oscilloscope.
Edit #2: I've been asked to show schematic:
Another edit: Thank you to everyone for helping. I still haven't solved my problem, I'm afraid. I've implemented many of the suggestions I've received. I've created a whole new post with my updated situation: link. Thanks again.
Nice, clean 5.005V supply voltage. I've checked with a multimeter.
... how do you know that the power supply does not output a ripple? \$\endgroup\$