Why Your Load Cell Reading Drifts: A Weighing-Electronics War Story, from Strain Gauge to Legal Metrology

At 6:40 in the morning the empty platform read zero grams. At 3:10 in the afternoon, with nothing on it, it read 118. By nine that night it was back to 4. Nobody had touched the scale. Nobody had calibrated it. A 100-kilogram platform scale in a tin-roofed milk collection centre had apparently decided to gain weight every afternoon and lose it again after dark, and the cooperative that bought milk by weight had started to get complaints.
This is a story about hunting that drift. It follows the order in which we suspected things, which is the order most teams follow: the load cell's datasheet temperature coefficient, then the electronics, then the wiring, then the usual list of slow villains (creep, moisture, mechanical binding), and finally the cause nobody on the team would have guessed from the schematic. The story is a composite assembled from several weighing projects, with no customer named, and the measured numbers marked as simulated are simulated. The physics and the numbers for cables, excitation and thermoelectric voltages are computed, and you can check them.
The lesson, stated up front so it can survive the detail: a drifting load cell has several different ways to drift, and they look the same on a dashboard. Zero drift, span drift, creep, noise and load-dependent error each have a signature and each has a test. A team that fixes before it separates them will chase a different cause every week. A team that separates them first will find the one that matters in an afternoon.
Before changing anything, separate zero drift from span drift from creep. They share a symptom ("the reading is wrong") and almost nothing else.
The Symptom and Why It Mattered
The platform scale sat in a collection centre where farmers brought milk cans to be weighed and graded before pooling. The cooperative paid by weight, so a reading that rose through the afternoon meant that farmers arriving in the afternoon were paid for milk they had not brought, the cooperative lost the difference, and the morning farmers, who saw the zero at its lowest, felt cheated by comparison. Disputes about weights are not an engineering problem for the people who have them. They are about trust, and a scale that drifts by 2 percent of a typical can is a scale people stop believing.
The behaviour was reproducible. The zero rose from mid-morning to a peak around three in the afternoon, then fell as the sun left the roof. It was repeatable day after day, which is the best news you can get in a drift hunt: a repeatable drift is a deterministic function of something, and the job is to find which something.
The system was ordinary. A bar-type shear-beam load cell rated at 100 kilograms, with a sensitivity of 2 millivolts per volt, excited at 5 volts, giving a full-scale output of 10 millivolts. A four-wire cable of about 30 metres to an electronics enclosure on the wall, with a 24-bit sigma-delta converter and a small microcontroller. A temperature-compensated cell, as the datasheet said, with a stated temperature effect on zero.
The Usual Suspects, and What Each One Looks Like
Experienced weighing engineers keep a mental table of causes and signatures. Writing it down makes the hunt faster.
Suspect | Signature in the data | Fast test | Typical fix |
Temperature effect on zero (TC zero) | Zero shifts with cell temperature, same direction every cycle, independent of load | Log empty-scale output against cell temperature over a day | Temperature compensation; thermal design |
Temperature effect on span (TC span) | Error proportional to load, changes with temperature | Weigh a fixed test mass at different temperatures | Compensation; better cell |
Thermal gradient across the cell | Zero shifts that follow a one-sided heat source (sun, motor, wall), not the average temperature | Log two temperatures on the cell; look for gradient correlation | Shade, insulate; two-sensor compensation |
Cable resistance change with temperature | Span error that grows with load and with cable temperature; zero unaffected | Compare error at zero and at full load while heating the cable | Six-wire sense, or ratiometric measurement, or shorter cable |
Excitation or reference drift | Span error proportional to load; correlates with supply voltage | Measure excitation at the cell and at the supply | Ratiometric design, same reference for excitation and ADC |
Thermoelectric voltages (thermocouple effect) | Small zero offsets that follow temperature gradients at junctions and connectors | Reverse the excitation polarity; offset that stays is thermal | Excitation reversal, matched metals, layout |
Creep | Reading creeps in one direction under constant load, then recovers on unloading | Apply a mass and log for 20 to 30 minutes | Better cell class; creep compensation |
Moisture ingress | Slow, one-directional zero drift, noisy output, low insulation resistance | Insulation-resistance test between bridge and body | Seal, dry, replace |
Mechanical binding or side load | Zero does not return after load; hysteresis | Load-unload cycle; check mounting | Fix mounting, stops, cable strain relief |
Electrical noise and mains pickup | Fast fluctuation, often at 50 Hz; not slow drift | Spectrum of raw samples | Shielding, filtering, grounding |
The first move is always the same. Log the raw, unfiltered bridge output with the empty scale, alongside every temperature you can measure and the supply voltages, at a rate of one sample every few minutes, for at least three days. A hundred hours of boring data answer more questions than a morning of guessing.
Suspect One: The Datasheet's Temperature Coefficient
The datasheet quoted a temperature effect on zero. Datasheets express it as a percentage of full-scale output per degree Celsius, and the arithmetic is simple, so it was the first thing anyone computed. A cell with a temperature coefficient of zero of 0.02 percent of full scale per degree Celsius, in an environment with a 20 degree swing, shifts its zero by 0.4 percent of full scale. On a 100-kilogram cell that is 0.4 kilograms, or 400 grams. A better cell at 0.005 percent per degree gives 100 grams over the same swing.
The measured drift was 118 grams on a day with a swing of about 14 degrees in air temperature. Plausible, and so the team's first instinct was to relax: the cell was behaving within its specification, and the drift was "just the temperature coefficient." That instinct is both common and wrong, for two reasons. The rated coefficient applies to a cell at a uniform temperature, and it is a worst-case bound. And if the zero drift is within specification but still unacceptable for the application, the specification is the problem, not the cell. A cooperative weighing milk in grams needs a stability the datasheet never promised.
The first real step was to compensate for temperature. A temperature sensor was glued to the cell body, and the team fitted a straight line of zero error against body temperature using two days of empty-scale logs. The residual error dropped substantially, from a peak-to-peak of about 133 grams to about 38 on the held-out third day in our simulation of this setup, and that looked like victory. It was not. A residual of 38 grams peak-to-peak with a clear afternoon hump meant the model was missing something that behaved like the sun.
Suspect Two: The Cable, and the Sum That Cleared It
A 30-metre run between cell and electronics is long, and four-wire load cell cables carry the excitation current through copper whose resistance changes with temperature. A tin roof and a cable run along a sun-heated wall are exactly the conditions that heat it. The team computed the effect.
Copper has a resistivity of about 0.0172 ohm-square-millimetres per metre. A 0.25 mm² conductor therefore has about 0.0688 ohms per metre, so 30 metres is about 2.06 ohms per conductor and 4.13 ohms for the excitation pair in series. Against a 350-ohm bridge, the voltage that reaches the bridge is lower by 4.13 / 354 = 1.17 percent. That is a span error, a fixed sensitivity loss that the calibration absorbs. The part that matters is the change. Copper's resistance rises about 0.393 percent per degree Celsius, so a 20-degree rise in the cable adds about 0.33 ohms, which changes the bridge voltage by about 0.092 percent. On a 100-kilogram load, that is about 92 grams of error at full load.
The critical word is "at full load." Cable resistance changes the span, not the zero. An empty scale reads zero whatever the bridge excitation is, because zero output times any gain is zero. The drift on the empty platform was a zero drift, so the cable could not explain it, however attractive the sum looked. It would explain a load-dependent error, and it did explain a smaller proportional drift that showed up when full cans were weighed in the afternoon. Both were present, and they needed separate remedies: six-wire sense connections (or a ratiometric measurement that cancels excitation changes) for the span effect, and something else for the zero.
An empty-scale drift cannot come from excitation or cable resistance. Those scale the signal, and zero times any scale factor is still zero. Look for offsets.
Suspect Three: The Reference and the Sigma-Delta
A well-designed weighing front end is ratiometric: the same voltage that excites the bridge is used as the converter's reference, so any change in excitation scales the signal and the reference together and cancels out of the digital result. A design with a separate reference loses that cancellation, and a one percent drop in excitation becomes a one percent drop in span.
The team checked and found the design was ratiometric, with the converter's reference taken from the bridge excitation, so the excitation was ruled out for the zero drift and credited with a clean bill for the span. They also checked the converter's own offset drift, which is small for a modern 24-bit sigma-delta part but not zero, and logged the converter's input shorted to confirm the front end's zero did not move. The shorted-input zero was flat to within a few counts over the day, which cleared the electronics.
The converter question also forced a useful sum. At 2 millivolts per volt and 5 volts of excitation, full scale is 10 millivolts. To resolve 1 gram on a 100-kilogram cell the system needs 100,000 counts across that range, about 16.6 bits of noise-free resolution. A 24-bit converter rarely delivers 24 noise-free bits at useful data rates, and the number of noise-free bits falls as the data rate rises, so the data rate and the averaging are design choices. At the 10 samples per second this scale used, the converter's noise was well below a gram, which is why the drift was visible at all. Had the noise been larger, the drift would have hidden in it.
Suspect Four: Thermoelectric Voltages
Any junction between dissimilar metals generates a small voltage that depends on temperature, and a bridge signal of 10 millivolts at full scale is small enough for microvolts to matter. One microvolt on a 10-millivolt full scale is 0.01 percent of full scale, which is 10 grams on a 100-kilogram cell. A few microvolts of thermal offset across a terminal block or a connector, changing as a gradient moves through it, produces a zero drift of tens of grams.
This suspect has a clean test and a clean fix. If you reverse the polarity of the excitation and take the difference of the two readings, a DC offset (including a thermoelectric one) adds to both readings in the same direction and cancels in the difference, while the signal flips sign and doubles. A bridge excited with alternating polarity rejects slow offsets at the cost of halving the throughput. In a quick experiment, the team applied polarity reversal in firmware and averaged the difference. The zero drift fell, but not to zero, which told us thermoelectric offsets were part of the problem and not all of it.
# reversal.py -- polarity-reversal measurement cancels DC offsets (including thermal EMF)
def reversed_excitation_reading(read_adc, set_excitation_polarity, settle_ms=20):
set_excitation_polarity(+1); wait(settle_ms); plus = read_adc()
set_excitation_polarity(-1); wait(settle_ms); minus = read_adc()
return (plus - minus) / 2.0 # offset appears in both; signal changes sign
# Worked example: signal 2.000 mV, thermoelectric offset 0.004 mV
signal, offset = 2.000, 0.004
plus, minus = signal + offset, -signal + offset
print((plus - minus) / 2.0) # 2.000 mV: the offset is gone
print((plus - signal) * 1000) # 4 uV of error if measured one way only (40 g on 100 kg)
Four microvolts of uncancelled offset on this cell is 0.04 percent of full scale, or 40 grams. That is large enough to matter and small enough to hide in the noise of a casual measurement, which is why thermoelectric offsets cause so many mystery drifts.
Polarity reversal helps with offsets and not with changes inside the bridge itself. A forum discussion among engineers who have fought this fight makes the same point: switching to AC excitation does nothing for shifts caused by temperature, ageing or mounting that change the bridge balance, such as non-uniform thermal expansion or creep. Those errors stay. The residual after reversal on our scale was exactly that kind.
Suspect Five: The Slow Villains, Creep and Moisture
Creep is the slow change in a load cell's output under a constant load, and it is a classification parameter in the legal-for-trade standard for load cells. If you place a mass on a cell and watch, the reading continues to drift in one direction for tens of minutes, then recovers over a similar time after removal. Creep also changes with temperature, so a creep correction tuned at room temperature is wrong in the afternoon. This scale's drift occurred with nothing on it, so creep could not explain the zero hump, but it explained part of the error on a can left on the platform for a few minutes during grading, and it deserves its own test.
Moisture is the other classic. Water in the cable, junction box or cell body lowers the insulation resistance between the bridge and the case and produces slow zero drift, usually in one direction, with a noisy output. The test is cheap: disconnect the cell, measure the insulation resistance between the bridge wires (shorted together) and the cell body with a megohmmeter, and compare with the datasheet. A collection centre that gets washed down daily is a moisture candidate, and the team found the cable entry into the enclosure had a gland a quarter-turn loose. Tightening it, drying the junction box and adding a drip loop fixed a small separate problem, a few grams of noisy drift after washdown. It did not touch the afternoon hump.
Insulation resistance takes five minutes with a megohmmeter and rules moisture in or out. Do it early, because moisture mimics almost every other cause.
The Culprit Nobody Suspected
The afternoon hump followed the sun. Its shape tracked the angle of the sun across the roof and the shadow of a rafter, and its peak came when the low afternoon sun struck one end of the platform through a gap under the eaves. The load cell sat at one end of the weighing structure, bolted to a steel frame that heated unevenly: the sunlit end warmed faster than the shaded end, so the cell saw a temperature gradient from end to end in addition to a changing average temperature.
A temperature-compensated load cell is compensated for a uniform temperature. Its compensation resistors sit in particular places in the bridge and assume that the strain gauges and the compensating elements are at the same temperature. When a gradient runs through the cell, the four gauges are at different temperatures, the bridge is unbalanced, and the zero moves by an amount that has nothing to do with the rated temperature coefficient. The effect is well known to anyone who has put a scale near a window, a furnace or a motor, and it is why weighing guides warn against locating load cells in direct sun and recommend insulated enclosures.
The team confirmed it with an experiment. They placed a second temperature sensor on the far end of the frame and logged both. The difference between the two sensors, the gradient, correlated with the residual error after uniform-temperature compensation almost exactly. A model with two inputs, the body temperature and the gradient, removed most of what the one-input model could not. In the simulation that mirrors this scale, with synthetic data built from a uniform coefficient of 5 grams per degree and a gradient coefficient of 9 grams per degree, the held-out day looked like this:
Compensation | RMS zero error on the held-out day | Peak-to-peak |
None | 40.6 g | about 133 g |
Cell body temperature only | 8.1 g | about 38 g |
Cell body temperature plus end-to-end gradient | 2.9 g | about 16 g |
The simulated figures illustrate the pattern rather than report a customer measurement, and the pattern is the point: a second temperature sensor, placed to see the gradient, removed most of the error that one sensor could not.
# zero_comp.py -- fit empty-scale zero error against body temperature and gradient
import numpy as np
def fit_zero_model(T_body, T_gradient, zero_err_g):
"""Least-squares fit: zero_err = c0 + c1*T_body + c2*T_gradient (empty-scale logs, >= 2 days)."""
A = np.column_stack([np.ones(len(T_body)), T_body, T_gradient])
coef, *_ = np.linalg.lstsq(A, zero_err_g, rcond=None)
return coef
def apply_comp(raw_g, T_body, T_gradient, coef):
return raw_g - (coef[0] + coef[1]*T_body + coef[2]*T_gradient)
# Validate on a held-out day, not on the data you fitted. Log the residual forever:
# if it grows, something else changed (moisture, a loose mount, a worn cell).
Two disciplines keep a model like this honest. Validate on data you did not fit, because a fit that looks perfect on its own training days proves nothing. And log the residual after compensation for the life of the scale, because software compensation can quietly hide a hardware fault, and a growing residual is the earliest warning that something has changed.
What Each Cause Looks Like in a Plot
Logs reward people who know what shape to look for. A few pictures to keep in mind when the first three days of data arrive:
Uniform temperature effect: zero error follows the cell temperature with a lag of minutes to an hour (the cell has thermal mass), forming a smooth loop when plotted against temperature, tighter when the temperature changes slowly.
Thermal gradient: the error follows a heat source, not the average, so a plot of error against average temperature shows a wide loop or a hump that appears only when the sun, motor or furnace is active. Plot error against the difference between two sensors and the loop collapses to a line.
Excitation or cable effect: the empty-scale trace is flat, and the error appears only when load is applied, growing in proportion to it. Plot error against load at two cable temperatures and the lines fan out from the origin.
Thermoelectric offset: a small zero shift that follows a junction's temperature gradient, vanishing when you reverse the excitation.
Creep: after loading, a smooth exponential-looking creep in one direction, and an opposite recovery after unloading. Plot it on a logarithmic time axis and it often looks nearly straight.
Moisture: a drifting trace that wanders in one direction over hours or days, with noise that grows after washdown or rain, and an insulation-resistance reading below the datasheet figure.
Mechanical binding: zero that does not return after a load-unload cycle. The step height is the same each time.
Mains pickup: fast fluctuation. A spectrum shows a spike at 50 Hz or its harmonics, and averaging over whole mains cycles removes it.
A habit that saves hours: plot each candidate cause on its own axes before fitting anything. A fit can make a wrong model look right on the data you gave it, and a plot shows you the shape of the disagreement.
Software compensation can hide a hardware fault. If the residual after compensation grows, something physical has changed (moisture, a loose mount, a worn cell), and the model will not tell you which.
Fixing the Cause Instead of the Symptom
A software model is a patch. The better fix removes the gradient. The collection centre's fix had four parts:
Shade and insulate. A sheet over the sunlit gap and a thermal break between the frame and the roof-heated wall reduced the gradient the cell saw by more than half.
Move the electronics enclosure out of the sun, away from the wall that heated, so the converter and reference did not warm and cool with the building.
Fit six-wire sense connections (or a ratiometric digital cell) to remove the proportional error from cable temperature, which the filled-can measurements had revealed.
Keep the two-sensor compensation as a second line of defence, with the residual logged.
After the changes, the empty-scale excursion over a day fell from over 100 grams to a few grams, and the proportional error on a full can dropped to a level the cooperative could ignore. The farmers noticed the difference before the engineers measured it: the arguments about afternoon weights stopped.
The second temperature sensor, placed at the far end of the frame, turned a mystery afternoon hump into a fitted term and cut the simulated peak-to-peak error from about 38 grams to about 16.
What the Standards Say, and Why Trade Use Changes the Rules
Where a scale is used to buy or sell by weight, it enters the regulated world of legal metrology. The load cell standard OIML R60 classifies load cells by accuracy class and by performance across a temperature range, normally minus 10 to plus 40 degrees Celsius, with creep and its temperature dependence among the parameters that decide the class. The companion standard for non-automatic weighing instruments, OIML R76, sets requirements on the whole instrument. In India, weighing instruments used for trade fall under the Legal Metrology Act 2009 and its rules, which involve approval of the instrument model and its verification and stamping by the legal metrology authorities. The details, including accuracy classes, the number of scale divisions allowed and what must be sealed, are in the current rules and the approval documents, and any product intended for trade should be designed against them from the start with the approving laboratory's input.
Three design consequences follow:
Software that moves the displayed weight is regulated software. Automatic zero tracking, creep compensation and temperature compensation can be allowed, restricted or prohibited in ways that depend on the class, the rules and the implementation. Do not add a clever zero-tracking routine to a trade scale without confirming what the approval allows.
Calibration and firmware sealing are design requirements. Trade scales typically need tamper-evident sealing of calibration access and of the firmware, so the enclosure and the update mechanism need a plan, not an afterthought.
The classification of the load cell constrains the instrument. A cell with poor creep or temperature performance limits the instrument's class however good the electronics are. Choose the cell for the class you need.
Not every weighing application is trade use. A feed hopper for process control or an internal check weighing has no legal requirement, and the team can use compensation freely. The decision about which category applies belongs at the start.
A Calibration Routine That Respects All the Above
A scale that has been diagnosed deserves a calibration that exercises the causes it found. A practical sequence:
Mechanical check. Inspect mounting, stops, cable strain relief and levelling, and confirm the cell is free of side load and binding.
Insulation resistance. Measure it between the bridge and the body, and between the cable shield and the enclosure.
Warm-up and zero. Power the scale long enough for the electronics to reach steady temperature, then record the zero.
Multi-point span. Apply certified test weights at several points across the range, up and down, to capture linearity and hysteresis, and fit the calibration curve.
Creep test. Hold a mass at a point near capacity for 20 to 30 minutes and log the output.
Temperature test. Where the application needs it, repeat the zero and one span point at two or three temperatures, in a chamber or by exploiting natural variation over days.
Repeatability. Repeat the same load several times and record the spread.
Seal and document. Record the calibration constants, the test weights used and their certificates, the conditions and the date, and apply any required seals.
An Error Budget You Can Argue With
When a scale misbehaves, an error budget turns an argument about whose fault it is into a spreadsheet. The table below uses the numbers from this post on a 100-kilogram cell with a 10 millivolt full scale. The figures are examples to be replaced with your own.
Source | How to compute it | Example result on a 100 kg cell |
Uniform temperature effect on zero | TC zero (percent of full scale per degree) times the swing | 0.02 %FS/C over 20 C: 400 g; 0.005 %FS/C over 20 C: 100 g |
Cable resistance change, four-wire | Series resistance times copper's temperature coefficient times the swing, divided by bridge resistance | About 92 g at full load for 30 m of 0.25 mm² and a 20 C swing; zero at zero load |
Excitation change without a ratiometric reference | Percent change in excitation equals percent change in span | 1 percent: 1 kg at full load |
Thermoelectric offset | Microvolts divided by full-scale microvolts times full scale | 1 microvolt: 10 g; 4 microvolts: 40 g |
Thermal gradient | Measure with two temperature sensors; fit | In the simulation, about 9 g per degree of gradient |
Creep | From the cell's class and a loaded test | Class-dependent; measure it |
Converter noise | Standard deviation of shorted-input readings at your data rate | Well below 1 g at 10 samples per second for the converter in this story |
Writing the budget forces the team to notice that the largest line items are rarely the ones the datasheet puts in bold.
When Software Is Not the Answer
A cell that fails its own class. If the creep or hysteresis exceeds what the application needs, the fix is a better cell.
An installation that fights the physics. A scale in direct sun, beside a furnace, under a dripping pipe or on a flexing floor needs a better location before it needs a better algorithm.
A requirement the legal rules forbid you to compensate in software. For trade-use scales, hardware and mechanical fixes may be the only route.
A design with a long cable and no remote sense. Replace the cable arrangement before modelling its drift.
Noise masquerading as drift. If the reading fluctuates at mains frequency, shield and filter before modelling anything.
Starting on Monday: A Drift-Hunt Protocol
Log everything for three days. Raw bridge output with the empty scale, excitation voltage at the cell, supply voltage, at least two temperatures on the cell and one on the electronics, at one sample every few minutes.
Short the converter input for a day on a bench channel and log it, to clear the electronics.
Separate the signatures. Zero drift (empty), span drift (fixed test mass at different temperatures), creep (loaded hold), noise (spectrum).
Measure insulation resistance and inspect glands, junction boxes and mounting.
Compute the cable and thermoelectric numbers for your own wiring, with the formulas above.
Test polarity reversal to see how much of the zero drift is offset.
Add the second temperature sensor and fit zero against body temperature and gradient, validating on a held-out day.
Fix the physical cause first, then apply compensation as a second line, and log the residual for the life of the scale.
Back to 118 Grams
The number on the display at 3:10 in the afternoon was not a mystery, and it was not a defect in the cell. It was the sum of a gradient, a temperature coefficient, a few microvolts and a loose gland, each small and each explainable, added up by a sun the schematic never showed. The scales we trust are the ones whose builders went looking for each of those terms, wrote them down, and kept watching the residual long after the complaints stopped.
EurthTech is an engineering-first product design and embedded systems company with a development center in Hyderabad. To discuss a project, write to connect@eurthtech.com or see https://www.eurthtech.com/case-studies.




Comments