The BBB offers eight 12 bit ADC inputs. ADC values range from 0 to 4096 (2^12). Reference voltage is 1.8VDC. Schematic below indicates Vref is on P9/pin 32, and the ADC input is P9/pin 39. ADC ground (P9/pin 34) is tied to P9/pin 1 ground.
My use case ranges from 0C to an upper bound of 400C. The temperature sensor offers a resistance of 100 ohms at 0C and then .385 ohm per degree C or (in this case) a maximum resistance of 100 + 400 * 0.385 = 254 ohms.
Given that Vref = 1.8 VDC and Rmin = 100 ohms, the current at minimum resistance is 18mA (this is a problem). To mitigate loading, I added a LM358 op-amp as a voltage follower. Put another way, simply reading the PT100 voltage drop might damage the BBB so I decide for additional circuitry as insurance.
I want to use the temperature sensor as half of a voltage divider. What value for the other half? Old school teaches that R = sqrt(Rmin * Rmax) = sqrt(100 * 254) = 160 ohms. Amazingly, I had a 160 ohm resistor available.
Schematic of temperature sensor demonstration |
My PT100 came w/three wires ending w/a blue and two red terminals. I only needed the blue and one of the red terminals.
To enable analog inputs requires some configuration. This example uses Debian 7 image (bone-debian-7.11-lxde-4gb-armhf-2016-06-15-4gb.img).
root@beaglebone:~# echo $SLOTS
/sys/devices/bone_capemgr.9/slots
root@beaglebone:~# cat $SLOTS
0: 54:PF---
1: 55:PF---
2: 56:PF---
3: 57:PF---
4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
5: ff:P-O-- Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
6: ff:P-O-- Bone-Black-HDMIN,00A0,Texas Instrument,BB-BONELT-HDMIN
root@beaglebone:~# echo "BB-ADC" > $SLOTS
root@beaglebone:~# cat $SLOTS
0: 54:PF---
1: 55:PF---
2: 56:PF---
3: 57:PF---
4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
5: ff:P-O-- Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
6: ff:P-O-- Bone-Black-HDMIN,00A0,Texas Instrument,BB-BONELT-HDMIN
7: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-ADC
To read an ADC sample:
root@beaglebone:~# cd /sys/bus/iio/devices/iio:device0
root@beaglebone:/sys/bus/iio/devices/iio:device0# ls
dev in_voltage2_raw in_voltage5_raw name uevent
in_voltage0_raw in_voltage3_raw in_voltage6_raw power
in_voltage1_raw in_voltage4_raw in_voltage7_raw subsystem
root@beaglebone:/sys/bus/iio/devices/iio:device0# cat in_voltage0_raw
2441
For verification, I placed the PT100 in a pan of water and heated it to boiling while reading BBB ADC (voltage) values every 5 degree C (from cooking thermometer), which yields this graph (circles are samples, line is regression model).
Graph illustrates temperature change is linear (and suggests a conversion model).
To convert ADC to temperature use: 822 - 0.329512(ADC value)
Table (below) illustrates observed vs calculated temperatures. Real world rarely match calculated world, but these values seem close enough for my intended application.
To convert ADC to temperature use: 822 - 0.329512(ADC value)
Table (below) illustrates observed vs calculated temperatures. Real world rarely match calculated world, but these values seem close enough for my intended application.
ADC | Observed C | Calculated C |
2479 | 10 | 5.14 |
2437 | 15 | 18.98 |
2424 | 20 | 23.26 |
2419 | 25 | 24.91 |
2403 | 30 | 30.18 |
2389 | 35 | 34.80 |
2378 | 40 | 38.42 |
2358 | 45 | 45.01 |
2347 | 50 | 48.64 |
2332 | 55 | 53.58 |
2318 | 60 | 58.19 |
2299 | 65 | 64.45 |
2284 | 70 | 69.39 |
2267 | 75 | 75.00 |
2251 | 80 | 80.27 |
2235 | 85 | 85.54 |
2218 | 90 | 91.14 |
2208 | 95 | 94.44 |
2195 | 100 | 98.72 |