- make class of it
git-svn-id: http://moon:8086/svn/projects/HendiControl@189 fda53097-d464-4ada-af97-ba876c37ca34
This commit is contained in:
+77
-65
@@ -1,89 +1,101 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import spidev
|
||||
import time
|
||||
import os
|
||||
|
||||
# Open SPI bus
|
||||
spi = spidev.SpiDev()
|
||||
spi.open(0,0)
|
||||
spi.max_speed_hz=100000
|
||||
spi.mode = 0b01
|
||||
|
||||
def read_reg(addr):
|
||||
reg = spi.xfer([addr, 0xFF]);
|
||||
|
||||
return reg[1]
|
||||
|
||||
def write_reg(addr, data):
|
||||
spi.xfer([addr+0x80, data]);
|
||||
class Max31865():
|
||||
def __init__(self):
|
||||
# Open SPI bus
|
||||
self.spi = spidev.SpiDev()
|
||||
self.spi.open(0, 0)
|
||||
self.spi.max_speed_hz = 100000
|
||||
self.spi.mode = 0b01
|
||||
self.write_reg(0x00, 0xA3)
|
||||
|
||||
def read_digits():
|
||||
msb = read_reg(0x01)
|
||||
lsb = read_reg(0x02)
|
||||
digits = float(256*msb + lsb)/2
|
||||
def read_reg(self, addr):
|
||||
reg = self.spi.xfer([addr, 0xFF])
|
||||
|
||||
return digits
|
||||
return reg[1]
|
||||
|
||||
def calc_R(Rref, digits):
|
||||
k = digits / 8192 / 4
|
||||
R = k*Rref
|
||||
def write_reg(self, addr, data):
|
||||
self.spi.xfer([addr+0x80, data])
|
||||
|
||||
return R
|
||||
def read_digits(self):
|
||||
msb = self.read_reg(0x01)
|
||||
lsb = self.read_reg(0x02)
|
||||
digits = float(256*msb + lsb)/2
|
||||
|
||||
def vanDusenLut (R0, Tmin, Tmax, dT):
|
||||
a = +3.90830e-03;
|
||||
b = -5.77500e-07;
|
||||
c = -4.18301e-12;
|
||||
return digits
|
||||
|
||||
Rv = []
|
||||
Tv = []
|
||||
T = Tmin
|
||||
while T <= Tmax:
|
||||
R = R0*(1 + a*T + b*T**2)
|
||||
def getTemperature(self):
|
||||
digits = self.read_digits()
|
||||
R = max31865.calc_R(430, digits)
|
||||
T = max31865.vanDusen_temp(R)
|
||||
print("R={:.3f} Ohm, T={:.2f} degC".format(R, T))
|
||||
return T
|
||||
|
||||
if T < 0.0:
|
||||
R += R0*c*(T - 100)*T**3;
|
||||
|
||||
Rv.append(R)
|
||||
Tv.append(T)
|
||||
T += dT
|
||||
@staticmethod
|
||||
def calc_R(Rref, digits):
|
||||
k = digits / 8192 / 4
|
||||
R = k*Rref
|
||||
|
||||
return Rv, Tv
|
||||
return R
|
||||
|
||||
def vanDusen_temp(Rmeas):
|
||||
RLut, TLut = vanDusenLut(100, -150, +500, 1.0)
|
||||
@staticmethod
|
||||
def vanDusenLut (R0, Tmin, Tmax, dT):
|
||||
a = +3.90830e-03
|
||||
b = -5.77500e-07
|
||||
c = -4.18301e-12
|
||||
|
||||
# Find candidate
|
||||
i = 0
|
||||
for R in RLut:
|
||||
if R > Rmeas:
|
||||
break
|
||||
i += 1
|
||||
Rv = []
|
||||
Tv = []
|
||||
T = Tmin
|
||||
while T <= Tmax:
|
||||
R = R0*(1 + a*T + b*T**2)
|
||||
|
||||
# Linear interpolation
|
||||
R0 = RLut[i-1]
|
||||
R1 = RLut[i]
|
||||
T0 = TLut[i-1]
|
||||
T1 = TLut[i]
|
||||
if T < 0.0:
|
||||
R += R0*c*(T - 100)*T**3
|
||||
|
||||
dR = R1 - R0
|
||||
dT = T1 - T0
|
||||
Rv.append(R)
|
||||
Tv.append(T)
|
||||
T += dT
|
||||
|
||||
k = (Rmeas-R0)/dR
|
||||
T = T0 + dT*k
|
||||
return Rv, Tv
|
||||
|
||||
@staticmethod
|
||||
def vanDusen_temp(Rmeas):
|
||||
RLut, TLut = Max31865.vanDusenLut(100, -150, +500, 1.0)
|
||||
|
||||
# Find candidate
|
||||
i = 0
|
||||
for R in RLut:
|
||||
if R > Rmeas:
|
||||
break
|
||||
i += 1
|
||||
|
||||
# Linear interpolation
|
||||
R0 = RLut[i-1]
|
||||
R1 = RLut[i]
|
||||
T0 = TLut[i-1]
|
||||
T1 = TLut[i]
|
||||
|
||||
dR = R1 - R0
|
||||
dT = T1 - T0
|
||||
|
||||
k = (Rmeas-R0)/dR
|
||||
T = T0 + dT*k
|
||||
|
||||
return T
|
||||
|
||||
return T
|
||||
|
||||
# Main
|
||||
write_reg(0x00, 0xA3)
|
||||
digits = read_digits()
|
||||
R = calc_R(430, digits)
|
||||
T = vanDusen_temp(R)
|
||||
print("R={:.3f} Ohm, T={:.2f} degC".format(R, T))
|
||||
if __name__ == '__main__':
|
||||
|
||||
for i in range (0, 8):
|
||||
print("Reg[0x{}]: 0x{:02X}".format(i, read_reg(i)))
|
||||
max31865 = Max31865()
|
||||
for i in range (0, 8):
|
||||
print("Reg[0x{}]: 0x{:02X}".format(i, max31865.read_reg(i)))
|
||||
|
||||
print("End of program")
|
||||
max31865.getTemperature()
|
||||
|
||||
print("End of program")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user