About Us Knowledge Base Community Forum Electronics Toolbox FAQ Shipping & Delivery

Community Forum

Share your projects and post your questions

Search
Register or Sign In
Forum

External Vref for ADC

2062 Views - Created 12/06/2016

12/06/2016

Posted by:
sandeeptara@gmail.com

Last edited: 12/06/2016

Users 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

Users Avatar

Location:
United Kingdom

Users Twitter  Users 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 support 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.

AB Electronics UK Tech Support

12/06/2016

Posted by:
andrew

Users Avatar

Location:
United Kingdom

Users Twitter  Users 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.

Post image

AB Electronics UK Tech Support

14/06/2016

Posted by:
sandeeptara@gmail.com

Last edited: 14/06/2016

Users 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

Users 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+32

or T=((-H3)+SQRT(H3*H3-4*H4*(1- D10/100)))/(2*H4)*9/5+32

where 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= Vin

D3=Vout

any suggestions?

16/06/2016

Posted by:
andrew

Users Avatar

Location:
United Kingdom

Users Twitter  Users 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/python

import math

D2 = 2.0
D3 = 1.0
DividerRes = 270
t = 0.0
H3 = 0.0039083
H4 = -0.0000005775
H5 = 0.0000005775
H6 = 100

D10 = 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+32

print a
print b
print t

The 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.

AB Electronics UK Tech Support

05/07/2016

Posted by:
sandeeptara@gmail.com

Users 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 ADC

import time

import math

"""

===============================================

Success_read_PT100-1.0

===============================================

 

 

this demo reads the voltage from channel 1 on the ADC inputs

"""

from math import sqrt as sqrt

adc = 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.003851

a = 0.0039083

b = -0.0000005775  

c = -0.000000000004183

ro = 100

vs = 3.5

r1 = 270

D1 = 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 screen

while 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)

 

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.