简介:一套基于AD590温度传感器与STC12C5608AD(51内核)单片机的温度检测系统完整工程,面向电子爱好者、嵌入式初学者以及需要完成课程设计的学生。压缩包共29个文件,约1.11MB,以C语言源码、头文件、Keil工程文件、hex烧录文件及A51启动文件为主,并附带测试截图与一键清理脚本,便于直接编译、烧录和验证。资源内提供“整版测试”“两路显示”“ad测试”等不同模块的工程版本,代码涵盖AD590电流信号调理、ADC配置、温度换算、CH451显示驱动等关键环节,可帮助读者理解从模拟信号采集到数字显示的全流程。目前已有661人学习下载,适合用来学习单片机ADC应用、传感器接口设计以及C51编程技巧,也可作为温度检测类课设的参考方案。 前阵子接了个小活儿,给一套循环水监控做温度采集。现场有电机、有变频器,温度探头到控制柜的距离差不多40米,客户要求误差正负1℃以内,测温范围0到100℃。翻了一晚上选型手册,最后定了AD590——这枚1970年代的老器件,搭一套温度检测系统成本不到百元。项目做完相当顺利,我干脆把从选型、电路设计到标定、现场调试的整个过程完整记下来,给想用模拟温度传感器做采集的朋友做个参考。
1. 选型复盘:为什么这个项目最终落在AD590上
1.1 AD590的工作原理和电流型输出的优势
AD590本质上是一个两端电流源,输出电流与绝对温度成正比,比例系数是1µA/K。在25℃也就是298.15K的时候,输出电流是298.15µA。它内部利用PN结正向压降随温度变化的物理特性,再经过补偿电路把温度线性映射成电流。注意,它直接输出的不是电压,而是电流,这个区别非常关键。
用电流表示温度的好处很直白:电流在导线上传输时,不会因为线路电阻的压降而损失信息。只要AD590两端供电电压在4V到30V之间,输出电流几乎不受电源电压波动影响。这对40米长的信号线来说是天然优势。如果换成热电偶,毫伏级信号走这么长的线早就衰减得不成样子;换成PT100,还要操心桥路激励电流和导线电阻的补偿问题。
另外一个优点是完全免冷端补偿。热电偶测温必须知道冷端温度,否则误差能到十几度。AD590测的是绝对温度,读数减去273.15就是摄氏度,不需要任何补偿电路。再加上它的线性度很好,整个测量范围内非线性误差典型值只有正负0.3℃。对于中等精度、预算受限的项目,这种模拟传感器的性价比非常高。
1.2 跟热电偶、NTC、PT100和数字传感器的对比
为了说清楚为什么没选别的方案,我列了一张对比表:
| 方案 | 输出类型 | 线性度 | 测温范围 | 冷端补偿 | 成本 | 长线传输 |
|---|---|---|---|---|---|---|
| AD590 | 电流1µA/K | 好 | -55~150℃ | 不需要 | 低 | 好 |
| PT100 | 电阻 | 一般,需查表 | -200~850℃ | 不需要 | 中 | 差,需三线/四线 |
| 热电偶 | 毫伏电压 | 非线性严重 | -200~2000℃ | 必须 | 低 | 差 |
| NTC | 电阻 | 非线性严重 | -40~150℃ | 不需要 | 极低 | 差 |
| DS18B20 | 数字单总线 | 一般 | -55~125℃ | 不需要 | 低 | 一般 |
从表里能看出来,PT100和热电偶在宽范围和高温场景里表现优秀,但在0到100℃这个区间,AD590的线性和免补偿优势非常突出。NTC虽然便宜,但电阻—温度曲线是指数型的,要做分段逼近,标定麻烦。DS18B20虽然是数字输出,但没有AD590耐温范围宽,单总线协议在强电磁干扰环境下也更容易通信失败,再加上现场已有模拟采集通道,用起来反而多一道转换。
当然AD590也不是没有短板。它需要额外的ADC采样通道,数据要自己做换算和标定。最重要的一点是,出厂精度只有K档正负2.5℃、J档正负5℃,不做标定直接用,在正负1℃的工程要求下根本交不了差。这也是我把标定单独拿出来写一章的原因。
2. 硬件调理链路:电流源信号如何变成ADC能读的电压
2.1 采样电阻阻值计算:别一上来就选10kΩ
AD590输出的是电流,单片机ADC只能读电压,所以最直接的办法是让电流通过一个精密电阻转成电压。很多人习惯性选10kΩ,因为10kΩ上每1µA对应10mV,算起来方便:10mV/K,0℃时2.7315V,100℃时3.7315V。
问题恰恰出在这里。如果ADC参考电压只有3.3V,100℃对应的3.7315V已经超出量程,满量程只能测到56℃左右,再往上全部削顶。我之前算过,目标测温区间是0到100℃,参考电压3.3V,那采样电阻选8.2kΩ比较合适:每K对应8.2mV,0℃时输出约2.2398V,100℃时约3.0604V,两头都留了余量。这个阻值既兼顾了灵敏度,又没让最高温电压贴到参考电压边缘。
电阻选型还有一个容易忽略的点:温漂。普通碳膜电阻温漂几百ppm,现场温差一大,标定好的数据就飘了。我选的是0.1%精度、25ppm/℃的金属膜电阻。按25ppm算,温升20℃电阻变化0.05%,折算成温度误差约0.05℃,在可接受范围内。预算充裕的话,用低温漂精密电阻会更稳。
2.2 运放跟随、RC滤波和钳位保护
采样点电压直接进ADC有一个隐患:单片机ADC的采样电容在采保阶段会瞬间抽取电荷,等效于在负载电阻上叠加了一个电流脉冲。AD590虽然输出阻抗高、恒流特性好,但采样电容的电荷注入还是会让ADC读数来回跳,尤其在多通道切换时更明显。解决办法有两个:一是把ADC采样时间拉长,二是在ADC前面加一级运放跟随器做缓冲。我实际用了LM358做跟随,采样稳定性立刻改善。
信号进ADC之前,我还加了一阶RC低通滤波,R取1kΩ、C取0.1µF,截止频率约1.6kHz,用来滤现场变频器谐波和高频噪声。钳位保护也必须有。前面提到传感器短路时,采样点电压会直接接近供电电压,如果供电是12V,灌进ADC引脚就烧了。我在ADC输入引脚对地和对3.3V之间各接了一个肖特基二极管做的钳位网络,把电压限制在-0.3V到3.6V之间,成本几毛钱,省了换单片机的大麻烦。
2.3 供电电压选择与传输线的处理
AD590的工作电压范围是4V到30V,但注意这个4V是指AD590自身两端的压降。用了8.2kΩ采样电阻之后,最高温时电阻上的压降约3.06V,所以供电电压至少要7V以上。我一开始图省事用5V供电,结果在0℃时传感器两端只有约2.76V,根本无法正常工作。后来把供电提到12V,传感器两端在0℃约9.76V、100℃约8.94V,全程留足余量。
供电电压高了,自热功耗也会变大,这一点在后面调试章节会详细说。传输线方面,我用了双绞屏蔽线,屏蔽层在控制柜端单端接地,传感器端不接。双绞线能抵消一部分磁场耦合的差模干扰,屏蔽层单端接地则避免形成地环路电流,这是长线传输里很关键的做法。
3. 两点标定法:把出厂漂移拉回工程精度
3.1 出厂精度到底差多少,为什么必须标定
AD590的K档出厂精度是正负2.5℃。对不少场景来说这个精度够用,但要满足客户正负1℃的要求,必须做标定。其实AD590的重复性很好,同一颗器件在相同温度下反复测,读数波动很小,问题主要出在不同器件之间的输出曲线斜率和截距有差异。所以标定的本质是测出这一颗传感器实际曲线的斜率和截距,然后在软件里补偿掉。
还有一点特别容易忽略:AD590的标定结果只在标定温度点附近有效。如果只在冰点标定,然后拿去测80℃,因为实际斜率跟理论值有偏差,误差会被放大。所以两点标定的温度点要尽量覆盖实际工作区间。我是用0℃和100℃两个点标定,工作区间正好落在中间,外推误差很小。
3.2 标定操作与数据处理过程
标定操作我用了恒温水浴。没有恒温水浴的话,用冰水混合物和沸腾纯净水代替也可以,但沸水温度会受大气压影响,有条件还是水浴更稳。
操作步骤整理如下:
- 把AD590探头完全浸入0℃冰水混合物,等读数稳定5分钟,记录ADC原始码值,记为ADC0。
- 把探头转入100℃水浴,同样稳定后记录ADC1。
- 同时用一支计量过的标准温度计记录两个标定点的实际温度T0、T1。
- 用两点式算出实际斜率和截距。
因为软件里直接对ADC原始码做换算,中间不需要经过电压,公式是:
slope = (T1 - T0) / (ADC1 - ADC0) offset = T0 - slope * ADC0 T_measured = slope * ADC_raw + offset这里T的单位是℃,ADC_raw是单片机读到的数字量。为什么不先转电压再算温度?因为电压转换里要引入基准电压的精度,而基准电压本身可能有偏差。直接用ADC码和温度做线性映射,可以把基准电压偏差一并吸收进标定斜率和截距里,省一个环节就少一项误差。
3.3 标定结果与残余误差
我当时标定了四颗AD590K。以其中一颗为例,0℃时理论输出对应的ADC码约2779,实际读数是2804,差了约25个码。按照8.2kΩ采样电阻、3.3V参考电压、12位ADC来算,25个码相当于约2.5℃,刚好落在K档的出厂精度范围内。如果不标定,这颗器件已经超了客户要求误差的两倍多。
标定完之后,把四颗传感器放回0℃和100℃水浴验证,最大偏差从标定前的2.3℃降到了0.1℃以内。在50℃和75℃两个中间点用标准温度计对比,最大误差0.25℃。这个残余误差主要来自恒温水浴的温场均匀性和ADC噪声,传感器本身的线性度还是很扎实的。
有一点提醒:标定后的斜率和截距系数要存到非易失存储器里,每颗传感器对应一份标定数据。批量生产时,最好在产线上把标定参数和单片机唯一ID绑定,这样后期维护替换时也能快速核对。
4. 软件处理:工程量换算、滤波与断线保护
4.1 ADC码值到温度的换算细节
标定完成后,软件换算就是简单的线性插值。12位ADC配3.3V参考电压、8.2kΩ采样电阻,1个LSB对应约0.1℃。如果觉得分辨率不够,可以用过采样技术把分辨率提到0.03℃左右,不过对这个场景来说,12位原始分辨率已经够用。
写代码时要注意整数运算的截断误差。用浮点运算当然最简单,但低成本MCU很多没有硬件浮点单元,每次换算都跑浮点会拖慢采样循环。我的做法是把标定参数放大100倍存成整数,乘出来再除以100,全程整型运算,速度快,误差也可以接受。如果MCU资源充裕,直接浮点也没问题。
4.2 滑动平均滤波的窗口选择
现场有变频器和接触器,采样值偶尔会出现尖峰。我用了两个滤波方法叠加:中值滤波负责剔除毛刺,窗口N=5;滑动平均负责平滑随机噪声,窗口N=16。中值滤波对尖峰干扰特别有效,滑动平均对随机噪声更友好,两者配合下来,信号非常干净。
但滤波是有代价的。中值加滑动的组合把响应时间拉长了,实测温度阶跃响应从无滤波的大约1秒变成约3秒。对循环水这种缓慢变化的对象,3秒延时完全能接受;如果被测对象温度变化很快,就得减小窗口,或者改用加权滑动平均。滤波参数没有标准答案,要跟着被控对象的动态特性走,这是现场调试最容易忽略的经验。
4.3 传感器故障检测和超量程判断
模拟传感器系统最怕的是传感器坏了,却还输出一个看似合理的温度值。AD590的故障模式比较清晰:开路时采样点被电阻拉低,电压接近0V;短路时采样点直接接近供电电压,超出正常量程。所以软件里做了两个门槛判断:
- ADC值低于正常最低限(对应约-10℃的码值),判定为开路或断线。
- ADC值高于正常最高限(对应约110℃的码值),判定为短路或超量程。
这两个门槛要留一定裕量,避免工作在低温区间时误报。程序里还加了一个防抖逻辑:连续3次采样都超限才报警,防止偶发干扰触发误报。这样现场维护人员能直接通过面板看出是哪一路传感器出问题,不用拿万用表挨个量。
5. 现场调试记录:自热、长线干扰和地噪声的真实影响
5.1 自热效应:探头散热和间歇供电才是关键
第一次把传感器装到循环水管路上,我发现读数比旁边水银温度计高了0.4℃左右,而且探头在空气中比浸在水中偏高更明显。原因是自热:AD590自身功耗让管芯温度高于被测介质温度,散热条件越差,偏高越多。
处理办法有两个。第一,把传感器供电从15V降到12V,自热功耗降下来一些;第二,把探头装进铜套,涂上导热硅脂,再紧固到管壁,让管芯热量快速传导到被测介质。两个措施
本文还有配套的精品资源,点击获取