博图编写温度程序_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测量温度的两个不同的数值转换程序,你会选择哪一个的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 禁用win10触摸屏手势_我才发现win
- 下一篇: 分区报无效的参数_西门子70系列变频器5