NTC ile Sıcaklık Ölçümü

Başlatan picker, 20 Nisan 2009, 01:55:00


kimlenbu

#91
Benim dc motor sürücüsünde kullandığım ntc ölçüm fonksiyonum, işine yarayan olursa :

float GetTemperature(void){

const float multiplier=(float)3300/(float)4096;
 float vo=0; //Voltage Divider Voltage
 float temp=0; //NTC Calculated Temperature
 float r0=10000; //NTC Resistance at 25 C
 float r1=0; //NTC Resistance
const float r2=10000; //NTC Series Resistance
const float vi=3300; //input voltage 3300mV
const float b=4050; //NTC coefficent
const float t0=293.15; //room temp 25 C = 293.15K
 
 // 1/T = 1/T0 + 1/B * ln(R/R0)
 // T : Temperature
 // T0: Room Temperature (293.15K)
 // B : NTC Coefficent
 // R : NTC Resistance
 // R0: NTC Resistance at 25 C
 
 //TemperatureRaw=ADC_DualConvertedValueTab[0];
 TemperatureRaw=(tmpTemperatureTotal/ADCSample); //buraya takılmayın birden fazla örnek alıp toplayıp sample sayısına bölüp daha doğru bir sonuç alınması sağlanıyor
 vo=TemperatureRaw*multiplier;
 r1=r2*((vi/vo)-1);
 temp=(1/((1/t0)+(1/b)*log(r1/r0)))-273.15;
 flagTemperatureReady=0;
 return temp;
}


Erol YILMAZ

Aşağıdaki kod bahsi geçen NTC ile çalışır. C veya F çıkış verir.
Mcu'lar için nispeten hızlı olması için Piecewise Linear Approximation
ile yapılmıştır. Float yerine INT16 optimizasyonu yapılabilir.

// NTC : LM03-103F-B, 3435 Ozdisan
// Pull-Up : 10K %1
// ADC Resolution : 10bit
// Result : float C or F
// Fault Result: 32767

https://www.onlinegdb.com/online_c_compiler

#include <stdio.h>

// NTC : LM03-103F-B, 3435 Ozdisan
// Pull-Up : 10K %1
// ADC Resolution : 10bit
// Result : float C or F
// Fault Result: 32767

float tempC;

// lookup table....
#define	NSEG	24
int adc_raw[NSEG]   = {    71,    81,    92,   106,   120,   138,   158,   181,   207,   237,   271,   308,   350,   395,  496,  549,  604,  657,  803,   844,   879,   910,   956,   973};
float  temp_C[NSEG] = { 110.4, 104.7,  99.3,  93.3,  88.2,  82.4,  76.8,  71.2,  65.7,  60.1,  54.5,  49.0,  43.4,  37.9, 26.7, 21.2, 15.5, 10.1, -6.6, -12.2, -17.7, -23.4, -34.5, -40.2};
float  temp_F[NSEG] = { 230.8, 220.5, 210.7, 200.0, 190.7, 180.3, 170.2, 160.2, 150.3, 140.2, 130.0, 120.2, 110.1, 100.1, 80.0, 70.1, 60.0, 50.1, 20.2,  10.0,   0.2, -10.1, -30.1, -40.4};

float NtcRead_NEW2(int wADCVal, char tempType){

char index;
float tmpVal0, tmpVal1;
float tmpValPropAdc;
float result;

	if(wADCVal < adc_raw[0])		return(32767);
	if(wADCVal > adc_raw[NSEG-1])	return(32767);

	for (index=0; index<(NSEG-1); index++){

		if( (wADCVal >= adc_raw[index]) && (wADCVal < adc_raw[index+1]) ){

			if(tempType == 'F')	{ tmpVal1 = temp_F[index+1];	tmpVal0 = temp_F[index]; }
			else				{ tmpVal1 = temp_C[index+1];	tmpVal0 = temp_C[index]; }
			tmpValPropAdc = (float) (wADCVal - adc_raw[index+1]) / (float) (adc_raw[index+1] - adc_raw[index]);
			result = tmpValPropAdc * (tmpVal1-tmpVal0) + tmpVal1;
			return (result);
		}
	}
return(32767);
}

int main(){
    tempC = NtcRead_NEW2(973, 'F');
    printf("ADC 73 = %f\n", tempC);
    return 0;
}