Skip to content
字数
3334 字
阅读时间
14 分钟

综合实验:基于 PN 结的数字温度传感器保姆级教程

导言:万物皆有“热”情

欢迎来到这个有趣的电子设计实验!我们的目标是亲手打造一个数字温度计。这个温度计的核心,并非某些高科技、昂贵的传感器,而是我们电子世界中最基础的元件——晶体管或二极管。我们将利用它们内部 PN 结的一个微妙特性:它的电学行为会随着温度发生可预测的变化。

通过本实验,您将不仅仅是搭建一个电路,更是将理论物理(半导体特性)与模拟电子(信号放大)、数字电子(信号转换)以及嵌入式编程(数据显示)融为一体,体验一次完整的“从想法到产品”的工程实践。


第一部分:核心原理 - 让温度“说话”

我们如何让一个小小的晶体管感知温度?答案在于它的 (基极-发射极电压)。

对于一个双极晶体管(BJT),其集电极电流 和基极-发射极电压 之间的关系大致遵循以下公式:

其中:

  • 是反向饱和电流,它本身对温度非常敏感。
  • 是基本电荷 ( 库仑)。
  • 是玻尔兹曼常数 ( J/K)。
  • 是绝对温度(开尔文, K)。

如果我们对这个公式进行变换,可以得到 。这个公式看起来很复杂,特别是 也会随温度变化。

天才的解决方案: 为了消除恼人的 项,我们可以用两个完全相同(理想情况下)的晶体管,并让它们工作在两个不同的集电极电流下,比如

  • 对于晶体管1:
  • 对于晶体管2:

现在,我们将这两个电压相减,奇迹发生了:

核心思想:PTAT 电压 这个电压差 (Proportional To Absolute Temperature,与绝对温度成正比)只与绝对温度 和物理常数()以及电流比(本例中为10)有关。它是一个干净、线性、只随温度变化的电压信号!

根据这个公式,我们可以计算出该电压信号的灵敏度:

这意味着,温度每变化 1 摄氏度(或 1 开尔文), 电压会变化约 0.198 毫伏。这个信号非常微弱,但非常有价值!

我们的任务就是:产生它 -> 放大它 -> 数字化它 -> 显示它


第二部分:分步实践 - 从元件到成品

我们将按照实验要求中的任务分解,一步步进行。

步骤 A: 筛选元件,搭建 PTAT 电压发生器 (20-25分)

1. 元件筛选:

  • 核心元件: 一对性能一致的 NPN 晶体管,例如 2N3904BC547。或者两个相同的开关二极管,如 1N4148
  • 为何要“一致”? 我们的核心公式是基于两个晶体管的 相互抵消的假设。如果两个管子差异太大,这个假设就不成立,会引入误差。
  • 如何筛选?
    • 简单方法: 购买同一批次的晶体管,误差通常较小。
    • 进阶方法: 使用万用表的hFE(三极管放大倍数)档位,挑选两个hFE值非常接近的晶体管。或者搭建一个简单电路,在相同偏置下测量并记录它们的 ,选择 最接近的一对。

2. 电路搭建: 我们需要一个电路来产生 这两个电流。一个简单的电流镜是实现此目的的绝佳选择。

  • 电路图示例 (使用BJT):

    • 在这个电路中,晶体管 Q1Q2 构成一个电流镜,用于为我们的传感核心 Q3Q4 提供电流。
    • 电阻 R2 的值是 R1 的十分之一,可以近似产生 的关系。这是一种简化的做法,更精确的设计会使用更复杂的电流源。
    • Q3Q4 是我们精心筛选的那对匹配晶体管。输出电压 就是 Q3Q4 基极之间的电压差。

3. 测量验证:

  • 搭建好电路后,给它通上电(例如 )。
  • 用万用表(设置为直流毫伏档)精确测量 Q3Q4 的基极-发射极电压
  • 计算
  • 理论计算: 假设室温为 25°C (298.15 K),理论上的 应该是:
  • 如果你的测量值在 50-70mV 之间,那么恭喜你,传感器的“心脏”已经成功跳动了!

步骤 B: 仿真与放大 (50-60分)

信号太微弱(~198µV/°C),单片机的ADC无法直接分辨。我们需要将它放大。

1. 电路仿真 (强烈推荐):

  • 工具: 使用 MultisimLTspice (免费) 或其他仿真软件。
  • 目的: 在烧毁任何元件之前,验证你的放大电路设计是否正确,增益是否合适。
  • 在软件中搭建你的PTAT电路和下面的放大电路,进行DC Sweep(直流扫描)分析,观察输出电压是否随温度线性变化。

2. 放大器设计 - 差分放大电路: 我们需要放大的是两个电压的差值,所以必须使用差分放大电路。

  • 选择运放 (Op-Amp):

    • 低输入失调电压 (): 我们的输入信号本身只有几十毫伏,如果运放自身的失调电压就有几毫伏,会带来巨大误差。因此,选择 精密运放 是关键。例如 OP07AD620 (仪表放大器,效果更好) 或一些现代的低失调CMOS运放。避免使用 LM741LM358,除非你对误差不敏感。
    • 低输入偏置电流 (): 确保运放不会从我们的PTAT电路中“偷走”太多电流,影响其工作。
    • 轨到轨 (Rail-to-Rail) 输出: 如果你使用单电源(如5V)供电,轨到轨运放能让输出电压范围更接近0V和5V,提高动态范围。
  • 电路图示例 (使用单运放):

    • 增益计算: 这个电路的增益
    • 目标增益设置: 假设我们的温度范围是 20°C (293.15 K) 到 100°C (373.15 K)。
      • @ 20°C ≈ 58.5 mV
      • @ 100°C ≈ 74.5 mV
      • 电压变化范围
    • 假设我们使用 Arduino,其ADC输入范围是 0-5V。我们希望将这 80°C 的变化映射到比如 2V 的电压变化上。那么增益
    • 我们可以选择 。(实际中请选择标准的电阻值,如 )。

    注意: 为了获得精确增益,请使用高精度(1%或更高)的电阻。

