|
你有没有想过温控器、3D打印机的加热床、汽车发动机或烤箱等设备是如何测量温度的?通过本篇文章,您可以理解其原理!
在产品中,获知温度可以得到一些非常有用的数据。温度信息有助于调节室内温度以保持舒适的环境,确保3D打印机床足够热,使得ABS等材料粘在其表面,防止发动机过热,以及防止食物被烧毁。
在本篇文章中,我们仅关注一种可以测量温度的传感器。该传感器称为热敏电阻。热敏电阻比其他类型的电阻对温度更敏感。
我们将使用Arduino开发板测量和处理热敏电阻的读数,然后将其转换为可识别的常见温度单位格式。
以下是我们将要使用的热敏电阻的图片:
所需得材料
● Arduino MEGA或Arduino Uno开发板 ● 连接导线 ● 焊锡和烙铁
● Arduino IDE开发环境
相关的理论知识 在电阻的常见应用中,您不希望电阻随温度变化。实际上,这在现实生活中是不可能的,但是可以确保电阻在较大的温度变化下发生微小变化。如果随温度变化较大,则电阻会使电路中发生奇怪的事情,例如LED随着环境温度变化而变得更亮或更暗。
但是,如果你确实希望LED的亮度是随温度变化的呢?这就是热敏电阻的用武之地。正如您可能已经猜到的那样,在温度变化很小的情况下,热敏电阻的电阻变化很大。为了说明这个概念,请查看以下热敏电阻的典型曲线:
显示单位不是实际值,因为热敏电阻可根据您购买的不同而变成不同的范围。如上所示,温度越来越高,电阻值越来越小。这是负温度系数电阻(简称NTC)的特性。
还有一些热敏电阻具有正温度系数(简称PTC),这意味着随着温度的升高,电阻会增加。但是,PTC热敏电阻具有一种临界点,并且在某些温度下电阻值会变化很大。这使得PTC热敏电阻很难使用。因此,对于大多数低成本温度测量产品,NTC热敏电阻是首选。 对于本文的剩下部分,您可以认为我们指的是NTC型热敏电阻。
找到曲线拟合公式的四种方法 现在我们已经了解了热敏电阻的通常特性,您可能会开始想知道我们如何使用Arduino开发板来测量温度。上图中的曲线是非线性的,因此,似乎不可能使用简单的线性方程。 那么该怎么办?
在继续阅读之前,请考虑如何在Arduino开发板或甚至没有微处理器组件的电路中执行此操作。 您可以通过以下几种方法解决此问题。这里并不是所有的技术,但它会向您展示一些流行的方法。
方法一: 一些制造商非常友好的为您提供映射某个整数范围的温度和电阻(典型值)的整个图表。 在Vishay公司的数据表中就可以找到一个这样的热敏电阻。
但是你想想将如何在Arduino中做到这一点。您需要将所有这些值硬编码到巨大的查找表或非常长的“switch ... case”或“if ... then”控制结构中的代码中。
如果制造商不够好以提供查找表,则需要自己测量每个点以生成数据。对于一个程序员来说,这是一个非常糟糕的一天。但这种方法并不全是坏事而且有其地位。如果手边的项目只检查几个点甚至是小范围,这可能是首选的方法。例如,一种情况是,如果您只想测量值是否在选定的温度范围内,并设置LED指示灯亮起以指示这种情况。
但对于我们的项目,我们希望测量接近连续的范围并将其发送到串口监视器,因此不会使用此方法。
方法二:
您可以尝试通过添加外部电路来“线性化”热敏电阻的响应。
一种流行的方法是将一个电阻与热敏电阻并联。有些IC可以为您提供此功能。
确定如何选择和线性化区域以及选择正确的值是可以使用整篇文章来介绍。如果微处理器没有浮点精度(如PICAXE),这种方法很好,因为它简化了温度范围到线性响应。它还使得设计没有微处理器的电路变得更容易。 但是我们在本文中有一个微处理器,并希望利用整个范围。
方法三: 您可以从数据表中获取表格数据,或者生成您使用独立测量所做的数据,并在Excel中重新创建绘图。然后,您可以使用曲线拟合功能为曲线创建公式。这不是一个坏主意,并且所有执行的工作都会为您的程序提供一个很好的公式 - 但它确实需要一些时间和数据的预处理。
虽然这是一种合法的方法,但我们不希望被困在分析所有这些数据。此外,每个热敏电阻都略有不同。
方法四: 事实证明,有一种通用曲线拟合公式适用于热敏电阻等器件。它被称为Steinhart-Hart方程。它的一个版本如下所示: 1/T = A + BLn(R)+ C(LN(R))3
其中R是热敏电阻在温度T(以开尔文为单位)的电阻。
这适用于所有NTC型电阻的通用曲线拟合方程。对于大多数应用来说,温度和电阻之间的近似值“足够好”。
注意,等式需要常数A、B和C。这些对于每个热敏电阻是不同的,需要给出或计算。由于存在三个未知数,因此在一定温度下需要进行三次电阻测量,然后可以使用这三种方程来求解这些常数。 即使对于我们这些代数向导的人来说,这仍然是太多的工作。
相反,有一个更简单的方程式不太准确但只有一个常数。常数用β表示,因此该方程称为β方程。 1/T = 1/T0+(1/β)* ln(R/RO)
其中Ro是参考温度To下的电阻(例如,室温下的电阻)。 β通常在数据表中给出 - 如果没有,您只需要一次测量(一个等式)来计算它。这是我将用于热敏电阻接口的公式,因为它非常简单,并且是我遇到的最简单的方法,无需线性化热敏电阻的响应。
用Arduino开发板测量电阻 现在已经完成了我们的方法,我们需要弄清楚如何用Arduino开发板实际测量电阻,然后才能将这些信息输入β方程。我们可以使用分压电路来实现:
这将是我们热敏电阻的接口电路。当热敏电阻检测到温度变化时,这将反映在输出电压中。
现在,我们通常使用分压电路,其公式如下:
VOUT =Vs⋅*(Rbalance / (Rthermistor + Rbalance))
但我们不希望Vout作为参考 - 我们想要Rthermistor。那么让我们使用代数公式来解决这个问题: Rthermistor =Rbalance⋅*(Vs / Vout - 1)
这几乎是完美的,但我们需要现在测量我们的电压输出以及电源电压。这是我们充分利用Arduino内置ADC的地方。
我们可以将电压表示为一定范围内的数字。所以我们的等式最终如下: Rthermistor =Rbalance *(Dmax / Dmeasured - 1)
这在数学上是有效的,因为无论我们如何表示电压(以伏特或数字为单位),这些单位都会抵消分数中的顶部和底部,留下无量纲数。然后,乘以电阻得到以欧姆表示的结果。 Dmax值为1023,这是10位ADC可以产生的最高数字。 Dmeasured是测量的ADC值,最低到零,最高到1023。 |