measuring a resistor very precisely with a 10bit adc - Page 1
Forum section: electronics / projects

author: xchip
author_rank: Regular Contributor
timestamp: July 09, 2013, 12:16:05 am
content: Hi guys,What technique do multimeters use to measure resistors with high precision?.. I was thinking of doing it with an arduino just for fun, it has a 10bit dac but somehow I could do some bracketing to increase the dynamic range of the ADC.. I could also use a few voltage divider and even use an op amp to amplify small changes (to get more precision)That is just my first thought, but I'm sure there are better ways,what would you recommend?Thanks!

author: Dave
author_rank: Super Contributor
timestamp: July 09, 2013, 12:28:02 am
content: You get a very accurate current source and force the current through the unknown resistor. You then measure the voltage across the resistor with another set of leads.Also, 10-bit and high precision don't fit into the same sentence.

author: Psi
author_rank: Super Contributor
timestamp: July 09, 2013, 12:45:35 am
content: One way that comes to mind is using a wheatstone bridge and one of the mcus differential ADC pairs with gain to measure the V and find zero.http://en.wikipedia.org/wiki/Bridge_circuitHowever i'm not sure how you would go about adjusting the variable part of the bridge using the arduino DAC.

author: ve7xen
author_rank: Super Contributor
timestamp: July 09, 2013, 12:53:58 am
content: Quote from: Psi on July 09, 2013, 12:45:35 amPWM can be extremely linear, but when configured to be good at this sort of task it is very slow. Using it to hunt for a zero would be painful. I suppose with enough gain this method could be fairly accurate though.

author: quantumvolt
author_rank: Frequent Contributor
timestamp: July 09, 2013, 07:20:45 am
content: As said over, it will be slow and working hard - but imo Arduino is not about speed but fun learning. I think the bridge is a good idea. You can use a servo or a motor (geared toy car motor with H-bridge, step motor, whatever) to drive the potentiometer. You will have to find or define reference resistors first. You will find a lot of info about the bridge principle, differential amplifier, driving servo/motor and a search algorithm for controlling the pot on the web. You might choose to throw in a relay or more for changing range and reversing a motor. An optocoupler might also be needed for the difference amp. This idea can be made into a big measurement-control study project. It won't be the best instrument in the world though ...

author: PA4TIM
author_rank: Super Contributor
timestamp: July 09, 2013, 07:40:56 am
content: 10 bit is not much but the arduino can measure down to uV's if you use some extra parts. It is very easy and educational to make a dual slope adc and use the arduino to measure the time.http://www.pa4tim.nl/?p=2482i do not have the arduino code anymore.You can also make or buy a 24 bit ADC or buy or make a decent VF converter. 10 bit will not give you much resolution. 10 bits is 1024 steps. If the Vref is 5V one step is about 0.005 V. So you have a 3.5 digit meter plus/min 5 countsWhen you have enough resolution there is a simple way to measure resistance very good using only two wires, no need for a stable current source.You only need one very good and well known resistor. And these are easy available.Put some voltage on the unknown resistor and the well know in series and measure the voltdrop over both.The ratio between the voltdrops is equal to the resistance ratio.So 100 Ohm in series with an unknown. I measure 5V over the 100 Ohm and 1 V over the unknown, then the ratio is 5. The unkown is 100 / 5 = 20 OhmCheck: 5 / 100 is 0.05A. 1 / 0.05 = 20 OhmSuppose my voltage source is not well defined and it turns out to be only 5V. In that case I measure 4.1667V over the 100 Ohm and 0.833 over the unkown, 4.1667 / 0.833 = 5 and 100 / 5 = 20 Ohm.Using the 10 bit. I measure 563 steps over the 100 Ohm resistor and 345 steps over the unknown. The ratio is 1.63188 so the unknown is 61.2788 Ohm. But 563 can be 562.1 in real and 345 can be exact 345 so the unknown will be somewhere between 62.2788 and 61.3769. A 0.16 % difference.But it is a good way to test a multimeter. Using two well known resistors you can check your voltmeter.only problem with this methode is you better use a current source because this example I gave allready draws to much current and heats up the resistor. But if you use a current source you can limmit the power dissipation.

