0
\$\begingroup\$

I am making a digital weighing scale circuit and currently having difficulties understanding filters that are commonly used to reduce noise in these type of circuits. My load cell is a full-bridge with a max-capacity of 200kg and 2mV/V rated output. With an excitation voltage of 5V, I am only amplifying half the signal (0-5mV) using an AD620 in-amp. Then I used AD822 as difference amplifier to subtract an offset of 2.47V and then amplify it again by 4.9 to have an output swing of about 200mV to 4.8V.

My questions are:

1) Is the headroom voltage I have provided for the ADC large enough or actually small? Because I have read that its a common rule to provide a headroom for your ADC but I don't know exactly how much so I settled with 200mV. I am using the built-in ADC of arduino(10-bit resolution)

2) As you can see, I am using the basic way of constructing a difference amplifier and non-inverting amplifier with my AD822. Is there a more effective way of doing this? Or is there something I need to add to make my output more stable and accurate? Because on the diff amp, I'm actually having a pretty stable output but with regards to my non-inverting amp, it is having some inaccuracies, e.g. instead of having an output closely at 196mV at 40mV input (40mV * gain of 4.9 = 196mV), I'm having an output of something like 230mV. And also it is varying unexpectedly with non-moving load.

3) Sorry for this but i basically don't know something about filtering noise. What are your recommendations for my circuit on filtering noise? I think i must have to put something between my load cell and AD620 in-amp, and between my non-inverting amp and ADC but I don't know what exactly they are right now.

All kinds of help are greatly appreciated!

FYI, decoupling caps were used on each IC but were not indicated on the schematic below. (0.1micro paralleled with 0.33micro)

enter image description here

And if this could help, this is my code for testing my values, it is actually the sample code provided for smoothing analog values.

  total= total - readings[index];

  readings[index] = analogRead(inputPin);

  total= total + readings[index];

  index = index + 1;

  if (index >= numReadings)

    index = 0;

  average = total / numReadings;

  Serial.println(average); 

  delay(500);
\$\endgroup\$
2
\$\begingroup\$

You should take full advantage of your bridge to directly drive a difference amplifier. Trying to create the separate reference of 2.47V using an LM324 is going to be a source of error that will likely forever kill the performance of your circuit. After all there is a good reason that full bridges are designed into load cells.

I've not looked at any data sheets for the parts that you are using but it also seems like your use of the ADxxx parts for part of the circuit and the LM324 for the references will be another source of error. The LM324 and the ADxxx parts are likely to be in completely different leagues when it comes to error parameters such as the offset voltages.

Another thing to think about. When you get your circuit all polished out there will still be an error where zero load not equal to zero result. The best you hope for is that the total circuit is as linear as possible across its usable range. Then you take what ever reading you get at "no load" and subtract that value from readings that you make at weighing time to get the actual weight. Another factor to add into this is that it is often necessary to also use software to scale the readings to actual weight. This entails taking a reading at full weight and storing that to be used to scale subsequent readings to actual weight.

If you are unable to achieve good linearity of the analog circuitry over the full weight usage range it may then be necessary to additionally calibrate the system at additional points such as mid range or at 25%, 50% and 75% to give the ability to scale readings to actual weight by doing linear interpolation over shorter sections of the input range.

Lastly do not discount the importance of what temperature variation will do to your system.

\$\endgroup\$
  • \$\begingroup\$ what do you mean by "You should take full advantage of your bridge to directly drive a difference amplifier"? I used the LM324 to provide a reference voltage of 2.5V to my AD620 and also to provide a 2.47V to subtract to my AD620 output. What part or IC would you recommend to replace the LM324 for that particular task? \$\endgroup\$ – Rhonald Rei Pahayac Jan 4 '15 at 6:27
  • \$\begingroup\$ When it comes to getting the actual weight from my circuit, i'm not actually testing it yet because I want to complete the circuit first. But i will take note and read about what you have said. thanks! \$\endgroup\$ – Rhonald Rei Pahayac Jan 4 '15 at 6:32
  • \$\begingroup\$ @RhonaldReiPahayac - You had mentioned that you are using half of the signal from your strain gauge. I initially took that to mean that you were just using half of the bridge. But I guess you actually meant that you are only using half of the signal range from the bridge because you intend to use only half of the weighing range of the load cell. \$\endgroup\$ – Michael Karas Jan 9 '15 at 13:44
  • \$\begingroup\$ yes thats definitely what i mean. I intend to use only the 0-100kg part of the load cell instead of the 0-200kg full scale \$\endgroup\$ – Rhonald Rei Pahayac Jan 9 '15 at 13:46
0
\$\begingroup\$

I didn't look at all the details, but IMHO the approach is quite wrong : you are using three different op amps and tons of resistors, each adding some noise and errors. Drop it all, and connect directly your AD620 output to the ADC input of a 328 (NOT an "Arduino" with so many useless stuff), with the shortest wires possible. the only valuable component to add is some R-C cell (e.g. 1k and .1uF) as a low-pass filter.

then what you get from the ADC reading is 512 + gain * value. Pretty much the best that you will ever have. Then you need to remove offset and gain inside your sketch. That's what a micro is for, isn't it ?

The "Reference" in the AD620 seems tied to the ground in the data sheet. Why would you want to fiddle with very unprecise (1% !) physical electronics getting millivolts of noise everywhere when you can get 0.000006% resolution using floats inside your Arduino ?

And don't ever think that not removing the 2.5V means you lost one bit of precision. That's noise anyway. On the contrary, you won a pretty neat guarantee that when you read 0 or 1023, your circuit is broken ;-) And you took the needed distance from the non-linearities inherent to the fact you're close to GND or VCC.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.