borrowed (thermistor for toaster reflow) need help March 24, 2015 07:44PM |
Registered: 12 years ago Posts: 279 |
#!/usr/bin/python # # Creates a C code lookup table for doing ADC to temperature conversion # on a microcontroller # based on: [hydraraptor.blogspot.com] """Thermistor Value Lookup Table Generator Generates lookup to temperature values for use in a microcontroller in C format based on: [hydraraptor.blogspot.com] The main use is for Arduino programs that read data from the circuit board described here: [make.rrrf.org] Usage: python createTemperatureLookup.py [options] Options: -h, --help show this help --r0=... thermistor rating where # is the ohm rating of the thermistor at t0 (eg: 10K = 10000) --t0=... thermistor temp rating where # is the temperature in Celsuis to get r0 (from your datasheet) --beta=... thermistor beta rating. see [reprap.org] --r1=... R1 rating where # is the ohm rating of R1 (eg: 10K = 10000) --r2=... R2 rating where # is the ohm rating of R2 (eg: 10K = 10000) --num-temps=... the number of temperature points to calculate (default: 20) --max-adc=... the max ADC reading to use. if you use R1, it limits the top value for the thermistor circuit, and thus the possible range of ADC values """ from math import * import sys import getopt class Thermistor: "Class to do the thermistor maths" def __init__(self, r0, t0, beta, r1, r2): self.r0 = r0 # stated resistance, e.g. 10K self.t0 = t0 + 273.15 # temperature at stated resistance, e.g. 25C self.beta = beta # stated beta, e.g. 3500 self.vadc = 5.20 # ADC reference self.vcc = 5.20 # supply voltage to potential divider self.k = r0 * exp(-beta / self.t0) # constant part of calculation if r1 > 0: self.vs = r1 * self.vcc / (r1 + r2) # effective bias voltage self.rs = r1 * r2 / (r1 + r2) # effective bias impedance else: self.vs = self.vcc # effective bias voltage self.rs = r2 # effective bias impedance def temp(self,adc): "Convert ADC reading into a temperature in Celcius" v = adc * self.vadc / 1024 # convert the 10 bit ADC value to a voltage r = self.rs * v / (self.vs - v) # resistance of thermistor return (self.beta / log(r / self.k))*10 # temperature /*times 10 in kelvin*/ def setting(self, t): "Convert a temperature into a ADC value" r = self.r0 * exp(self.beta * (1 / (t + 273.15) - 1 / self.t0)) # resistance of the thermistor v = self.vs * r / (self.rs + r) # the voltage at the potential divider return round(v / self.vadc * 1024) # the ADC reading def main(argv): r0 = 100000; t0 = 25; beta = 3987; r1 = 0; r2 = 4700; num_temps = int(65); try: opts, args = getopt.getopt(argv, "h", ["help", "r0=", "t0=", "beta=", "r1=", "r2="]) except getopt.GetoptError: usage() sys.exit(2) for opt, arg in opts: if opt in ("-h", "--help"): usage() sys.exit() elif opt == "--r0": r0 = int(arg) elif opt == "--t0": t0 = int(arg) elif opt == "--beta": beta = int(arg) elif opt == "--r1": r1 = int(arg) elif opt == "--r2": r2 = int(arg) if r1: max_adc = int(1023 * r1 / (r1 + r2)); else: max_adc = 1023 increment = int(max_adc/(num_temps-1)); t = Thermistor(r0, t0, beta, r1, r2) adcs = range(1, max_adc, increment); # adcs = [1, 20, 25, 30, 35, 40, 45, 50, 60, 70, 80, 90, 100, 110, 130, 150, 190, 220, 250, 300] first = 1 print "// Thermistor lookup table for RepRap Temperature Sensor Boards (http://make.rrrf.org/ts)" print "// Made with createTemperatureLookup.py (http://svn.reprap.org/trunk/reprap/firmware/Arduino/utilities/createTemperatureLookup.py)" print "// ./createTemperatureLookup.py --r0=%s --t0=%s --r1=%s --r2=%s --beta=%s --max-adc=%s" % (r0, t0, r1, r2, beta, max_adc) print "// r0: %s" % (r0) print "// t0: %s" % (t0) print "// r1: %s" % (r1) print "// r2: %s" % (r2) print "// beta: %s" % (beta) print "// max adc: %s" % (max_adc) print "#define NUMTEMPS %s" % (len(adcs)) print "short temptable[NUMTEMPS][2] = {" counter = 0 for adc in adcs: counter = counter +1 if counter == len(adcs): print " {%s, %s}" % (adc, int(t.temp(adc))) else: print " {%s, %s}," % (adc, int(t.temp(adc))) print "};" def usage(): print __doc__ if __name__ == "__main__": main(sys.argv[1:]) help terramir
Re: borrowed (thermistor for toaster reflow) need help March 25, 2015 04:29AM |
Admin Registered: 17 years ago Posts: 7,879 |
Re: borrowed (thermistor for toaster reflow) need help March 25, 2015 06:10AM |
Registered: 10 years ago Posts: 14,672 |
const float ABS_ZERO = -273.15; const float R25 = 100000; // put your thermistor resistance @ 25C here const float Beta = 4200; // put you thermistor beta value here const float SeriesR = 4700; // put your thermistor series resistance here const float Rinf = R25 * exp(-Beta / (25.0 - ABS_ZERO)); const unsigned int adRange = 1023; // 1023 for a 10-bit ADC, 4095 for 12-bit float GetTemperature() { unsigned int reading = analogRead(thermistorPin); float resistance = reading * SeriesR / (adRange + 1 - reading); return (resistance <= Rinf) ? 2000.0 // thermistor short circuit, return a high temperature : ABS_ZERO + Beta / log(resistance / RInf); }
Re: borrowed (thermistor for toaster reflow) need help March 26, 2015 01:59AM |
Registered: 12 years ago Posts: 279 |
Re: borrowed (thermistor for toaster reflow) need help March 26, 2015 04:57AM |
Registered: 10 years ago Posts: 14,672 |
Re: borrowed (thermistor for toaster reflow) need help March 26, 2015 01:29PM |
Registered: 12 years ago Posts: 279 |
Re: borrowed (thermistor for toaster reflow) need help March 26, 2015 01:33PM |
Registered: 10 years ago Posts: 14,672 |
Quote
terramir
as for measuring the interval, how would I do that? that is something I never have done.
terramir