• Announcements

    • bluehash

      Forum Upgrade   03/11/2017

      Hello Everyone, Thanks for being patient while the forums were being fixed and upgraded. Please see details and report issues in this thread. Thanks!
larsie

Thermistor code for MSP430

5 posts in this topic

Thank oy larise!

 

Based on the information shared, I've developed a sketch to read the temperature from the FranchPad MSP430FR5739 built-in NTC and display in

Share this post


Link to post
Share on other sites

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...

Share this post


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:])

Share this post


Link to post
Share on other sites

Hi guys!

I would make a question inherent to larsie's code. If i would use it in Code Composer Studio 5.5, how can i adapt it?

Thanks!!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now