常用温度传感器的采集和换算方法

本文深入探讨了DS18B20、PT100、CU50等常见温度传感器的工作原理,及其在不同场景下的优缺点。通过对比分析,为读者提供了选择合适温度传感器的依据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、前言

我觉得温度传感器应该是用量最大的传感器了,我也接触了好几种温度传感器,电阻型(50Ω,100Ω)、电流型(4~20mA)、RS485总线型、单总线型,各有各的特点。因为温度传感器使用很频繁,有必要总结一下几种最常用的温度传感器的采集方式和数据换算方法。

2、DS18B20

学习单片机的时候就很早就学过DS18B20温度传感器,测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C范围内,精度为 ± 0.5°C 。DS18B20的的特点是使用单总线通信,单片机只需要使用一根IO口与其通信就能获取温度数据,而且单总线上可以并入多个传感器。但是单总线也是DS18B20的缺点之一,单总线的长度不能太长,否则容易导致信号不稳定,易受干扰,所以适合测量电路板的温度、机箱内温度等,如果测量点在2米以外这通信就不稳定了。另外主机端读取温度的时候时序要求比较严格,通信一次需要消耗ms级的运算时间(其实大部分是在循环等待),通信过程中不宜被打断,如果关闭全局中断,会影响其他重要事件的响应。

DS18B20的通讯时序就不介绍了,网上实在是太多资料了。

3、PT100/PT1000

PT100和PT1000传感器是一样的,都是电阻型的传感器,使用的材质为铂电阻(很贵的样子),温度的采集范围可以在-200℃~+850℃,比DS18B20温度传感器的测量范围宽很多。PT100传感器在0℃的时候为100欧姆,PT1000传感器在0℃的时候为1000欧姆,使用的比较多的是PT100,这里就介绍PT100传感器。

PT100的温度分度表百度上满满的。表面看来PT100的测量温度T和电阻R呈现线性关系,但是实际上不完全是线性的,偏差大的地方会有好几摄氏度的误差,如果想要得到比较高精度的温度测量结果就不能按照线性关系来计算。使用查表法可以计算比较精确的温度值,PT100的分度表是每5℃记录一次阻值,我们如果测量测到电阻为Ra,这时候从电阻分度表中使用二分法进行查找找到电阻Ra处于哪两个阻值Rb、Rc之间(假如没有正好落在阻值上面),然后在Rb和Rc之间近似按照线性计算Ra对应的温度值。实际使用的精度非常高,主要误差还是在测量传感器电阻上。

4、CU50/CU100

CU50和CU100的关系跟PT100和PT1000的关系是一样的,只介绍CU50传感器。CU50的CU表示的是铜(PT表示的是铂),也就是说CU50使用的是铜材质(很便宜的样子),但是CU50得温度测量范围为-50°C-150°C,在测量温度在-50°C-150°C范围之内的时候,传感器电阻和温度处于一定的函数关系,当低于-50℃或者高于150℃的时候就不符合那个函数式了,可能是由于铜的材质问题,所以CU50一般只能测量-50°C-150°C温度范围。

CU50热电阻分度表参考文章:https://wenku.baidu.com/view/9c5ee92e14791711cc791781.html

当测量温度在-50℃<t<150℃时,,其中A=4.280×10-3;B=-9.31×10-8;C=1.23×10-9,R(0℃)=50。 这是传感器电阻关于温度的函数式,但是我们真正使用的时候能测量出来传感器的电阻,需要求出来对应的温度,所以这个式子需要把X轴和Y轴掉个。但是发现这个式子是一个一元三次函数,我试着解了一次想得到温度T关于电阻r的函数式T=f(r),着实解不出来,那就耍点技巧--将次。

假设测量的温度t为150℃,这时候电阻R差不多为82欧姆,这时候:

1+At+Bt(t-100℃)+Ct2(t-100℃)

= 1 + A*150 + B*150*(150-100)+C*150^2*(150-100)

