直接查表就好了 |
其实既然使用了能计算对数的单片机,那么是不是直接查表就好了,毕竟厂家提供的数据表也只是整数温度,那么计算出来的小数温度又是否能代表精度呢 |
这个问题的讨论对于我理解NTC的计算很有帮助。 谢谢你! |
hui7279 发表于 2024-1-20 16:17 //据Steinhart-hart方程计算温度值,RT可能用Tr表达会更准确: //据Steinhart-hart方程计算温度值,是最后Rt值已转化为温度值Tr,用同一个变量减少内存消耗 |
本帖最后由 hui7279 于 2024-1-20 17:03 编辑 REF=94980*2069*(advalue_NT0-advalue_NT100); //将ADC值转换为校准的ADC值 REF=REF/(94980*(advalue_NT100-advalue_NTShort)-2069*(advalue_NT0-advalue_NTShort)); //将ADC值转换为硬件的实际电压值 VREF=(advalue_NT100-advalue_NTShort)*((2069+REF)/2069); //将ADC值电压转换基准点,与硬件接高低位有关 advalue=advalue-advalue_NTShort; //将电压值转换为电阻值 Rt=(advalue*REF)/(VREF-advalue); //据Steinhart-hart方程计算中间值ln(Rt) LNR=log(Rt); //据Steinhart-hart方程计算温度值,RT最后转化为Tr,用同一个变量节约内存 Rt=(1/(0.00093494+(0.0002211*LNR)+(0.0000001275*LNR*LNR*LNR)))-273.15; /****************************************** Steinhart-Hart方程计算法: 1/T = A + B*ln(R) + C*[ln(R)]^3 由于:T值在公式中是用热力学温度单位K,摄氏度就要减273.15; 此公式中:A=0.0009349, B=0.0002211, C =0.0000001275 ABC值与硬件NTC有关,不同厂家的NTC表值需要用不同参数; --------------------------------------------------- ABC值的计算方法: 具体可以将要用到的三个关键温度点值:T0、T1、T2、R0、R1、R2; 利用计算ln(R0)、ln(R1)、ln(R2);代入Steinhart-Hart方程(温度值要+273.15) 得到三元一次方程组,可以用矩阵法解方程法,具体查常用C算法函数; 也可用EXCEL的方法解三元一次方程组,具体可以百度 ************************************************/ |
刚好也在研究一个仪器的NTC测温电路,界面显示是一个电压值多少mv,旁边一个温度值。能查到系统的a b c值,正在研究中,有什么进展大家共同分享 |
Y_G_G 发表于 2022-6-9 13:31 我认为这个方程好像贝塞尔曲线通过控制点拟合的结果 |
路明非. 发表于 2022-6-8 22:19 想要精度高就查表 |
温度计算,Steinhart-Hart方程和B值法 使用Steinhart-Hart方程或者B值计算方法将热敏电阻的电阻值转换为温度读数。 Steinhart-Hart方程计算法: 1/T = A + B*ln(R) + C*[ln(R)] 这里: T 为绝对温度K(开尔文温度),R 单位是欧姆 . 温度系数B值计算法: Rt = R(25℃)*exp[B*(1/T - 1/298.15)] 这里:T 为绝对温度K(开尔文温度 = 273.15),R(25℃) 是热敏电阻在 25℃时的阻值 (单位为Ω),exp是e的n次方; 3. C语言实现的温度计算公式 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在数学公式中和c语言中的区别: 参考:cplusplus的"<cmath> (math.h) - C++ Reference"这篇文章 数学中log是对数符号,右边写真数和底数(上面是真数,下面是底数)lg是以10为底数(例lg100=2)(lg为常用对数)ln是以e为底数(lne2=2)(ln为自然对数 e=2.718281828459045...) c语言里面只有两个函数log和log10,其中函数 log(x) 表示是以e为底的自然对数,即 ln(x)函数。 log10(x) 以10为底的对数,即 lg(x)。以其它数为底的对数用换底公式来表示:loga(b)=ln(b)/ln(a),C语言表示成log(b)/log(a)。 |
Hephaestus 发表于 2022-6-8 21:10 楼主所列代码确实没看懂。只知道NTC是在25度条件下的标称精度,25~50度的标称B值。偏离标准温度越多,精度和B值误差越大。用固定公式计算,除非对NTC元件预选,否则很难批量生产。大佬如有自动纠偏的方法,还望分享。 ![]() |
Y_G_G 发表于 2022-6-8 21:46 你错了,Steinhart-hart方程用这两句就解决完了,完全没有任何难度,不存在看不懂的地方。 LNR=log(Rt); Rt=(1/(0.00093494+(0.0002211*LNR)+(0.0000001275*LNR*LNR*LNR)))-273.15; 楼主的问题是第一句的Rt是怎么来的,这个前面的代码也太复杂了,要动手算算。 |
Y_G_G 发表于 2022-6-8 21:46 知道原理才能改进提高啊,这个利用三个点校准也是为了提高测温的精度,而且这样测温精度高反应速度也快 |
如果不是内存实在不够用,NTC用查表是常用也是最实在的 至于这个方程的原理,它是两个老外一个叫Steinhart,一个叫Hart,合起来就是Steinhart-Hart,根据热敏电阻的特性研究出来的 个人感觉原理什么的并不重要,你上网也不一定能查得到,会用就行 电子编程这一块,那么多恐怖的公式,哪能个个都知道原理呀 |
wulin 发表于 2022-6-8 20:40 你看了代码再来发言好不好?什么都不懂就上来胡说很没有礼貌的。楼主明显是个30k的NTC,B值未知。而且标定了三个点,1)短路NTC测试放大以及ADC环节的误差;2)0度时NTC的值;3)100度时NTC的值。 |
wulin 发表于 2022-6-8 20:40 实际情况是ntc测温的确用的公式计算的而且测温精度还很高,具体参考Steinhart-hart方程 |
楼主所述NTC热敏电阻可能是PT100、PT1000等铂电阻。普通NTC热敏电阻几乎不可能通过公式计算获得较准确温度值。NTC热敏电阻不同厂家产品温阻曲线差异较大,同一厂家相同规格的产品电参数也有较大离散性。不适合用公式计算温度值。除非对精度要求很低。 |
Hephaestus 发表于 2022-6-8 19:07 tp+是ntc |
Hephaestus 发表于 2022-6-8 19:07 TP+是ntc |
这电路图画的只能说一个字:服!连NTC在哪里都可以看不到。 |
你的问题跟硬件相关,没有电路图我们也不会算命。 |
17337161031 发表于 2022-6-8 18:45 94980和2069是0度和100度对应的阻值 |
17337161031 发表于 2022-6-8 18:45 电阻值具体是怎么从3个ad量算出来的呢? |
中间那一段代码就是对采集到的数据的转换,那就是计算的啊,你写成公式的形式就比较清晰了 |
/************************************************* 函数名称: NTC30K_function 函数功能: NTC30K计算函数 函数形参: advalue:adc值 advalue_NT0:校正的0度ADC advalue_NT100:校正的100度ADC advalue_NTShort:校正的偏移ADC 函数返回值:温度值 *************************************************/ 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); } |