步骤 C & D: AD转换与校准 (70-85分)

现在我们有了一个随温度线性变化的、幅度足够的电压信号,是时候让单片机来读取它了。

1. AD转换:

  • 连接: 将差分放大器的输出引脚连接到单片机的一个模拟输入引脚(例如Arduino的 A0)。同时,确保单片机和你的模拟电路共地(GND相连)。
  • ADC基础知识:
    • 分辨率: Arduino UNO的ADC是10位的,意味着它可以将输入电压分成 个级别(0-1023)。
    • 参考电压 (V_ref): 这是ADC测量的上限。Arduino上通常是5V或3.3V。
    • 转换公式: 输入电压 = (ADC读数 / 1023.0) * V_ref

2. 编程实现: 以下是一个简单的Arduino伪代码/示例:

cpp
const float V_REF = 5.0; // ADC的参考电压

void setup() {
  Serial.begin(9600);
}

void loop() {
  // 1. 读取ADC值
  int adcValue = analogRead(A0);

  // 2. 转换为电压
  float voltage = (adcValue / 1023.0) * V_REF;

  // 3. 将电压转换为温度 (!!! 重点: 使用校准后的公式 !!!)
  // 假设我们通过校准得到 y = mx + c 的关系
  // Temperature = (voltage - c) / m;
  float temperature = convertVoltageToTemp(voltage);

  // 4. 显示结果
  Serial.print("ADC: ");
  Serial.print(adcValue);
  Serial.print(", Voltage: ");
  Serial.print(voltage);
  Serial.print(" V, Temperature: ");
  Serial.print(temperature);
  Serial.println(" C");

  delay(1000);
}

float convertVoltageToTemp(float volt) {
  // 在这里填入你校准后得到的公式
  // 例如: return (volt - 0.5) / 0.1;
  // 这个公式需要通过下面的校准步骤来确定
  float temp;
  // ... 计算逻辑 ...
  return temp;
}```

**3. 校准 (最关键的一步!):**
理论计算很美好,但元件的公差、运放的失调等会引入误差。**必须进行校准!**

> **校准是理论与现实之间的桥梁。** 我们的目标是找到一个精确的数学关系式 $Temperature = m \cdot V_{out} + c$,将我们测量的最终电压 $V_{out}$ 映射到真实温度。

*   **你需要:** 一个商用的、你信得过的数字温度计。
*   **两点校准法:**
    1.  **取低点:** 将你的传感器和商用温度计一起放入一个温度相对稳定的环境中(例如,一杯冰水混合物,理论为0°C,或室温环境)。等待读数稳定。记录下商用温度计的读数 $T_1$ 和你的电路输出电压 $V_1$。
    2.  **取高点:** 将两个传感器一起放入一个较热的环境(例如,用密封袋包好后放入一杯热水中)。等待读数稳定。记录下商用温度计的读数 $T_2$ 和你的电路输出电压 $V_2$。
    3.  **计算斜率 `m` 和截距 `c`:**
        *   斜率 $m = \frac{T_2 - T_1}{V_2 - V_1}$
        *   截距 $c = T_1 - m \cdot V_1$
    4.  **最终公式:** 你现在得到了专属于你的温度计的转换公式:$Temperature = m \times Voltage + c$。将这个 `m` 和 `c` 的值填入你的代码中。

#### 步骤 E & F: 产品化 (85-99分)

**1. 洞洞板/PCB实现:**
*   将你在面包板上验证好的电路,焊接到洞洞板或自己设计的PCB上。
*   **布局建议:**
    *   模拟部分(PTAT和放大电路)和数字部分(单片机)分区布局。
    *   电源线和地线要尽量粗、短。
    *   在运放的电源引脚旁放置一个 `0.1µF` 的去耦电容,以滤除高频噪声。

**2. 独立供电与功耗:**
*   **电源:** 可以使用9V电池,通过一个LDO(低压差线性稳压器)如 `LM7805` (转为5V) 或 `AMS1117-3.3` (转为3.3V) 为系统供电。
*   **功耗优化 (进阶):**
    *   选择低功耗的运放和单片机。
    *   在代码中,可以让单片机在两次测量之间进入睡眠模式(`sleep mode`),以大幅降低功耗,延长电池寿命。
    *   考虑使用开关电源(`Buck/Boost` 芯片)代替LDO,因为它们的转换效率更高。

**3. 添加显示:**
*   将计算出的温度值显示在一个 `LCD1602` 屏幕或 `OLED` 屏幕上,让它成为一个真正独立的数字温度计!

---

### 总结与要点回顾

1.  **核心原理:** 利用两个工作在不同电流下的相同PN结,产生一个与绝对温度成线性关系的电压信号 $V_{PTAT}$。
2.  **信号处理:** $V_{PTAT}$ 信号非常微弱,必须使用**低失调**的精密运放搭建**差分放大电路**进行放大。
3.  **数字化:** 利用单片机的ADC将模拟电压转换为数字值。
4.  **校准是王道:** 由于元件非理想性,必须通过与标准温度计进行至少两点校准,才能获得精确的温度读数。
5.  **工程化:** 考虑电源、功耗、布局和显示,将一个电路原型变成一个可靠的独立设备。

祝你实验顺利,享受创造的乐趣!

<NolebaseGitContributors />


<NolebaseGitChangelog />