Support Forum

Share your projects and post your questions

Register   or   Sign In
The Forum

External Vref for ADC

3373 Views - Created 12/06/2016

12/06/2016

Posted by:
sandeeptara@gmail.com

sandeeptara@gmail.com Avatar

i am trying to read pt100 RTDs using channel 1 and channel 2 . I have tested everything using excel and external voltage outside of Raspberry Pi and expended Pi I am getting perfect temperature measurements using Wheatstone bridge and callendar-van dusen equation when I measure using my digital multi meter. I believe that when connecting to expander Pi I need to join both grounds , (I am using 2,5Volts constant power & of course removed jumper) and output to pin#1 & #2. I tried that but got readings close to Vref that was kept at default 4.096V initially in the program, it read 4.095V when I ran example program. Can someone share application notes on it? I tried to put Vref =2.5 too but reads similarly close to Vref 2.499 When I ran program. By multimeter it reads 0 .538V. I have not connected anything to pin 15 Vref

12/06/2016

Posted by:
andrew

andrew Avatar

Location:
United Kingdom

andrew Twitter  andrew Website  

I think the problem could be that the ADC is configured to read in single-ended mode instead of differential mode so it is reading the voltage between each input and ground which on a Wheatstone bridge would read 2.5V as the voltage will be going directly from V+ through one of the resistors to the ADC input and into ground. To measure the difference across the Wheatstone bridge the ADC will need to be set to differential mode so it measures the difference between channels 1 and 2.

At the moment none of our Expander Pi libraries supports differential mode on the Expander Pi ADC but if you let me know which language you are using I will update that library so you can use it in differential mode and hopefully read the RTD correctly.

12/06/2016

Posted by:
andrew

andrew Avatar

Location:
United Kingdom

andrew Twitter  andrew Website  

After thinking a bit more about your problem I think it could be that you need to connect the vref pin to your 2.5V constant power source. If you have removed the jumper shown in the red circle below then the ADC reference will not be connected to anything so it will be measuring between ground and 0V so any input would return as the maximum value. If you connect your 2.5V to the vref pin then that will be used as the maximum reference and the Expander Pi should return the correct values.forum image

14/06/2016

Posted by:
sandeeptara@gmail.com

sandeeptara@gmail.com Avatar

Thanks - to connect 2.5V was important. It is working. Only issue is -Chanel 1 and 2 can't be chosen. I had to use 1 and 3 . If I use Chanel 1 and 2 readings get messed up.

16/06/2016

Posted by:
sandeeptara@gmail.com

sandeeptara@gmail.com Avatar

I am able to read voltage using expender pi, but python code for resistance and Callendar–Van Dusen equation which works great in excel do not work in python .Both equations work in excel T=((-(H3*H6)+SQRT(H6*H6*H3*H3-4*(H6*H4)*(H6-(D10))))/(2*H4*H6))*9/5+32or T=((-H3)+SQRT(H3*H3-4*H4*(1- D10/100)))/(2*H4)*9/5+32where H3=a=3.9083*10^-3 H4=b=-5.775*10^-7 , H5=c=-5.775*10^-7, R0=H6=100, D10=Rrtd. I am using 270Ohms resistnce at divider , Rrtd =270/((D2/D3)-1) D2= VinD3=Voutany suggestions?

16/06/2016

Posted by:
andrew

andrew Avatar

Location:
United Kingdom

andrew Twitter  andrew Website  

I have tried to recreate your first equation in excel and python and managed to get a script working that gives the same output.#!/usr/bin/pythonimport mathD2 = 2.0D3 = 1.0DividerRes = 270t = 0.0H3 = 0.0039083H4 = -0.0000005775H5 = 0.0000005775H6 = 100D10 = DividerRes/((D2/D3)-1)a = H6*H6*H3*H3-4*(H6*H4)*(H6-(D10))b = math.sqrt(a)t = ((-(H3*H6)+b)/(2*H4*H6))*9/5+32print aprint bprint tThe above code gives a result of 873.011583507 in python and 873.0116 in excel. I split the equation up into several parts to make it easier to check that each stage was working correctly.

05/07/2016

Posted by:
sandeeptara@gmail.com

sandeeptara@gmail.com Avatar

Thank you so much Brian and Andrew. I was struggling with my PT 100 , perhaps due to collective error of voltage drop and error due to variation in the resistance of devider circuit I was getting an error of 5 degrees F.finally my sensors are giving accurate readings code is following:-#!/usr/bin/python3 from ABE_ExpanderPi import ADCimport timeimport math"""===============================================Success_read_PT100-1.0=============================================== this demo reads the voltage from channel 1 on the ADC inputs"""from math import sqrt as sqrtadc = ADC() # create an instance of the ADC # set the reference voltage. this should be set to the exact voltage# measured on the Expander Pi Vref pin.adc.set_adc_refvoltage(3.5)alpha = 0.003851a = 0.0039083b = -0.0000005775 c = -0.000000000004183ro = 100vs = 3.5r1 = 270D1 = adc.read_adc_voltage(1)D2 = adc.read_adc_voltage(2)D3 = adc.read_adc_voltage(3)D4 = adc.read_adc_voltage(4)D5 = adc.read_adc_voltage(5)D6 = adc.read_adc_voltage(6)D7 = adc.read_adc_voltage(7)D8 = adc.read_adc_voltage(8)def getTemp(voltage): voltage = adc.read_adc_voltage(voltage) Z = (r1/((vs/voltage-1))) X = a*a*ro*ro-4*ro*b*(ro-Z) Y = math.sqrt(X) T = ((-(a*ro)+Y)/(2*b*ro))*(9/5)+32-5 return T def tempAvg(voltage): temperature = getTemp(voltage) time.sleep(1) temperature += getTemp(voltage) time.sleep(1) temperature += getTemp(voltage) time.sleep(1) temperature += getTemp(voltage) time.sleep(1) temperature += getTemp(voltage) temperature = temperature/5 print(temperature)#def getTemperature(voltage):#temperature = (((a*ro*-1)+math.sqrt(((ro*ro*a*a)-4*ro*b*(ro-(r1/((vs/voltage)-1)))))/(2*b*ro)))*(9/5)+32#temperature = ((-(a)+math.sqrt(a*a-4*b*(1-outputRes(voltage)/ro))/(2*b)))*1.8+32 # I like this one :P# read the voltage from channel 1 and display on the screenwhile True: print (str(D1)) print (str(D2)) print (str(D3)) print (str(D4)) print (str(D5)) print (str(D6)) print (str(D7)) print (str(D8)) Z1 = (r1/((vs/D2-1))) Z2 = (r1/((vs/D3-1))) print (str(Z1)) print (str(Z2)) # print (getTemp(2)) # Temperature 1 # print (getTemp(3)) # Temperature 2 tempAvg(2) tempAvg(3) time.sleep(2) print("\n" * 100)

Sign in to post your reply

Note: documents in Portable Document Format (PDF) require Adobe Acrobat Reader 5.0 or higher to view.
Download Adobe Acrobat Reader or other PDF reading software for your computer or mobile device.