Jump to content
43oh

Thermistor code for MSP430


Recommended Posts

  • 6 months later...
  • 1 month later...

Your code looks like what I am looking for, but I am trying to adapt this to an Ametherm nt03 50169 thermistor (

www.ametherm.com/datasheetspdf/NT03%2050169.pdf ).

 

I see on the datasheet for your thermistor where you get the values for r0, t0 and beta but I'm not sure about the r1, r2 and max adc. Also, going on your datasheet, I can't figure out how you built the look up table. Maybe you could explain it... kinda of Thermistor Look-up Tables for Dummies :)

 

Thanks...

Link to post
Share on other sites

OK.. so I found this on my own. Here's what I found in case anyone else has the same questions I did:

 

The Python script used to generate the look up table is found here:

http://reprap.svn.sourceforge.net/viewvc/reprap/trunk/reprap/firmware/Arduino/utilities/createTemperatureLookup.py?view=markup&pathrev=3448

 

This is the original schematic that goes with the script:

http://reprap.org/wiki/Temperature_Sensor_2_0#Schematic

 

The values for R0, T0 and Beta are found in your thermistor's datasheet, where T0 typically equals 25 (degrees Celsius) and R0 is the thermistor's resistance at T0 (25 degrees Celsius). R1 should be 0 if you are not using a resistor in parallel with the thermistor. R2 is the value of the divider resistor you wish to use. The script then calculates the value MAX ADC as well as the look up table.

 

There is a small error in the script. One of the options shown in the help screen is num-temp. This option allows you to specify the number of entries in the table. The code for this option is missing from the script, however. I have added the missing code and I am adding the fixed code below if you need it.

 

For the thermistor shown in this topics code, the command line for the script would read:

 

python createTemperatureLookup.py --r0=100000 --t0=25 --r1=0 --r2=1000 --beta=4036

 

I hope that this helps save some headache and searching.

 

#!/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
#
# use sensor.jpg as a schematic reference - use '0' for r1 with no parallel resistor

"""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
 --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 http://reprap.org/bin/view/Main/MeasuringThermistorBeta
 --r1=...            R1 rating where # is the ohm rating of R1 (eg: 10K = 10000) - typically 0
 --r2=...             R2 rating where # is the ohm rating of R2 (eg: 10K = 10000)
 --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, 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.0					 # ADC reference
    self.vcc = 5.0					  # 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)) - 273.15	    # temperature

   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 = 10000;
   t0 = 25;
   beta = 3947;
   r1 = 680;
   r2 = 1600;
   num_temps = int(20);

   try:
    opts, args = getopt.getopt(argv, "h", ["help", "r0=", "t0=", "beta=", "r1=", "r2=", "num-temps="])
   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)
   elif opt == "--num-temps":
  	 num_temps = 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:])

Link to post
Share on other sites
  • 10 months later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...