日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

博图编写温度程序_NTC测量温度的两个不同的数值转换程序,你会选择哪一个

發布時間:2025/3/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 博图编写温度程序_NTC测量温度的两个不同的数值转换程序,你会选择哪一个 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

采用如下的NTC測溫電路進行溫度測量。

將電源電壓經過固定電阻以及NTC電阻分壓送入單片機進行A/D轉換之后。

單片機程序從A/D模塊讀到數值,根據其與真實溫度之間的關系,將其轉換為真實溫度。

NTC測溫電路原理圖

NTC電阻Rt的阻值與溫度的關系為:

NTC的電阻阻值與溫度的關系

以12位的A/D為例,轉換得到的數值AD與電阻Rt的關系為:

A/D值與電阻的關系

大多數工程師根據這兩個公式自然而然推導出了溫度與A/D值之間的關系式。

溫度求解公式

得到這個公式以后,工程師很高興,高中所學的數學知識總算是沒有還給老師。

高興之余,就埋頭敲了以下的C語言,所幸C語言的math庫支持浮點數運算,還能做倒數和對數運算。

#define B 3950.0 //溫度系數

#define TN 298.15 //額定溫度(絕對溫度加常溫:273.15+25)

#define RN 10 // 額定阻值(絕對溫度時的電阻值10k)

#define BaseVol 3.30 //ADC基準電壓

float Get_Tempture(U16 adc)

{

float RV,RT,Tmp;

RV=BaseVol/4096.0*(float)adc;//ADC為10位ADC,求出NTC電壓:RV=ADCValu/1024*BaseVoltag

RT=RV*10/(BaseVol-RV);//求出當前溫度阻值 (BaseVoltage-RV)/R16=RV/RT;

Tmp=1/(1/TN+(log(RT/RN)/B))-273.15; //RT = RN exp*B(1/T-1/TN)

return Tmp;

}

編譯之后,并沒有報錯,燒寫到單片機,溫度顯示也很正確。

然后,產品就出貨了。

到了客戶手上,時不時出現了按鍵響應慢、通信出現誤碼等問題。

大部分單片機沒有硬件浮點運算器,做浮點數運算時會花費大量的時間。

而對數運算也多轉換為冪級數展開進行運算,涉及到大量的乘法運算。

即使cortex-M3系列處理器有單指令周期的乘法器,上述運行可以也要幾毫秒時間。

對于沒有硬件乘法器的單片機,比如PIC16系列的單片機,以及幾毛錢一片的OTP的單片機,做上述運算估計得耗費幾十秒時間。

大部分程序員編寫代碼時沒有時間片以及分時處理的概念,一個耗時操作閉著眼晴就執行到底。

到最后主程序忙不過來了,就把需要即時處理的代碼一股腦放在中斷程序里面處理。

最后,整個軟件時間性差,時不時會出現丟數據,無響應等情況。

編寫軟件一定要結合平臺考慮時間復雜度和空間復雜度,

必須要根據產品的功能合理安排時間和空間,以便做到最佳性能。

對于A/D值到溫度的轉換,最快速的方法是通過查表加分段線性插值處理。

我們可以把 0度-100度對應的AD值存到一個100*16bit的const 表。

將得到的A/D數值從這個表中找到對應的區域。

在這個區域進行線性插值,得到相應的數值。代碼如下:

#define AD_TEMP_RANGE_NUM 101

#define AD_TEMP_VALUE_MAX 3739

#define AD_TEMP_VALUE_MIN 1241

#define AD_TEMP_TEMP_MAX 1000

#define AD_TEMP_TEMP_MIN 0

///10K B= 3980

const U16 adrange[AD_TEMP_RANGE_NUM] =

{

3740,

3723,

3705,

3687,

3668,

3648,

3628,

3607,

3585,

3563,

3541,

3517,

3493,

3469,

3444,

3418,

3392,

3365,

3338,

3310,

3282,

3253,

3224,

3194,

3164,

3134,

3103,

3072,

3040,

3009,

2976,

2944,

2912,

2879,

2846,

2813,

2780,

2746,

2713,

2680,

2647,

2613,

2580,

2547,

2514,

2481,

2448,

2416,

2384,

2352,

2320,

2288,

2257,

2226,

2195,

2165,

2135,

2106,

2077,

2048,

2020,

1992,

1964,

1937,

1910,

1884,

1858,

1833,

1808,

1784,

1760,

1737,

1714,

1691,

1669,

1647,

1626,

1605,

1585,

1565,

1546,

1527,

1508,

1490,

1472,

1455,

1438,

1422,

1406,

1390,

1374,

1360,

1345,

1331,

1317,

1303,

1290,

1277,

1265,

1252,

1240

};

U16 temp;

advalue = AD_GET_VAL(0);

if(advalue >= AD_TEMP_VALUE_MAX)

{

temp = AD_TEMP_TEMP_MIN;

}

else if(advalue < AD_TEMP_VALUE_MIN)

{

temp = AD_TEMP_TEMP_MAX;

}

else

{

for(j = 0; j< (AD_TEMP_RANGE_NUM - 1); j++)

{

if((advalue[i] < adrange[j])

&& (advalue[i] >= adrange[j + 1]))

{

uchDiff = adrange[j] - adrange[j + 1];

uchData = adrange[j] - advalue[i];

uiData = uchData * 10;

uiData = uiData + (uchDiff >> 1);

uchData = uiData / uchDiff;

uiData = j * 10;

temp= uiData + uchData;

break;

}

}

}

帶個轉換過程在72MHz的主頻時,耗時大概在幾個us。

該程序可以進一步優化,改為二分法查找。

總結

以上是生活随笔為你收集整理的博图编写温度程序_NTC测量温度的两个不同的数值转换程序,你会选择哪一个的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。