熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2022-6-8 18:05
正文摘要:這是一段使用Steinhart-hart方程做ntc測(cè)溫的代碼。這個(gè)函數(shù)只需要ntc100度和ntc0度的固定值和一個(gè)現(xiàn)場(chǎng)測(cè)得的ad值就可以測(cè)出溫度,其中是怎么利用ad值計(jì)算出當(dāng)前溫度的電阻值的,有沒有大佬可以解答一下呢? /****** ... |
直接查表就好了 |
其實(shí)既然使用了能計(jì)算對(duì)數(shù)的單片機(jī),那么是不是直接查表就好了,畢竟廠家提供的數(shù)據(jù)表也只是整數(shù)溫度,那么計(jì)算出來的小數(shù)溫度又是否能代表精度呢 |
這個(gè)問題的討論對(duì)于我理解NTC的計(jì)算很有幫助。 謝謝你! |
hui7279 發(fā)表于 2024-1-20 16:17 //據(jù)Steinhart-hart方程計(jì)算溫度值,RT可能用Tr表達(dá)會(huì)更準(zhǔn)確: //據(jù)Steinhart-hart方程計(jì)算溫度值,是最后Rt值已轉(zhuǎn)化為溫度值Tr,用同一個(gè)變量減少內(nèi)存消耗 |
本帖最后由 hui7279 于 2024-1-20 17:03 編輯 REF=94980*2069*(advalue_NT0-advalue_NT100); //將ADC值轉(zhuǎn)換為校準(zhǔn)的ADC值 REF=REF/(94980*(advalue_NT100-advalue_NTShort)-2069*(advalue_NT0-advalue_NTShort)); //將ADC值轉(zhuǎn)換為硬件的實(shí)際電壓值 VREF=(advalue_NT100-advalue_NTShort)*((2069+REF)/2069); //將ADC值電壓轉(zhuǎn)換基準(zhǔn)點(diǎn),與硬件接高低位有關(guān) advalue=advalue-advalue_NTShort; //將電壓值轉(zhuǎn)換為電阻值 Rt=(advalue*REF)/(VREF-advalue); //據(jù)Steinhart-hart方程計(jì)算中間值ln(Rt) LNR=log(Rt); //據(jù)Steinhart-hart方程計(jì)算溫度值,RT最后轉(zhuǎn)化為Tr,用同一個(gè)變量節(jié)約內(nèi)存 Rt=(1/(0.00093494+(0.0002211*LNR)+(0.0000001275*LNR*LNR*LNR)))-273.15; /****************************************** Steinhart-Hart方程計(jì)算法: 1/T = A + B*ln(R) + C*[ln(R)]^3 由于:T值在公式中是用熱力學(xué)溫度單位K,攝氏度就要減273.15; 此公式中:A=0.0009349, B=0.0002211, C =0.0000001275 ABC值與硬件NTC有關(guān),不同廠家的NTC表值需要用不同參數(shù); --------------------------------------------------- ABC值的計(jì)算方法: 具體可以將要用到的三個(gè)關(guān)鍵溫度點(diǎn)值:T0、T1、T2、R0、R1、R2; 利用計(jì)算ln(R0)、ln(R1)、ln(R2);代入Steinhart-Hart方程(溫度值要+273.15) 得到三元一次方程組,可以用矩陣法解方程法,具體查常用C算法函數(shù); 也可用EXCEL的方法解三元一次方程組,具體可以百度 ************************************************/ |
剛好也在研究一個(gè)儀器的NTC測(cè)溫電路,界面顯示是一個(gè)電壓值多少mv,旁邊一個(gè)溫度值。能查到系統(tǒng)的a b c值,正在研究中,有什么進(jìn)展大家共同分享 |
Y_G_G 發(fā)表于 2022-6-9 13:31 我認(rèn)為這個(gè)方程好像貝塞爾曲線通過控制點(diǎn)擬合的結(jié)果 |
路明非. 發(fā)表于 2022-6-8 22:19 想要精度高就查表 |
溫度計(jì)算,Steinhart-Hart方程和B值法 使用Steinhart-Hart方程或者B值計(jì)算方法將熱敏電阻的電阻值轉(zhuǎn)換為溫度讀數(shù)。 Steinhart-Hart方程計(jì)算法: 1/T = A + B*ln(R) + C*[ln(R)] 這里: T 為絕對(duì)溫度K(開爾文溫度),R 單位是歐姆 . 溫度系數(shù)B值計(jì)算法: Rt = R(25℃)*exp[B*(1/T - 1/298.15)] 這里:T 為絕對(duì)溫度K(開爾文溫度 = 273.15),R(25℃) 是熱敏電阻在 25℃時(shí)的阻值 (單位為Ω),exp是e的n次方; 3. C語言實(shí)現(xiàn)的溫度計(jì)算公式 Tsteinhart = 1/(A+B*log(Rth)+C*pow(log(Rth),3))-273.15; Tbeta = 1/(1/(273.15+25)+1/Beta*log(Rth/R25))-273.15; ln、log、lg在數(shù)學(xué)公式中和c語言中的區(qū)別: 參考:cplusplus的"<cmath> (math.h) - C++ Reference"這篇文章 數(shù)學(xué)中l(wèi)og是對(duì)數(shù)符號(hào),右邊寫真數(shù)和底數(shù)(上面是真數(shù),下面是底數(shù))lg是以10為底數(shù)(例lg100=2)(lg為常用對(duì)數(shù))ln是以e為底數(shù)(lne2=2)(ln為自然對(duì)數(shù) e=2.718281828459045...) c語言里面只有兩個(gè)函數(shù)log和log10,其中函數(shù) log(x) 表示是以e為底的自然對(duì)數(shù),即 ln(x)函數(shù)。 log10(x) 以10為底的對(duì)數(shù),即 lg(x)。以其它數(shù)為底的對(duì)數(shù)用換底公式來表示:loga(b)=ln(b)/ln(a),C語言表示成log(b)/log(a)。 |
Hephaestus 發(fā)表于 2022-6-8 21:10 樓主所列代碼確實(shí)沒看懂。只知道NTC是在25度條件下的標(biāo)稱精度,25~50度的標(biāo)稱B值。偏離標(biāo)準(zhǔn)溫度越多,精度和B值誤差越大。用固定公式計(jì)算,除非對(duì)NTC元件預(yù)選,否則很難批量生產(chǎn)。大佬如有自動(dòng)糾偏的方法,還望分享。 ![]() |
Y_G_G 發(fā)表于 2022-6-8 21:46 你錯(cuò)了,Steinhart-hart方程用這兩句就解決完了,完全沒有任何難度,不存在看不懂的地方。 LNR=log(Rt); Rt=(1/(0.00093494+(0.0002211*LNR)+(0.0000001275*LNR*LNR*LNR)))-273.15; 樓主的問題是第一句的Rt是怎么來的,這個(gè)前面的代碼也太復(fù)雜了,要?jiǎng)邮炙闼恪?/td> |
Y_G_G 發(fā)表于 2022-6-8 21:46 知道原理才能改進(jìn)提高啊,這個(gè)利用三個(gè)點(diǎn)校準(zhǔn)也是為了提高測(cè)溫的精度,而且這樣測(cè)溫精度高反應(yīng)速度也快 |
如果不是內(nèi)存實(shí)在不夠用,NTC用查表是常用也是最實(shí)在的 至于這個(gè)方程的原理,它是兩個(gè)老外一個(gè)叫Steinhart,一個(gè)叫Hart,合起來就是Steinhart-Hart,根據(jù)熱敏電阻的特性研究出來的 個(gè)人感覺原理什么的并不重要,你上網(wǎng)也不一定能查得到,會(huì)用就行 電子編程這一塊,那么多恐怖的公式,哪能個(gè)個(gè)都知道原理呀 |
wulin 發(fā)表于 2022-6-8 20:40 你看了代碼再來發(fā)言好不好?什么都不懂就上來胡說很沒有禮貌的。樓主明顯是個(gè)30k的NTC,B值未知。而且標(biāo)定了三個(gè)點(diǎn),1)短路NTC測(cè)試放大以及ADC環(huán)節(jié)的誤差;2)0度時(shí)NTC的值;3)100度時(shí)NTC的值。 |
wulin 發(fā)表于 2022-6-8 20:40 實(shí)際情況是ntc測(cè)溫的確用的公式計(jì)算的而且測(cè)溫精度還很高,具體參考Steinhart-hart方程 |
樓主所述NTC熱敏電阻可能是PT100、PT1000等鉑電阻。普通NTC熱敏電阻幾乎不可能通過公式計(jì)算獲得較準(zhǔn)確溫度值。NTC熱敏電阻不同廠家產(chǎn)品溫阻曲線差異較大,同一廠家相同規(guī)格的產(chǎn)品電參數(shù)也有較大離散性。不適合用公式計(jì)算溫度值。除非對(duì)精度要求很低。 |
Hephaestus 發(fā)表于 2022-6-8 19:07 tp+是ntc |
Hephaestus 發(fā)表于 2022-6-8 19:07 TP+是ntc |
這電路圖畫的只能說一個(gè)字:服!連NTC在哪里都可以看不到。 |
你的問題跟硬件相關(guān),沒有電路圖我們也不會(huì)算命。 |
17337161031 發(fā)表于 2022-6-8 18:45 94980和2069是0度和100度對(duì)應(yīng)的阻值 |
17337161031 發(fā)表于 2022-6-8 18:45 電阻值具體是怎么從3個(gè)ad量算出來的呢? |
中間那一段代碼就是對(duì)采集到的數(shù)據(jù)的轉(zhuǎn)換,那就是計(jì)算的啊,你寫成公式的形式就比較清晰了 |
/************************************************* 函數(shù)名稱: NTC30K_function 函數(shù)功能: NTC30K計(jì)算函數(shù) 函數(shù)形參: advalue:adc值 advalue_NT0:校正的0度ADC advalue_NT100:校正的100度ADC advalue_NTShort:校正的偏移ADC 函數(shù)返回值:溫度值 *************************************************/ FP32 NTC30K_function(FP32 advalue,FP32 advalue_NT0,FP32 advalue_NT100,FP32 advalue_NTShort) { FP32 REF,VREF,Rt,LNR; REF=94980*2069*(advalue_NT0-advalue_NT100); REF=REF/(94980*(advalue_NT100-advalue_NTShort)-2069*(advalue_NT0-advalue_NTShort)); VREF=(advalue_NT100-advalue_NTShort)*((2069+REF)/2069); advalue=advalue-advalue_NTShort; Rt=(advalue*REF)/(VREF-advalue); LNR=log(Rt); Rt=(1/(0.00093494+(0.0002211*LNR)+(0.0000001275*LNR*LNR*LNR)))-273.15; return(Rt); } |
Powered by 單片機(jī)教程網(wǎng)