Added new temperature lookup table creation tool. This one uses stein hart-hart equations.
You need 3 temperature resistance:combinations. This gives a better result then using beta.
This commit is contained in:
		
							
								
								
									
										138
									
								
								Marlin/createTemperatureLookupMarlin.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								Marlin/createTemperatureLookupMarlin.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,138 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | # | ||||||
|  | # Creates a C code lookup table for doing ADC to temperature conversion | ||||||
|  | # on a microcontroller | ||||||
|  | # based on: http://hydraraptor.blogspot.com/2007/10/measuring-temperature-easy-way.html | ||||||
|  | """Thermistor Value Lookup Table Generator | ||||||
|  |  | ||||||
|  | Generates lookup to temperature values for use in a microcontroller in C format based on:  | ||||||
|  | http://hydraraptor.blogspot.com/2007/10/measuring-temperature-easy-way.html | ||||||
|  |  | ||||||
|  | The main use is for Arduino programs that read data from the circuit board described here: | ||||||
|  | http://make.rrrf.org/ts-1.0 | ||||||
|  |  | ||||||
|  | Usage: python createTemperatureLookup.py [options] | ||||||
|  |  | ||||||
|  | Options: | ||||||
|  |   -h, --help        show this help | ||||||
|  |   --rp=...          pull-up resistor | ||||||
|  |   --t0=ttt:rrr      low temperature temperature:resistance point (around 25C) | ||||||
|  |   --t1=ttt:rrr      middle temperature temperature:resistance point (around 150C) | ||||||
|  |   --t2=ttt:rrr      high temperature temperature:resistance point (around 250C) | ||||||
|  |   --num-temps=...   the number of temperature points to calculate (default: 20) | ||||||
|  | """ | ||||||
|  |  | ||||||
|  | from math import * | ||||||
|  | import sys | ||||||
|  | import getopt | ||||||
|  |  | ||||||
|  | class Thermistor: | ||||||
|  |     "Class to do the thermistor maths" | ||||||
|  |     def __init__(self, rp, t1, r1, t2, r2, t3, r3): | ||||||
|  |         t1 = t1 + 273.15               # low temperature (25C) | ||||||
|  |         r1 = r1                        # resistance at low temperature | ||||||
|  |         t2 = t2 + 273.15               # middle temperature (150C) | ||||||
|  |         r2 = r2                        # resistance at middle temperature | ||||||
|  |         t3 = t3 + 273.15               # high temperature (250C) | ||||||
|  |         r3 = r3                        # resistance at high temperature | ||||||
|  |         self.rp = rp                   # pull-up resistance | ||||||
|  |         self.vadc = 5.0                # ADC reference | ||||||
|  |         self.vcc = 5.0                 # supply voltage to potential divider | ||||||
|  |         a1 = log(r1) | ||||||
|  |         a2 = log(r2) | ||||||
|  |         a3 = log(r3) | ||||||
|  |         z = a1 - a2 | ||||||
|  |         y = a1 - a3 | ||||||
|  |         x = 1/t1 - 1/t2 | ||||||
|  |         w = 1/t1 - 1/t3 | ||||||
|  |         v = pow(a1,3) - pow(a2,3) | ||||||
|  |         u = pow(a1,3) - pow(a3,3) | ||||||
|  |         c3 = (x-z*w/y)/(v-z*u/y) | ||||||
|  |         c2 = (x-c3*v)/z | ||||||
|  |         c1 = 1/t1-c3*pow(a1,3)-c2*a1 | ||||||
|  |         self.c1 = c1 | ||||||
|  |         self.c2 = c2 | ||||||
|  |         self.c3 = c3 | ||||||
|  |  | ||||||
|  |     def temp(self,adc): | ||||||
|  |         "Convert ADC reading into a temperature in Celcius" | ||||||
|  |         v = adc * self.vadc / (1024 * 16)   # convert the 10 bit ADC value to a voltage | ||||||
|  |         r = self.rp * v / (self.vcc - v)    # resistance of thermistor | ||||||
|  |         lnr = log(r) | ||||||
|  |         Tinv = self.c1 + (self.c2*lnr) + (self.c3*pow(lnr,3)) | ||||||
|  |         return (1/Tinv) - 273.15        # temperature | ||||||
|  |  | ||||||
|  |     def adc(self,temp): | ||||||
|  |         "Convert temperature into a ADC reading" | ||||||
|  |         y = (self.c1 - (1/(temp+273.15))) / (2*self.c3) | ||||||
|  | 	x = sqrt(pow(self.c2 / (3*self.c3),3) + pow(y,2)) | ||||||
|  |         r = exp(pow(x-y,1.0/3) - pow(x+y,1.0/3)) # resistance of thermistor | ||||||
|  |         return (r / (self.rp + r)) * (1024*16) | ||||||
|  |  | ||||||
|  | def main(argv): | ||||||
|  |  | ||||||
|  |     rp = 4700; | ||||||
|  |     t1 = 25; | ||||||
|  |     r1 = 100000; | ||||||
|  |     t2 = 150; | ||||||
|  |     r2 = 1641.9; | ||||||
|  |     t3 = 250; | ||||||
|  |     r3 = 226.15; | ||||||
|  |     num_temps = int(36); | ||||||
|  |      | ||||||
|  |     try: | ||||||
|  |         opts, args = getopt.getopt(argv, "h", ["help", "rp=", "t1=", "t2=", "t3=", "num-temps="]) | ||||||
|  |     except getopt.GetoptError: | ||||||
|  |         usage() | ||||||
|  |         sys.exit(2) | ||||||
|  |          | ||||||
|  |     for opt, arg in opts: | ||||||
|  |         if opt in ("-h", "--help"): | ||||||
|  |             usage() | ||||||
|  |             sys.exit() | ||||||
|  |         elif opt == "--rp": | ||||||
|  |             rp = int(arg) | ||||||
|  |         elif opt == "--t1": | ||||||
|  |             arg =  arg.split(':') | ||||||
|  |             t1 = float( arg[0]) | ||||||
|  |             r1 = float( arg[1]) | ||||||
|  |         elif opt == "--t2": | ||||||
|  |             arg =  arg.split(':') | ||||||
|  |             t2 = float( arg[0]) | ||||||
|  |             r2 = float( arg[1]) | ||||||
|  |         elif opt == "--t3": | ||||||
|  |             arg =  arg.split(':') | ||||||
|  |             t3 = float( arg[0]) | ||||||
|  |             r3 = float( arg[1]) | ||||||
|  |         elif opt == "--num-temps": | ||||||
|  |             num_temps =  int(arg) | ||||||
|  |  | ||||||
|  |     max_adc = (1024 * 16) - 1 | ||||||
|  |     min_temp = 0 | ||||||
|  |     max_temp = 350 | ||||||
|  |     increment = int(max_adc/(num_temps-1)); | ||||||
|  |              | ||||||
|  |     t = Thermistor(rp, t1, r1, t2, r2, t3, r3) | ||||||
|  |     tmp = (min_temp - max_temp) / (num_temps-1) | ||||||
|  |     print tmp | ||||||
|  |     temps = range(max_temp, min_temp + tmp, tmp); | ||||||
|  |  | ||||||
|  |     print "// Thermistor lookup table for Marlin" | ||||||
|  |     print "// ./createTemperatureLookup.py --rp=%s --t1=%s:%s --t2=%s:%s --t3=%s:%s --num-temps=%s" % (rp, t1, r1, t2, r2, t3, r3, num_temps) | ||||||
|  |     print "#define NUMTEMPS %s" % (len(temps)) | ||||||
|  |     print "short temptable[NUMTEMPS][2] = {" | ||||||
|  |  | ||||||
|  |     counter = 0 | ||||||
|  |     for temp in temps: | ||||||
|  |         counter = counter +1 | ||||||
|  |         if counter == len(temps): | ||||||
|  |             print "   {%s, %s}" % (int(t.adc(temp)), temp) | ||||||
|  |         else: | ||||||
|  |             print "   {%s, %s}," % (int(t.adc(temp)), temp) | ||||||
|  |     print "};" | ||||||
|  |      | ||||||
|  | def usage(): | ||||||
|  |     print __doc__ | ||||||
|  |  | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     main(sys.argv[1:]) | ||||||
		Reference in New Issue
	
	Block a user