PT100三线制测温电路设计:导线电阻消除与恒流源误差控制 简介一份聚焦工业温度测量电路设计的 PDF 技术文档面向自动化、仪器仪表与电子工程方向的学生、硬件工程师及 RTU测温仪表开发者。内容围绕 PT100 热电阻在 -200850℃ 范围内的线性测温特性展开重点讲解三线制接线消除导线电阻误差的推导过程由 U1-2U2 得到 RT并给出恒流源与差动放大两部分电路的完整设计包含 LM385-2.5 基准、9015 复合三极管恒流源约 0.926mA 的取值计算、OP07 低失调运放的选型理由以及 98.182×Uo 的传递关系最后说明 AD 采样、查询分度表与插值求温度的实现路径。资源包共 1 个文件为 pdf 格式体积约 1.22MB单篇即涵盖原理分析、公式推导、电路图与结论篇幅紧凑便于打印或随查。已有 4762 人学习适合作为硬件测温前端的入门参考与工程落地时的设计核对材料。1. 一根三米长的导线凭什么能让测温偏出好几度先给一个反直觉的结论PT100 元件本身的互换精度可以做到 0.1℃ 量级但把它接到三米外的仪表上如果按两线制接读数偏出半度到一度是常事线再长、线再细偏差还能翻倍。问题不在传感器在那根铜线——它既是信号通道也是一个随温度漂移的电阻。工业现场普遍采用的三线制接法本质是一次用电路拓扑去抵消物理缺陷的设计是制造现场里最经典的一类思路。更反直觉的是它消除误差的方式三线制并没有先去测出导线电阻再减掉它做的是让其中一根导线里不流电流于是这根线上的压降被强行摁到接近零再拿这个“零”当尺子把另外两根线的压降一起减掉。这套减法为什么成立、成立需要什么前提、前提被破坏时读数会怎么骗人比记住“三线制比两线制准”有用得多。2. 三线制的数学本质减法为什么能把导线电阻消干净2.1 先算一笔账看看误差到底有多大PT100 的标称灵敏度约 0.385Ω/℃——温度每升 1℃阻值涨 0.385Ω。这个数字决定了一切任何串进回路的额外电阻都要除以 0.385 才能折算成温度误差。现场常从传感器接线盒拉到控制柜三五米不算长。按 0.5mm² 的铜芯算铜的电阻率约 0.0175Ω·mm²/m每米单根约 0.035Ω三米就是 0.105Ω。两线制里电流从一根线出去、从另一根线回来两根线的电阻全串在测量回路里累计 0.21Ω。除以 0.385约 0.55℃。半度听起来还能忍但它是系统误差而且不稳定。铜的电阻温度系数约 0.4%/℃夏天控制柜内 50℃、冬天 10℃导线电阻能变 16%那 0.55℃ 的误差也跟着漂到 0.6℃ 以上。再加上接线端子的接触电阻、氧化层、压接松紧这部分更没谱。所以真正难缠的不是那半度是它今天这样、明天那样标定都标不住。线拉到五十米、线径再细一档误差直接进到几度区间这时候两线制就没法用了。2.2 三个电压、三条线把 rL 从方程里赶出去三线制的接法是PT100 一端引一根线记作 L1另一端引两根线L2、L3。测量时在 U1 点注入恒定电流 I让电流依次流过 L1、PT100、L2 回到地U2 点则单独引到高阻抗输入端只测电位、不取电流。设三根线各自的电阻为 rL1、rL2、rL3选用同规格同长度时三者相等统一记作 rLPT100 的阻值记作 RT。于是 U1 点的电位是U1 I × (rL1 RT rL2) I × (RT 2rL)注意这里串进去的是两根导线的电阻——去一根、回一根谁也跑不掉。而 U2 点接的是高阻抗输入这条线上没有电流流过所以 rL3 上不产生压降U2 读到的就是电流 I 在 rL3 上“本可以产生”的那份压降U2 I × rL3 I × rL把第一式减去两倍的第二式U1 - 2U2 I × (RT 2rL) - 2 × I × rL I × RT于是RT (U1 - 2U2) / IrL 消失了而且是被代数地消掉的不依赖任何“估计”“补偿”“查表修正”。这一步的物理含义值得多嚼几遍U2 测量的并不是一个独立的物理量它是主回路电流 I 在单根导线上的压降副本。用这个副本乘 2正好等于主回路里两根导线的压降总和一减就干净了。换句话说三线制并不是在“测量导线电阻”它是在复制导线上的那一份压降然后用复制品去对冲原件。这个“复制”能成立全靠一个前提U2 那条支路里真的没有电流。一旦有电流rL3 上的压降就不再是 I×rL副本失真减法就减错了。2.3 前提一U2 端必须是真正的高阻输入端原文里反复强调“测量端 U1 点 U2 点的测量电路采用高阻抗输入电路”这不是客套话是整个推导的地基。假设 U2 端不是高阻而是接了一个有限阻抗的负载会从 rL3 上分走电流 i。那么 rL3 上流过的电流变成 I - iU2 读到的电压变成 (I - i)×rL3副本偏小。代入减法U1 - 2U2 I(RT 2rL) - 2(I - i)rL I·RT 2i·rL多出来的 2i·rL 就是残余误差折算成电阻就是 2i·rL/I 欧姆。这个误差和 rL 成正比、和分流比成正比而 rL 只有零点几欧所以只要分流比足够小误差就压在 ppm 级。常见的实现思路是U2 端先过一个运放电压跟随器或者直接接到差动放大器的同相输入端。OP07 的输入偏置电流不超过 ±2nA偏置电流在 0.1Ω 上产生的压降是 0.2nV折算成温度误差小到没有讨论价值。真正会翻车的是人为加负载——比如为了抗干扰在 U2 端对地并一只小阻值电阻或者把 U2 端当成给别的电路供电的节点用那副本立刻就废了。还有一层容易忽略的高阻输入不仅要求直流阻抗高还要求这条线不能长距离并行在强干扰源旁边。rL3 上的信号只有几十微伏量级0.926mA × 0.1Ω ≈ 93μV一根工频干扰耦合进来就能把它淹没那时候不是原理错是信号本身被污染了。2.4 前提二三根线必须同规格、同长度、同走向严格说公式 (3) 只在 rL1 rL2 rL3 时成立。现实中三根线不可能完全一致设 L1 加 L2 的总电阻比 2rL 多了 ΔL3 比 rL 多了 δ重算一遍U1 - 2U2 I(RT 2rL Δ) - 2I(rL δ) I(RT Δ - 2δ)残余误差是 Δ - 2δ折成电阻就是这么多欧姆。三线制只能消掉三根线共有的那部分电阻差异部分一分都消不掉。这解释了施工规范里那几条看起来啰嗦的要求三根线用同一根三芯电缆、同长度、同线径、同一路径敷设最好同一批次接线端子同型号同压接工艺。最隐蔽的一种翻车是三根线走了不同路径——比如两根走近路、一根绕到高温区。铜的 0.4%/℃ 温度系数在这儿咬人一根线多经历 20℃ 温差0.1Ω 的线就多出 0.008Ω折合 0.02℃线长一点、温差大一点几十毫欧的失配就出来了而且它随季节和负载变化完全没法标定。注意三线制的精度上限往往不在运放和 ADC而在三根线的匹配度上。做方案评审时先问一句“这三根线怎么走的”比问“用的什么运放”更能判断成败。3. 恒流源一颗 2.5V 基准和一个运放怎么定出 0.926mA3.1 用“电压差”定电流而不是用“电压值”原文的恒流源结构是5V 供电LM385-2.5 提供 2.5V 基准运放 U2 的同相端接在 5V 与基准之间于是同相端电位为 5V - 2.5V 2.5V。运放输出驱动 PNP 三极管 Q1 的基极Q1 发射极接电流采样电阻 R1 的一端R1 的另一端接 5V。根据虚短反相端也就是 Q1 发射极也被拉到 2.5V。于是 R1 两端的电压是U_R1 5V - 2.5V 2.5V Ud流过 R1 的电流I Ud / R1 2.5V / 2.7kΩ ≈ 0.926mA这个结构的巧处在于5V 同时出现在 R1 的上端和基准的上端做差的时候被消掉了。电源从 5V 掉到 4.8VR1 上端和基准上端一起掉压差仍然是 2.5V电流纹丝不动。这就是“比值式偏置”的威力——它的精度不取决于电源有多稳只取决于基准有多稳、电阻有多稳。很多用分立稳压管加电阻搭恒流源的方案做不到这一点因为它的参考是相对地的电源一波动电流就跟着动。从设计动机上看这一步本质是把“绝对电压的精度问题”转成了“两个电压之差的精度问题”。绝对精度难做差值精度好做因为共模的那部分误差天然抵消。3.2 虚短虚断怎么把 R1 的电流搬到负载上推导链条是这样的运放反相端与 R1、Q1 发射极相连根据虚断反相端不取电流所以 R1 上的电流只能全部流进 Q1 的发射极没有第二条出路。这就是“电流搬运”的关键——R1 里的电流被强制等于发射极电流中间没有任何分流点。但这里立刻出现一个精度漏洞三极管的集电极电流并不等于发射极电流两者差一个基极电流。IC IE - IB IE × β/(β1)单只 9015 的 β 典型值在 100 以上误差约 1%。1% 的电流误差意味着什么后面会看到RT 和 I 是反比关系I 偏 1%RT 就偏 1%在 850℃ 附近约 390Ω就是 3.9Ω折合十度上下。这个量级不能接受。原文的解法是复合管Q1、Q2 接成达林顿结构总电流增益变成 β1×β2两只 β 都在 100 以上时总增益超过 10000基极电流占总电流的比例降到 0.01% 以下IC1 IE1 - IB2其中 IC1 β1·β2·IB2也就是说 IB2 只有 IC1 的万分之一忽略它带来的误差小于 0.01%这时候才可以理直气壮地说“集电极电流等于发射极电流”。这一步是设计里最容易被抄漏的地方——只抄恒流源拓扑、不抄复合管精度直接掉两个数量级。3.3 误差只剩两项R1 和 Ud把整条链路捋一遍电流 I 的误差源被压缩到两个元件上电压基准 LM385-2.5 和采样电阻 R1。LM385-2.5 是带隙基准初始精度在 1% 量级温漂典型几十 ppm/℃。R1 选金属膜电阻温漂可以做到 25~50ppm/℃比碳膜电阻的几百 ppm 好一个数量级。原文特意点出“R1 电阻要选择温漂较小的金属膜电阻”就是因为它直接乘在电流上。这里有个系统级的取舍值得说透如果 I 有 1% 的初始误差而 ADC 用的是另一颗独立的基准那这 1% 就实打实地变成测量误差。但常见的实现思路是让 ADC 的参考电压和恒流源的基准同源——RT Uo×R1/(11×Ud)如果 ADC 的满量程 VREF 也正比于 Ud那么 Ud 在比值里被约掉基准的初始精度和温漂对最终结果几乎无影响剩下的只有 R1 的精度和电阻网络的匹配度。这就是比例式测量的思路它不改善元件只是改变误差进入公式的方式。3.4 为什么是 0.926mA自热和信噪比的平衡电流取多大不是随手定的。往大里取信号强、后级放大倍数可以小、失调和噪声占比低往小里取PT100 自身的焦耳热小不会自己把自己烤热。算一下自热0.926mA 的平方乘以 390Ω850℃ 时的阻值约 0.33mW。PT100 在静止空气中的自热系数大致在 0.2~0.5℃/mW 量级0.33mW 对应 0.07~0.17℃ 的自热抬升。这个量级勉强可以接受但如果电流提到 5mA自热变成 10mW抬升就是好几度而且是在探头散热条件差的时候最明显——测管道表面温度、测静止空气温度时这个坑特别深。再看信号侧0.926mA 在 100Ω 上产生 92.6mV在 390Ω 上产生 361mV。这个电压已经足够大后级不需要太夸张的增益OP07 那 25μV 的失调电压折算进去只相当于 0.007℃。所以 0.926mA 是一个两头都留了余量的位置自热压得住信号也不至于弱到需要很高的增益。4. 差动放大级98.182 这个系数是怎么长出来的4.1 从 U1、U2 到 Uo增益 11 从哪来恒流源解决了“给多少电流”差动级要解决的是“怎么把 U1 - 2U2 这个减法做出来并放大到 ADC 能吃的范围”。原文给出的最终换算是RT Uo × R1 / (11 × Ud) Uo × 2700 / (11 × 2.5) ≈ 98.182 × Uo倒推一下这个 11 的来历。已知 RT (U1 - 2U2)/I而 I Ud/R1所以RT (U1 - 2U2) × R1 / Ud (U1 - 2U2) × 2700 / 2.5 1080 × (U1 - 2U2)再和 RT 98.182 × Uo 对照得到Uo 1080 / 98.182 × (U1 - 2U2) 11 × (U1 - 2U2)差动级的净增益就是 11。这个数字不是随便选的它由量程决定0℃ 时 RT100ΩU1-2U2 ≈ 92.6mV乘 11 得 1.02V850℃ 时 RT≈390.5ΩU1-2U2 ≈ 361mV乘 11 得 3.97V-200℃ 时 RT≈18.5Ω得 0.19V。5V 单电源供电下输出最高 3.97V刚好在轨内留出约 1V 的余量既用满了 ADC 的动态范围又不至于在高温端削顶。提示选增益时先算满量程输出再看 ADC 输入范围和运放的输出摆幅注意不是电源电压是 datashhet 里的 VOH/VOL负载电流下还要打折最后反推增益。先定增益再算量程十有八九会在某一端撞墙。4.2 U1 和 U2 权重不同这个减法怎么用电阻网络实现差动放大器天生只能做“等权相减”而这里要的是 U1 减两倍的 U2权重比 1:2。原文用 R4~R9 六只电阻搭网络我一般会这么理解它的结构前一级按 1:2 的权重做减法后一级再放大 11 倍两级串起来凑出 11×(U1 - 2U2)。具体到电阻取值等权差分的传递函数是 Uo (Rf/Rin)×(U - U-)只要反相支路的 Rf/Rin 是同相支路的两倍就能实现 U2 那一路的两倍权重。真正决定成败的不是公式是匹配差动级的共模抑制能力完全由电阻比值的一致性决定粗略估一下电阻相对失配 δ 对应的共模抑制比大约在 1/(4δ) 量级。用 1% 电阻CMRR 只有 25 倍左右换 0.1% 电阻能到 250 倍想再往上就得靠集成差放或者激光修调的电阻网络了。这个电路的共模电压其实不大——PT100 下端接地时U1 只有 0.09~0.36VU2 更是只有几十微伏共模量级很低。但长线引入的工频共模干扰是另一回事那部分幅值可能到几伏全压在电阻匹配上。所以现场看到的“读数周期性跳动”很多时候不是 AD 的问题也不是程序的问题是这六只电阻没配对。4.3 低通滤波与数字侧从电压到温度的最后一公里差动级的输出经 R10、C3 低通滤波再送 AD。一阶 RC 的截止频率是 f 1/(2πRC)取 R1010kΩ、C31μF截止频率约 16Hz。这个位置对 50Hz 工频的衰减只有约 10dB说实话不太够如果现场干扰强要么把 C3 加大到 4.7μF截止降到 3.4Hz要么靠 ADC 的积分采样在数字侧再压一道——双斜型 ADC 按 20ms 整周期采样工频的一个完整周期被积分掉抑制效果比模拟滤波还干净。数字侧要做的事很直白把 ADC 码值换算成 RT再查 PT100 分度表做插值。这一步看起来是纯软件实际上决定了系统的分辨率下限。/* 从 ADC 码值反算温度先算 RT再查分度表线性插值 */ #define VREF 2.500f /* ADC 基准电压V */ #define ADC_FULL 4096.0f /* 12 位 ADC 满码 */ #define GAIN 11.0f /* 差动级净增益 */ #define R1_OHM 2700.0f /* 恒流源采样电阻Ω */ #define UD_V 2.500f /* LM385 基准电压V */ /* 输入 ADC 原始码输出 PT100 阻值单位 Ω */ float code_to_rt(uint16_t code) { float uo code / ADC_FULL * VREF; /* 差动级输出电压 */ return uo * R1_OHM / (GAIN * UD_V); /* RT Uo·R1/(11·Ud) */ } /* 分度表从 -200℃ 起每 50℃ 一个点共 22 点 */ static const float pt100_tab[] { 18.52f, 38.04f, 59.69f, 82.88f, 100.00f, 119.40f, 138.51f, 157.33f, 175.86f, 194.10f, 212.05f, 229.72f, 247.09f, 264.18f, 280.98f, 297.49f, 313.71f, 329.64f, 345.28f, 360.64f, 375.70f, 390.48f }; #define TAB_N (sizeof(pt100_tab) / sizeof(pt100_tab[0])) #define T_MIN (-200.0f) #define T_STEP (50.0f) /* 输入阻值输出温度 ℃表外返回端点值 */ float rt_to_temp(float rt) { int i; if (rt pt100_tab[0]) return T_MIN; if (rt pt100_tab[TAB_N - 1]) return T_MIN (TAB_N - 1) * T_STEP; for (i 1; i TAB_N; i) { if (rt pt100_tab[i]) { float r0 pt100_tab[i - 1]; float r1 pt100_tab[i]; float t0 T_MIN (i - 1) * T_STEP; /* 段内线性插值PT100 在 50℃ 区间内近似线性 */ return t0 (rt - r0) * T_STEP / (r1 - r0); } } return T_MIN; }code_to_rt里那一行乘积除以(GAIN * UD_V)就是前面倒推出来的 98.182 的直接实现——2700/(11×2.5) 恰好等于 98.18。参数改任何一个这个系数都得跟着重算别硬编码 98.182 进代码写成表达式更安全。rt_to_temp用 50℃ 一段的线性插值误差来自 PT100 的非线性。PT100 在整个量程上的非线性大约在零点几欧量级50℃ 段内插值残差通常在 0.01~0.05℃ 以内对 0.1℃ 级的系统够用。要更准就换二次多项式拟合或者把表加密到 10℃ 一点代价是查表时间变长——在 8 位单片机上这个代价不小得看主频余量。注意分度表是标准件但插值算法是自己写的最容易出的错是段边界处理。rt恰好等于某个表点时rt pt100_tab[i]会落到下一段去插值结果一样但如果写成又会在端点处出负零。这类边界 bug 平时测不出来只在冷启动和满量程附近偶发。5. 避坑与排查读数看起来正常、温度却不对的五种情况5.1 五条踩坑记录现象一常温标定很准一进高温工况就系统性偏低两三度。原因恒流源的采样电阻用了普通碳膜电阻温漂几百 ppm/℃。柜内温度从 25℃ 升到 55℃电阻涨了约 1%电流跟着涨 1%而 RT 和 I 是反比关系算出来的阻值就偏小温度自然偏低。这个漂移是单调的所以标定时怎么调都调不平。 解决R1 换金属膜电阻温漂控制在 25~50ppm/℃更彻底的做法是让 R1 远离发热器件 layout 上别把它放在三极管和 LDO 旁边。现象二换了一根更长的电缆后零点偏了几十毫欧而且怎么调零都调不回来。原因新电缆是三根独立单芯线长度差了几厘米线径也和原来不一样三根线的电阻不再相等2.4 节里的 Δ 和 δ 不再是零三线制的减法消不掉这部分失配。 解决换成同一根三芯电缆三根线同长度同线径同走向接线端子用同一型号压接工艺一致。换线之后必须重新标定不能沿用旧参数。现象三为了抗干扰在 U2 端对地并了一只电容结果精度反而变差还随温度漂。原因电容本身有漏电阻等效于在 U2 端并了一个负载破坏了“这条线上没有电流”的前提副本失真减法减错。电解电容的漏电流随温度指数上升所以漂移还特别大。 解决U2 端要么什么都不接要么先过一个运放跟随器再滤波滤波电容放在差动级输出之后别放在高阻输入节点上。现象四低温段0℃ 以下误差明显放大常温段却很好。原因两个因素叠加。一是 OP07 的失调电压漂移虽然只有 0.5μV/℃但被增益 11 放大后环境温度变化 40℃ 就是 220μV折算到 RT 约 2.2mΩ折合 0.006℃这一项其实不大真正的大头是 AD 在低码值区间的量化噪声和零点误差-200℃ 时输出只有 0.19VADC 码值不到满量程的 4%相对误差被放大。 解决软件上做两点标定零点和满度各标一次或者在低温段单独做分段标定硬件上把增益提上去、把零点垫高让低端信号离开 ADC 的死区。现象五读数周期性跳动频率跟着现场设备走。原因差动级六只电阻没配对共模抑制不足长线拾取的工频共模干扰漏到输出也可能是一阶 RC 截止频率 16Hz 对 50Hz 只有 10dB 衰减压不住。 解决R4~R9 用 0.1% 金属膜电阻最好同批次模拟侧把 C3 加大到 4.7μF数字侧用整周期积分采样信号线用屏蔽双绞屏蔽层单点接地。5.2 上电调试的顺序别跳步拿到板子别急着接传感器按这个顺序走能把问题定位到具体一级先断开 PT100用 100Ω 精密电阻代替测恒流源输出电流。万用表串进回路读数应该在 0.926mA 附近偏差超过 1% 就回去查 R1 和基准。保持 100Ω 不变测差动级输出 Uo。按公式应该是 100 × 0.926mA × 11 ≈ 1.019V。这一步验证的是增益 11 对不对。换成 390Ω 电阻Uo 应该约 3.97V。如果这里削顶了说明增益选大了或者运放输出摆幅不够。接回 PT100在已知温度点冰水混合物 0℃、沸水 100℃按当地气压修正比对读数偏差写进标定表。最后做温度循环从常温升到上限再降回来看回程误差。回程误差大通常是自热或者热传导路径的问题不是电路问题。6. 设计取舍为什么停在 OP07 和三线制三线制是一个明确的折中。它用一根额外的线、一个高阻输入节点换掉了导线电阻的主要部分但没有换干净——残余的失配误差永远存在量级取决于施工质量。真要彻底消除得上四线制恒流激励走两根线电压测量走另外两根线测量支路完全不取电流导线电阻在数学上被彻底隔离。代价是多两根线、多一路高阻差分输入、接线端子翻倍在多点测温的 RTU 上这个成本是实打实的。接法导线电阻影响线数典型误差适用场景两线制全部串入无法消除20.5~5℃短线、精度要求低三线制共模部分消除失配残留30.1~0.5℃工业现场主流四线制完全隔离40.01~0.05℃计量、实验室再看运放选型。OP07 的输入失调电压小于 25μV被增益 11 放大后是 275μV折算到 RT 约 2.7mΩ对应 0.007℃失调漂移 0.5μV/℃40℃ 温变下折算约 0.02℃输入偏置电流 ±2nA在 0.1Ω 导线上产生的误差可以忽略。把这三项加起来运放贡献的误差在 0.03℃ 量级——而 R1 的 1% 初始误差如果没标定直接就是几度电阻网络的 1% 失配能带来几十毫伏的共模泄漏。也就是说在这个设计里运放根本不是瓶颈花大价钱换斩波稳零运放收益远不如把 R1 换成 25ppm 的金属膜、把 R4~R9 换成 0.1% 配对电阻来得直接。精度天花板在哪把账算清楚恒流源电流精度标定后可以压到 0.05% 以内、差动级增益精度取决于电阻比值0.1% 电阻给出 0.2% 量级、分度表插值残差0.05℃ 量级、自热0.1℃ 量级、导线失配取决于施工0.05~0.3℃。加起来一套认真做的三线制系统落在 0.2~0.3℃ 是合理的再往上就得动四线制和更高等级的基准了。这套电路的真正价值不在精度数字在于它把误差源一个个摊开、一个个摁住用差值偏置摁住电源波动用复合管摁住基极电流用高阻输入摁住导线分流用差动减法摁住共模导线电阻。每一处都是“用一个结构换一个误差项”代价小、收益明确这才是它能在制造现场用几十年不倒的原因。我第一次独立做这类电路时把 R1 随手用了手边一颗碳膜电阻常温标定漂亮得不行装机进柜跑了半个月高温工况且读数一路往下飘。拆下来量那颗电阻常温 2.698kΩ用电吹风一吹就到 2.72kΩ。从那以后我每次画恒流源都会在 BOM 上把采样电阻的温漂和初始精度单独标出来标定前先做一遍温度循环不通过就不往下走。希望这些踩过的坑能帮你少走一遍。本文还有配套的精品资源点击获取