NTC 3950K 10K温度电阻测量环境温度

NTC -10K测量温度最便宜常用,搜到博主简易的NTC-10K-3950测温_ntc测温电路_chengzidun的博客-CSDN博客 

简易测温有点不满足需求,于是对该程序加以修改,实现稍微精确的测温,代码如下:

#define 	TABLE_SIZE  			181
#define		TEMP_VALUE_MAX			125000
#define		TEMP_VALUE_MIN			-55000
const uint32_t g_rvTable[TABLE_SIZE] = {//-55 - 125
	1034600, 959006, 889452, 825419, 766434, 											
	712066, 661926, 615656, 572934, 533466, 496983, 463240, 432015, 403104, 376320, 	
	351495, 328472, 307110, 287279, 268859, 251741, 235826, 221021, 207242, 194412, 	
	182460, 171320, 160932, 151241, 142196, 133750, 125859, 118485, 111589, 105139, 	
	99102, 93450, 88156, 83195, 78544, 74183, 70091, 66250, 66643, 59255, 				
	56071, 53078, 50263, 47614, 45121, 42774, 40563, 38480, 36517, 34665, 				
	32919, 																				
	31270, 29715, 28246, 26858, 25547, 24307, 23135, 22026, 20977, 19987, 				
	19044, 18154, 17310, 16510, 15752, 15034, 14352, 13705, 13090, 12507, 				
	11953, 11427, 10927, 10452, 10000, 9570, 9161, 8771, 8401, 8048, 					
	7712, 7391, 7086, 6795, 6518, 6254, 6001, 5761, 5531, 5311, 						
	5102, 4902, 4710, 4528, 4353, 4186, 4026, 3874, 3728, 3588, 						
	3454, 3326, 3203, 3085, 2973, 2865, 2761, 2662, 2567, 2476, 						
	2388, 2304, 2223, 2146, 2072, 2000, 1932, 1866, 1803, 1742, 						
	1684, 1627, 1573, 1521, 1471, 1423, 1377, 1332, 1289, 1248, 						
	1208, 1170, 1133, 1097, 1063, 1030, 998, 968, 938, 909, 							
	882, 855, 829, 805, 781, 758, 735, 714, 693, 673, 									
	653, 635, 616, 599, 582, 565, 550, 534, 519, 505, 									
	491, 478, 465, 452, 440, 428, 416, 405, 395, 384, 									
	374, 364, 355, 345, 337																
};
int32_t Get_Temperature_Table_Calc(uint32_t Res)
{
	uint8_t mid_point =0;
	uint8_t start_point=0;
	uint8_t end_point=TABLE_SIZE-1;
	uint32_t comp_ref=0;
	uint8_t index=0;
	if(Res>=g_rvTable[0])return TEMP_VALUE_MIN;
	else if(Res<=g_rvTable[end_point])return TEMP_VALUE_MAX;
	do{
		mid_point =start_point+((end_point-start_point)/2);
		comp_ref =g_rvTable[mid_point];
		if(Res==comp_ref){
			return ((int32_t)mid_point-55)*1000;
		}else if(Res>comp_ref){
			index =mid_point-start_point+1;
			end_point = mid_point;
		}else{
			index =end_point-mid_point+1;
			start_point = mid_point;
		}
	}while(index>4);
	for(index+=start_point;start_point<index;start_point++){
		comp_ref =g_rvTable[start_point];
		if(Res==comp_ref){
			 return ((int32_t)start_point-55)*1000;		
		}else if((Res<comp_ref)&&(Res>g_rvTable[start_point+1])){
			float k =(float)(g_rvTable[start_point]-g_rvTable[start_point+1])/ -1000;
			float b =(float)g_rvTable[start_point+1]-(((float)start_point-54)*1000*k);
			return (int32_t)((float)Res-b)/k;
		}
	 }
	return TEMP_VALUE_MAX;
}

不管NTC是上拉还是下拉,经过计算很容易算出NTC实际电阻值,传入函数 Get_Temperature_Table_Calc() Res (单位欧姆)即可得到温度值(/1000 =实际温度)

