Thermocouples: temperature to emf (or vice verca)



#pragma rtGlobals=1		// Use modern global access method.


//The function emf2T converts a thermocouple electromotive force (emf, in milli volts  to temperature (in Celsius) or vice verca; 
//currently for B, S and C-Type thermocouples. All coefficients taken from ASTM E-230.
//
//syntax:		        emf2T(TC_string, temp, emf)
//Parameters:     	TC_string	is a string indicating the thermocouple type, here B, S or C
//				tmp			is temperature in Celsius
//				emf			is the emf in mV
//							The value that needs to be calculated must be entered as NaN			
//
//To convert a temperature into an emf value use e.g. 	print 	emf2T("B", 1400, nan)		
//To convert emf to temperature use e.g.			print 	emf2T("B", nan, 8.956)



function emf2T(type, Tmp, emf)
	string type
	variable Tmp, emf
	
	variable c0, c1,c2,c3,c4,c5,c6,c7,c8, c9
	
	c1 = 0		//if not assigned later make sure they are all zero
	c2 = 0
	c3 = 0
	c4 = 0
	c5 = 0
	c6 = 0
	c7 = 0
	c8 = 0
	c9 = 0
	
	
	
	// *********************************************************************************************
	// ***********************       B- Type thermocouples Pt6%Rh / Pt30%Rh          *************************
	// *********************************************************************************************
		
	strswitch(type)
		case "B":			
	
		if (numtype(Tmp) == 0 && numtype(emf) == 2)		// this is a temperature to EMF conversion

			if (tmp >= 0 && tmp <= 630.615)
		
				c0 = 0.000000000000E+00
				c1 =-0.246508183460E-03
				c2 = 0.590404211710E-05
				c3 =-0.132579316360E-08
				c4 = 0.156682919010E-11
				c5 =-0.169445292400E-14
				c6 = 0.629903470940E-18
				c7 = 0
				c8 = 0
	
				return c0*tmp^0 + c1*tmp^1 +c2*tmp^2 +c3*tmp^3 +c4*tmp^4 +c5*tmp^5 +c6*tmp^6  +c7*tmp^7  +c8*tmp^8 
			endif
	
			if (tmp > 630.615 && tmp <= 1820)
		
				c0 = -0.389381686210E+01
				c1 = 0.285717474700E-01
				c2 =-0.848851047850E-04
				c3 = 0.157852801640E-06
				c4 =-0.168353448640E-09
				c5 = 0.111097940130E-12
				c6 =-0.445154310330E-16
				c7 = 0.989756408210E-20
				c8 =-0.937913302890E-24
	
				return c0*tmp^0 + c1*tmp^1 +c2*tmp^2 +c3*tmp^3 +c4*tmp^4 +c5*tmp^5 +c6*tmp^6  +c7*tmp^7  +c8*tmp^8 
			endif
		
		endif
		
		if (numtype(Tmp) == 2 && numtype(emf) == 0)		// this is a EMF to temperature conversion
			
			if (emf >= 0.291 && emf <= 2.431)
			
				c0 = 	 9.8423321E+01 
     			  	c1 =   6.9971500E+02  
			   	c2 =     -8.4765304E+02
				c3 =        1.0052644E+03  
				c4 =       -8.3345952E+02 
				c5 =       4.5508542E+02  
				c6 =      -1.5523037E+02 
				c7 =        2.9886750E+01  
				c8 =       -2.4742860E+00 
				
				return  c0 + c1*emf^1 +c2*emf^2 +c3*emf^3 +c4*emf^4 +c5*emf^5 +c6*emf^6  +c7*emf^7  +c8*emf^8 
			endif
			
			if (emf > 2.431 && emf <= 13.82)
				
				c0 = 	2.1315071E+02 
   				c1 =    2.8510504E+02 
    				c2 =    -5.2742887E+01 
  				c3 =     9.9160804E+00 
   				c4 =     -1.2965303E+00 
  				c5 =      1.1195870E-01 
   				c6 =     -6.0625199E-03 
   				c7 =       1.8661696E-04 
  				c8 =    -2.4878585E-06 
				
				
				return   c0 + c1*emf^1 +c2*emf^2 +c3*emf^3 +c4*emf^4 +c5*emf^5 +c6*emf^6  +c7*emf^7  +c8*emf^8 	
			endif		
		endif
		break
		
		
		// *********************************************************************************************
		// ***********************       S- Type thermocouples Pt / Pt10%Rh          ******************************
		// *********************************************************************************************
		
		
		
		case "S":			
	
		if (numtype(Tmp) == 0 && numtype(emf) == 2)		// this is a temperature to EMF conversion

			if (tmp >= -50  && tmp <= 1064.18)
		
				c0 = 0.000000000000E+00
				c1 =0.540313308631E-02
				c2 = 0.125934289740E-04
				c3 =-0.232477968689E-07
				c4 = 0.322028823036E-10
				c5 =-0.331465196389E-13
				c6 = 0.255744251786E-16
				c7 =-0.125068871393E-19
				c8 = 0.271443176145E-23
	
				return c0*tmp^0 + c1*tmp^1 +c2*tmp^2 +c3*tmp^3 +c4*tmp^4 +c5*tmp^5 +c6*tmp^6  +c7*tmp^7  +c8*tmp^8 
			endif
	
			if (tmp > 1064.18 && tmp <= 1664.5)
				
				c0 = 0.132900444085E+01
				c1 =  0.334509311344E-02
				c2 =  0.654805192818E-05
				c3 = -0.164856259209E-08
				c4 =  0.129989605174E-13
					
				return c0*tmp^0 + c1*tmp^1 +c2*tmp^2 +c3*tmp^3 +c4*tmp^4 +c5*tmp^5 +c6*tmp^6  +c7*tmp^7  +c8*tmp^8 
			endif
			
			if (tmp > 1664.5  && tmp <= 1768.1)
		
				c0 = 	0.146628232636E+03
				c1 = -0.258430516752E+00
				c2 =  0.163693574641E-03
				c3 = -0.330439046987E-07
				c4 = -0.943223690612E-14
					
				return c0*tmp^0 + c1*tmp^1 +c2*tmp^2 +c3*tmp^3 +c4*tmp^4 +c5*tmp^5 +c6*tmp^6  +c7*tmp^7  +c8*tmp^8 
			endif		
		endif
		
		
		
		if (numtype(Tmp) == 2 && numtype(emf) == 0)		// this is a EMF to temperature conversion
			
			if (emf >= -0.235 && emf <= 1.874)
			
				c0	=	0
				c1	=	1.84949460E+02
				c2	=	-8.00504062E+01
				c3	=	1.02237430E+02
				c4	=	-1.52248592E+02
				c5	=	1.88821343E+02
				c6	=	-1.59085941E+02
				c7	=	8.23027880E+01
				c8	=	-2.34181944E+01
				c9	=	2.79786260E+00
													
				return  c0 + c1*emf^1 +c2*emf^2 +c3*emf^3 +c4*emf^4 +c5*emf^5 +c6*emf^6  +c7*emf^7  +c8*emf^8 +c9*emf^9
			endif
			
			if (emf > 1.874 && emf <=11.950)
				
				c0	=	1.291507177E+01
				c1	=	1.466298863E+02
				c2	=	-1.534713402E+01
				c3	=	3.145945973
				c4	=	-4.163257839E-01
				c5	=	3.187963771E-02
				c6	=	-1.291637500E-03
				c7	=	2.183475087E-05
				c8	=	-1.447379511E-07
				c9	=	8.211272125E-09
			
				
				return  c0 + c1*emf^1 +c2*emf^2 +c3*emf^3 +c4*emf^4 +c5*emf^5 +c6*emf^6  +c7*emf^7  +c8*emf^8 +c9*emf^9
			endif	
			
			if (emf > 11.950 && emf <= 17.536)
			
				c0	=	-8.087801117E+01
				c1	=	1.621573104E+02
				c2	=	-8.536869453E+00
				c3	=	4.719686976E-01
				c4	=	-1.441693666E-02
				c5	=	2.081618890E-04
				
		
				return   c0 + c1*emf^1 +c2*emf^2 +c3*emf^3 +c4*emf^4 +c5*emf^5 +c6*emf^6  +c7*emf^7  +c8*emf^8 	
			endif	
			
			if (emf > 17.536 && emf <= 18.693)
			
				c0	=	5.333875126E+04
				c1	=	-1.235892298E+04
				c2	=	1.092657613E+03
				c3	=	-4.265693686E+01
				c4	=	6.247205420E-01
				
			
				return   c0 + c1*emf^1 +c2*emf^2 +c3*emf^3 +c4*emf^4 +c5*emf^5 +c6*emf^6  +c7*emf^7  +c8*emf^8 	
			endif		
			
		endif
		break
		
		
		// *********************************************************************************************
		// ***********************    C- Type thermocouples W5%Re / W26%Re     *****************************
		// *********************************************************************************************
		
		case "C":			
	
		if (numtype(Tmp) == 0 && numtype(emf) == 2)		// this is a temperature to EMF conversion

			if (tmp >= 0 && tmp <= 630.615)
		
				c0 = 0.0000000 
				c1 = 1.34060323e-2 
				c2 = 1.19249923e-5 
				c3 = -7.98063543e-9 
				c4 = -5.07875153e-12 
				c5 = 1.31641973e-14 
				c6 = -7.91973323e-18 
	
				return c0*tmp^0 + c1*tmp^1 +c2*tmp^2 +c3*tmp^3 +c4*tmp^4 +c5*tmp^5 +c6*tmp^6  
			endif
	
			if (tmp > 630.615 && tmp <= 2315)
			
				c0 =  4.05288233e-1
				c1 =  1.15093553e-2
				c2 =  1.56964533e-5
				c3 =  -1.37044123e-8
				c4 =  5.22908733e-12
				c5 =  -9.20827583e-16
				c6 = 4.52451123e-20
		
				return c0*tmp^0 + c1*tmp^1 +c2*tmp^2 +c3*tmp^3 +c4*tmp^4 +c5*tmp^5 +c6*tmp^6  
			endif
		
		endif
		
		if (numtype(Tmp) == 2 && numtype(emf) == 0)		// this is a EMF to temperature conversion
					
			c0 = 0.0
			c1 = 7.4124732e1
			c2 = -4.28082813
			c3 = 5.21138920e-1
			c4 = -4.57487201e-2
			c5 = 2.80578284e-3
			c6 = -1.13145137e-4
			c7 = 2.85489684e-6
			c8 = -4.07643828e-8
			c9 = 2.51358071e-10
			
			return  c0 + c1*emf^1 +c2*emf^2 +c3*emf^3 +c4*emf^4 +c5*emf^5 +c6*emf^6  +c7*emf^7  +c8*emf^8 +c9*emf^9	
		endif
		break
				
	
		default:
			break
	endswitch
		
	
	return NaN   // if non of the other if-statements are entered, return NaN