author: ddavidebor
author_rank: Super Contributor
timestamp: July 09, 2013, 08:16:50 am
content: It's possible to oversample for increase the precision

author: casper.bang
author_rank: Frequent Contributor
timestamp: July 09, 2013, 08:51:25 am
content: Per ddavidebors suggestion, oversampling would be a nice "next step" for you when you have everything up and running. As usual, Atmel provides very good documentation:http://www.atmel.com/images/doc8003.pdf

author: xchip
author_rank: Regular Contributor
timestamp: July 09, 2013, 09:12:51 am
content: And how about bracketing? This is a technique used in photography where by you increase the dynamic range of the camera from 8bit to 24bit (or even more!), here is the link to wikipediahttp://en.wikipedia.org/wiki/BracketingCan this be applicable to measuring resistors?Cheers

author: casper.bang
author_rank: Frequent Contributor
timestamp: July 09, 2013, 09:36:49 am
content: Quote from: xchip on July 09, 2013, 09:12:51 amDon't think so. With photography, you deal with lots of small parameters (aperture and exposure) revolving around composite light-gathering and the end result is not some precise count of photons. I suppose it should be possible to come up with a scheme where "exposure time" is a factor of precision, i.e. charging up a capacitor and measuring how long it takes it to discharge... anyone?!

author: ddavidebor
author_rank: Super Contributor
timestamp: July 09, 2013, 11:58:35 am
content: No but you can add noise and average various measurement.I suggest, first start doing some costant current generator (precise ones if possible)

author: PuterGeek
author_rank: Regular Contributor
timestamp: July 09, 2013, 03:28:51 pm
content: Making a true constant current source better the a few percent is very difficult. Using a precise voltage reference with 0.1% resistors in a voltage divider or a bridge is easier.Slightly off topic, an incircuit tester I worked on used voltage sources, high precision resistors and a good opamp to calculate the gain. It required a lot of switching with reed relays to configure the circuit for measurement. The result was extremely accurate and allowed guarding adjacent components that would affect the measurements.-Joe

author: nessatse
author_rank: Regular Contributor
timestamp: July 09, 2013, 04:18:55 pm
content: Also keep in mind that the successive approximation ADC's used on the AVR suffer from inaccuracies like offsets,non-linearities and gain errors. That is why multimeters use things like dual-slope or sigma-delta ADC's or its variants. You may be able to compensate for some of these errors in software.And lastly, don't forget to buffer the ADC input, the input impedance if the ADC is only in the region of 20k.

author: Alexei.Polkhanov
author_rank: Frequent Contributor
timestamp: July 10, 2013, 03:37:01 pm
content: Perhaps DMM usesDual Slope Integrating ADC technique. I think I have seen it in one of recent DMM teardowns.There is a set of micro-controllers from Analog Devices. I used one about year ago - ADUc845. I had a 4 wire scheme with 1K RTD sensor. It has 24bit internal ADC and generates current that is used to measure resistance of RTD. Measuring with low current is important cuz you can get wrong result if current you are measuring with will produce heat in resistor thus changing its resistance. So I would turn on current only when measuring.ADUc845/847/848 not very cheap but they seems to have all the right analog circuitry to measure resistance and very easy to program.Here is an app note I am referring to:http://www.analog.com/static/imported-files/application_notes/AN709_0.pdf- it addresses all your concerns about non-linearity etc.

author: xchip
author_rank: Regular Contributor
timestamp: July 10, 2013, 07:31:20 pm
content: I think i came up with a way by using 2 ADC's of the arduino, see the schematic attached...1) ADC0 measures a coarse value, lets call it Vcoarse2) I amplify Vcoarse with an op amp and then i get Vfine, and i use ADC1 to measure thatThe problem is that I need Vfin to be within 5 and 0 volts, and for that I'd use a ressitor ladder that would allow me to change the virtual ground pos...Does it sound like a good solution? I didnt see anytone suggesting it so it may be a crazy ideaIf done properly I could get 20bit measurements