<think>嗯,我现在需要了解如何使用12位ADC来采集NTC 3950 10K的温度传感器数据。首先,我应该回忆一下NTC热敏电阻的基本特性。NTC是负温度系数热敏电阻温度升高时电阻值会下降。而ADC的作用是将模拟电压信号转换为数字值,这里用的是12位精度,所以输出范围是0到4095。 首先,我需要确定如何将NTC电阻变化转换为电压信号。通常的做法是用一个分压电路,将NTC与一个固定电阻串联,然后测量中间点的电压。假设这里使用的是10K的NTC,可能需要选择一个合适的分压电阻,比如同样10K的参考电阻。这样在25摄氏度时,NTC电阻也是10K,分压点的电压就是Vcc的一半。不过具体分压电阻的选择可能需要根据温度测量范围来优化,可能需要查一下NTC 3950 10K的电阻-温度表,确定在目标温度范围内的阻值变化范围,从而选择合适的分压电阻值,以最大化ADC的分辨率。 接下来,当分压电路确定后,当温度变化时,NTC电阻变化会导致分压点的电压变化,ADC读取这个电压值,转换成数字量。假设Vcc是3.3V,当分压电阻10K时,在25度时电压是1.65V,对应的ADC值应该是1.65/3.3 * 4095 ≈ 2047。但温度变化时,这个值会上下变化。 但如何将这个ADC值转换为温度呢?这里可能需要几个步骤。首先,根据ADC的读数计算出电压值,再根据分压公式得到NTC的当前电阻值,然后利用NTC的R-T特性公式或查表法将电阻值转换为温度。 具体来说,首先计算电压:ADC_value是读取到的数字量,假设参考电压Vref是3.3V,那么电压V_ntc = (ADC_value / 4095) * Vref。 然后分压电路中,假设使用串联电阻R_ref(比如10K),那么NTC电阻R_ntc可以通过公式计算:V_ntc = Vref * R_ntc / (R_ref + R_ntc)。解这个方程得到R_ntc = R_ref * V_ntc / (Vref - V_ntc)。不过需要注意,当V_ntc等于Vref时,分母为零,但实际上此时R_ntc趋近于无穷大,可能出现在温度极低的情况下,但NTC的阻值不可能无限大,所以实际应用中应该不会有这种情况。 得到R_ntc之后,需要将其转换为温度。对于NTC热敏电阻,常用的方法是用Steinhart-Hart方程:1/T = A + B*ln(R/R0) + C*(ln(R/R0))^3,其中T是开尔文温度,R是当前电阻,R0是参考电阻(比如25度时的10K),A、B、C是系数,通常由制造商提供。或者,如果使用简化的B参数方程:1/T = 1/T0 + (1/B)*ln(R/R0),其中T0是参考温度(如25摄氏度对应的298.15K),B是材料常数,3950可能就是指B值为3950K。 但具体到NTC 3950 10K,需要确认其参数是否正确。例如,B值可能是在25/50或25/85摄氏度下的值,这会影响计算的准确性。如果用户提供的型号是3950,通常B值可能是3950K,但需要查阅数据手册确认。 另外,还有查表法,将电阻值与对应的温度制成表格,通过查找最近的电阻值来插值得到温度。这种方法可能更适合资源有限的嵌入式系统,但需要存储足够的表格数据。 现在,在软件算法上的步骤大致如下: 1. 读取ADC值,转换为电压V_ntc。 2. 计算NTC电阻R_ntc。 3. 使用Steinhart-Hart方程或B参数方程将R_ntc转换为温度T。 4. 或者通过查表法获取温度。 需要注意的问题包括: - 分压电阻R_ref的精度和温度稳定性,应选择精度高的电阻(如1%或更高)。 - ADC的参考电压Vref是否准确,是否需要校准。 - 温度计算的运算复杂度,是否适合在微控制器上实时计算。 - 是否需要线性化处理,或者分段近似来简化计算。 可能的优化方法包括预计算温度表格,存储在程序中,通过查表和线性插值来减少实时计算量。或者,使用定点数运算来替代浮点运算,提高效率。 例如,假设使用B参数方程: R_ntc = R_ref * (V_ntc) / (Vref - V_ntc) 然后代入B参数方程: 1/T = 1/T0 + (1/B) * ln(R_ntc/R0) 其中,T0是参考温度(如25℃=298.15K),R0是10K,B=3950K。 然后,计算得到T,再将开尔文转换为摄氏度:T℃ = T - 273.15。 在代码实现中,需要注意处理自然对数的计算,可能比较耗时。如果微控制器没有硬件浮点单元,可能需要采用查表法或者近似算法。 例如,在C语言中,可以这样计算: float adc_value = read_adc(); // 假设读取到的ADC值 float v_ntc = (adc_value / 4095.0) * Vref; float r_ntc = R_ref * v_ntc / (Vref - v_ntc); float ln_r = log(r_ntc / R0); float inv_T = (1.0/T0) + (ln_r)/B; float T_kelvin = 1.0 / inv_T; float T_celsius = T_kelvin - 273.15; 不过,这需要浮点运算支持,可能在某些嵌入式系统中效率不高。可以考虑使用定点数或者查找表优化。 此外,需要注意在极端温度下,比如当V_ntc接近Vref时,可能导致计算中的分母接近零,从而出现数值不稳定的情况,需要加入保护措施,比如限制最大值或最小值。 另外,校准步骤也可能需要考虑,比如在实际应用中,可能存在分压电阻的误差,或者ADC的参考电压偏差,这可能需要通过实际测量进行校准,比如在已知温度测量ADC值,调整参数。 总结一下,算法步骤大致如下: 1. 硬件连接:将NTC与参考电阻串联,接入ADC输入。 2. 读取ADC值,转换为电压。 3. 计算NTC当前电阻值。 4. 使用R-T转换公式或查表法得到温度值。 5. 输出温度结果。 可能的误差来源包括:ADC的量化误差、参考电阻的精度、NTC的B值误差、温度计算公式的近似性、电源电压的波动等。因此,实际应用中可能需要进行校准,比如多点校准,以提高测量精度。</think>以下为分步介绍12位ADC采集NTC 3950 10K温度的算法实现: --- ### **一、硬件设计原理** 1. **分压电路搭建** - 将NTC与固定参考电阻$R_{\text{ref}}$(如10KΩ)串联,连接至ADC输入引脚。 - 公式: $$ V_{\text{ntc}} = V_{\text{ref}} \cdot \frac{R_{\text{ntc}}}{R_{\text{ref}} + R_{\text{ntc}}} $$ 其中,$R_{\text{ntc}}$为NTC实时阻值,$V_{\text{ref}}$为ADC参考电压(如3.3V)。 --- ### **二、ADC数据采集** 1. **读取ADC值** - 12位ADC输出范围为$0 \sim 4095$,对应电压$V_{\text{adc}} = \frac{\text{ADC值}}{4095} \cdot V_{\text{ref}}$。 2. **计算NTC阻值** - 通过分压公式推导: $$ R_{\text{ntc}} = R_{\text{ref}} \cdot \frac{V_{\text{adc}}}{V_{\text{ref}} - V_{\text{adc}}} $$ --- ### **三、温度转换算法** #### **方案1:B参数方程法** 1. **公式** $$ \frac{1}{T} = \frac{1}{T_0} + \frac{1}{B} \cdot \ln\left(\frac{R_{\text{ntc}}}{R_0}\right) $$ - $T_0$:参考温度(单位:K,如25℃对应298.15K) - $R_0$:$T_0$时NTC阻值(10KΩ) - $B$:材料常数(3950K) 2. **代码示例(伪代码)** ```c float adc_value = read_adc(); float v_ntc = (adc_value / 4095.0) * Vref; float r_ntc = R_ref * v_ntc / (Vref - v_ntc); float inv_T = 1.0/T0 + (log(r_ntc/R0)) / B; float T_kelvin = 1.0 / inv_T; float T_celsius = T_kelvin - 273.15; ``` #### **方案2:查表法(适合低资源MCU)** 1. **步骤** - 预生成NTC电阻-温度对照表(间隔1℃或更小)。 - 通过二分查找或线性插值匹配当前$R_{\text{ntc}}$,输出对应温度。 --- ### **四、误差优化措施** 1. **硬件校准** - 使用高精度电阻(如±1%的$R_{\text{ref}}$)。 - 确保$V_{\text{ref}}$稳定(可外接基准电压芯片)。 2. **软件校准** - 在已知温度点(如冰水混合物0℃)修正ADC偏差。 - 多点校准提升B参数方程精度。 --- ### **五、注意事项** 1. **数值稳定性** - 当$V_{\text{adc}} \approx V_{\text{ref}}$时,分母$V_{\text{ref}} - V_{\text{adc}}$趋近于0,需限制最小阈值。 2. **计算效率** - 避免浮点运算(可改用定点数或预计算查表)。 --- ### **六、总结** 1. **流程总结** $$ \text{ADC值} \rightarrow \text{电压} \rightarrow R_{\text{ntc}} \rightarrow \text{温度} $$ 2. **适用场景** - 高精度需求:优先B参数方程(需浮点支持)。 - 低资源MCU:查表法+线性插值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值