end


That's terrific! A lot of effort typing in all those constants!

I would comment that the straightforward method of evaluating a polynomial has potential problems caused by floating-point truncation errors. A better way to do it is outlined in Numerical Recipes. This method is followed by the Igor poly() function, so I would recommend poly(). To use it, you need to create a wave with the coefficients, something like this fragment that implements just one part of your function:

			if (tmp > 630.615 && tmp <= 2315)
 
 				Make/D/FREE cw = {4.05288233e-1,  1.15093553e-2,   1.56964533e-5, -1.37044123e-8, 5.22908733e-12, -9.20827583e-16, 4.52451123e-20}
 
				return poly(cw, tmp)
			endif


John Weeks
WaveMetrics, Inc.
support@wavemetrics.com

There's a GUI for thermocouple emf calculations here: https://www.wavemetrics.com/node/21411
It does S, B, R, K, T, E, J, N, C, and D types, and includes cold junction compensation. It should convert between emf and temperature in either direction, depending on which setvariable you adjust.

Himmelkreuzdonnerwetter! I've just noticed the identity of the original poster - Hi Christian! I guess there aren't so many people out there using types C and D :) I wonder, was it I who introduced you to the delights of Igor back in Hannover in the late 90s, or did you pick it up somewhere further on down the line?
Hi Tony,

(I haven't been looking here for a while)
yes, indeed! It is all your fault! ;-)

C
Heyy. Anyone know how to apply the cold junction compensation for the thermocouple. Thanks

Forum

Support

Gallery

Igor Pro 10

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More