= 1 + 0.642 - 0.00069825 + 0.00138375。

可以看到上面的几项中后两项小到几乎可以忽略掉,其实不管t为多少,后面两项的值都远小于前两项的,也就是说可以去掉Bt(t-100℃)和Ct2(t-100℃)即可。这时候式子:

就可以转成:

R = R(0℃)[1+At]

R = 50 * [1+At]

这下式子被“降次打击”了,既可以求出t关于R的关系式了:

t = (R/50 - 1) / A

假如测量到的电阻为82.134Ω(150℃),代入上式计算得到 t = 150.159℃,假如测量到的电阻为39.242Ω(-50℃),计算得到的 t = -50.28,误差并不大,属于可以接受大范围之内。降次打击成功。

如果对上面计算的精度还是满意的话,需要解一元三次方程:
R = R(0℃)[1+At+Bt(t-100℃)+Ct^2(t-100℃)]  ..........................................①

R由采集系统测量测到,则有:

Y = R(0℃)[1+At+Bt(t-100℃)+Ct^2(t-100℃)] - R  ..........................................②

求解②式与X轴的交点即可,艺高人可以自行求解。

如果解不出来还有一个常规办法就是查表法,和PT100温度传感器一样。

 

 

 

 

 

 

为了实现STM32外接温度传感器的数据采集,可以采用常见的数字温度传感器如DS18B20,或者使用模拟温度传感器如LM35,结合ADC模块进行数据采集。以下将分别提供两种常见方式的代码示例。 ### 使用DS18B20(单总线数字温度传感器) DS18B20是一种常用的数字温度传感器,支持单总线通信,精度高,适合远距离测量。以下是一个基于STM32的DS18B20驱动示例: ```c #include "ds18b20.h" #include "onewire.h" float temperature; // 初始化DS18B20 void DS18B20_Init(void) { OneWire_Init(); } // 读取温度值 uint8_t DS18B20_ReadTemp(float *temp) { uint8_t i; uint8_t scratchpad[9]; OneWire_Reset(); OneWire_WriteByte(SKIP_ROM); // 跳过ROM OneWire_WriteByte(CONVERT_T); // 启动温度转换 for(i = 0; i < 20; i++) { // 等待转换完成(最大750ms) if(OneWire_ReadBit()) break; HAL_Delay(1); } OneWire_Reset(); OneWire_WriteByte(SKIP_ROM); OneWire_WriteByte(READ_SCRATCHPAD); for(i = 0; i < 9; i++) { scratchpad[i] = OneWire_ReadByte(); } *temp = ((int16_t)(scratchpad[1] << 8) | scratchpad[0]) * 0.0625; return (scratchpad[8] == CRC8(scratchpad, 8)) ? 0 : 1; } ``` ### 使用LM35(模拟温度传感器) LM35是一种模拟温度传感器,输出电压与摄氏温度成正比,通常为10mV/℃。可以通过STM32的ADC模块进行采集: ```c #include "adc.h" #define VREF 3.3 #define ADC_RESOLUTION 4096 float read_lm35_temperature(void) { uint32_t adc_value = HAL_ADC_GetValue(&hadc1); // 假设使用ADC1 float voltage = (adc_value * VREF) / ADC_RESOLUTION; float temperature = voltage * 100.0; // 10mV/℃ return temperature; } ``` ### 数据采集流程说明 1. **初始化传感器**:对于数字传感器,需进行初始化操作,包括复位、ROM命令等;对于模拟传感器,需配置ADC通道采样时间。 2. **启动转换**:对于数字传感器,发送转换命令;对于模拟传感器,启动ADC转换。 3. **读取数据**:数字传感器通过单总线读取温度值;模拟传感器通过ADC读取电压并转换为温度。 4. **数据处理**:对原始数据进行滤波、校准等处理,提高精度。 上述代码示例展示了如何在STM32平台上实现外接温度传感器的数据采集,具体实现需根据所选传感器型号硬件平台进行调整[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值