找回密码
 加入炫逗玩
  • QQ空间
  • 回复
  • 收藏

玩3D打印机的朋友,可能会希望装配自己的3D打印机,或者改进已有的3D打印机设计(有这方面需求的朋友,可以参考【打印虎】零基础自制RepRap Prusa i3图解全攻略)。在这个过程中,经常会遇到关于热敏电阻方面的问题。热敏电阻看似简单,但其实很有门道,在设置固件的时候,它常常是最复杂的一项设定。固件设置的过程中,我们得提供一组热敏电阻的配置参数,或是更复杂,提供一个温度-阻值的对应表,才能完整整个设置。但是这些参数的意义是什么,从哪里能得到这些参数,却又没有人告诉我们。这可真是难为了3D打印机爱好者。打印虎经过仔细研究,终于摸清了跟热敏电阻有关的方方面面,今天就给大家仔细讲解一下。

在我们正式开始之前,先打个小广告。打印虎日前已经开始销售RepRap Prusa i3 3D打印机套件,如果你自己或周围的朋友对搭建3D打印机感兴趣,不妨选择打印虎。我们提供的元件,经过严格筛选,品质优良。3D打印机的关键部件都做了专门的优化,包括采用了优质步进电机、全铝挤出头、铝基板热床以及改进的梯形丝杆Z轴,让你的3D打印机达到更高的精度,并且经久耐用。不光硬件质量有保障,打印虎还特别提供免费的固件升级服务,从购买之日开始,打印虎承诺每季度一次,至少四次固件升级,给你的3D打印机提供无限助力。另外,打印虎还提供最好的3D打印机技术支持服务,与顾客做朋友,让你没有后顾之忧。如果想了解更多,请访问我们的产品页面http://www.dayinhu.com/products

第一节,热敏电阻基础

3D打印机上常用的热敏电阻,是NTC(Negative Temperature Coefficient,也就是负温度系数)热敏电阻。所谓负温度系数,就是当温度上升时,热敏电阻的阻值减小。在3D打印机上,最常见的是玻璃封装的热敏电阻。不论是轴向导线的玻封NTC热敏电阻:

还是单端的玻封NTC热敏电阻:

这些都在3D打印机上很常见。

对于一个普通电阻,它的阻值是最关键的一个参数。而对于一个热敏电阻来说,最关键的参数是温度-阻值对应曲线。有些公司生产的热敏电阻,会在对应的数据手册(Datasheet)上,详细列出一个表格,上面的信息就是这个温度-阻值对应曲线。当然,表格肯定只能列出有限的采样点,但如果采样密度足够大,就可以足够精确地表示这条曲线了。

总是使用一个表格的方式表示热敏电阻的特征,还是过于麻烦了。为了简化参数,前人研究出了多种热敏电阻的数学模型。其中最简单,对于3D打印机也足够用的一种模型,是把热敏电阻的关键参数简化为三个:第一个参数是T0表示一个参考温度,通常是25℃;第二个参数是R0表示参考温度下的阻值;第三个参数是beta(也可以写做希腊字母β),它是一个描述热敏电阻阻值变化特征的参数,使用beta值可以计算出热敏电阻一个特定的阻值所对应的温度。这种热敏电阻参数模型,经过长期使用,得到了广泛的认可。有些热敏电阻的厂商,甚至不再给出热敏电阻的温度-阻值对应曲线,而是直接给出这三个参数,就算是完整地提供了热敏电阻的资料。

热敏电阻的特点,是稳定性、一致性都很好。不同的热敏电阻个体,只要他们的参数相同,就会表现出完全一致的电子特性。甚至不同厂商生产的热敏电阻,也会有几乎完全一样的特征曲线。这个特点非常重要,在下面,我们就会看到,很多与热敏电阻相关的数据和设置安排,都表现和利用到了这个特征。

如果我们拿到一个热敏电阻,却不知道它的内部参数,希望通过测量的方式得到,也是可能的。这种情况下,我们需要使用这个公式:

其中,R0和T0我们已经都讲过了。T和R代表一个比较高的测量温度(比如85.5℃)下测量的阻值(比如5000欧姆)。同时假如T0是22℃,R0是115700欧姆,则可以计算beta值等于5237。

这样的方法从理论上完全可行,但实际操作需要一些设备,非常的麻烦。打印虎建议大家,在有可能的情况下,还是尽量从卖家获取热敏电阻的参数信息,就不要自己测量了。

在RepRap Prusa i3 3D打印机上,两个地方用到了热敏电阻。一个用于测量挤出头的温度,另一个用于测量热床的温度。用于测量挤出头温度的热敏电阻可见下图。红圈内的黑色导线头部,3mm金属套内的,就是使用无头螺丝固定的热敏电阻了。

用于测量热床温度的热敏电阻可见下图。这里的热敏电阻,直接使用了玻封形式,用kapton胶带粘贴在热床的底部。尽量与热床紧密贴合。

第二节,热敏电阻在电路板上的连接

在上一节中,我们了解了热敏电阻的基础知识,以及它在RepRap Prusa i3 3D打印机中的使用方法。那么从电路的角度,热敏电阻是如何连接的呢?在Melzi上,电路板最右上角的两个连接口BTEMP和ETEMP,就是为热敏电阻专门准备的:

同时,图中两个小红圈内的,就是R2。关于R2,我们下面会详细解释。

只知道在电路板上如何连接,还不够我们解决问题。实际上,热敏电阻部分的电路图也非常简单,是这样的:

其中R就是热敏电阻,而R1总是不连接。Vref通常是是+12V电压,被R和R2分压得到的Vmeasured的值经过ADC转换,就可以被单片机读取。那么如何计算热敏电阻的分压,R2是一个关键。不幸的是。在不同的电路板设计中,R2有着不同的取值。我见过两种不同的Melzi电路板,他们分别使用了4.7K和10K的阻值。后面我们就会看到,不同的阻值,对应了不同的热敏电阻计算发放和温度-ADC值对应表,不能搞错。

第三节,热敏电阻的设置(Repetier-firmware)

上面讲了很多理论上的东西,那么如果我用Prusa i3 3D打印机,应该如何设置固件呢?这里我们以Repetier-firmware和Marlin两种最常见的固件为例进行说明。

如果你使用的是Repetier-firmware,请首先参考【打印虎原创】Repetier-firmware深度配置图解教程。假如大家对它的在线配置工具已经初步了解,那么可以在“温度设置”一栏,找到这项设置:

这个下拉框看似简单,但如果尝试使用,就会发现其中的玄机。我们先看一下其中的选项都有哪些,如下图所示:

首先,这个下拉列表中,先列出了一系列给定型号的热敏电阻。根据我的调查,虽然这些型号在国内不好找,但应该是美国市场上常见的元件型号。这里面,有些型号非常的具体清晰,比如第一项Epcos的100K热敏电阻,就列出了非常具体的型号。但另一些,比如第二项热敏电阻,就只列出了一个非常模糊的名字。光看到名字,完全无法搞清楚它对应的beta值。即使我使用一个R0=200K的热敏电阻,也无法确定使用这项设置就是正确的。

既然这些预定义选项的热敏电阻在国内不太常见,现在我们又不了解他们的情况,不如先跳过,继续看后面的选项。这些预定义的热敏电阻,我们留到下一节再具体讨论。从AD8494这一行开始,就不是热敏电阻了,而是一些具有温度感应功能的芯片。我在国内还没有见过配置这种测温芯片的3D打印机,同时我们这篇文章主要讨论热敏电阻,所以这种类型也就略过不谈了。

再接下来,是用户自定义表格(User defined table)。当我们选择到这一个选项的时候,在页面底部会出现下图所示的一段:

在这里,我们可以通过一个表格的形式,定义正在使用的热敏电阻。这里需要指定的数值,包括了R1(通常是0,代表未连接,不是短路哦),R2(根据所使用的电路板具体情况而定),以及一组温度-阻值的对应关系表。第一节已经谈到,这组温度-阻值的对应关系表,有可能由元器件厂商在元器件数据手册中提供。每当加入一行数据之后,ADC一列会展现出自动计算出的ADC数值。虽然我们在这里填写的是温度-阻值对应表,但实际生成的配置文件中,已经转化为温度-ADC值关系表了。而根据图中的分压电路,温度-ADC值关系表中的值,是与R2直接相关的,因此这里的R2的值必须填写正确,否则不能计算出正确的温度。

当然,有些热敏电阻的厂商,并没有在数据手册中直接给出温度-阻值对应关系表,而是按照简化模型,直接给出了一组三个参数,T0, R0和beta。如果是这种情况,我们可以直接使用下面的选项,通用热敏电阻表格(Generic thermistor table)就可以了。选择这个选项之后,页面底部也会相应的变化:

可以看到,在这种情况下,固件设置就不需要用户提供完整的温度-阻值对应关系表,而是改为提供一组简化参数。如果你的热敏电阻厂商直接提供了T0, R0和beta参数,那么直接填入也就可以了。这三个关键参数之后的的温度范围(Min/Max Temperature)不会对计算产生实际影响,只是确定了计算温度的最小和最大值;而最后的R1/R2前面已经介绍过了,虽然不是热敏电阻的内部参数,同样也必须填写正确才能最终得到正确的温度值。

第四节,热敏电阻的设置(Marlin)

用过Marlin固件的朋友们都知道,Marlin是没有类似于Repetier-firmware的在线配置工具的。配置Marlin固件,还必须使用更为原始的直接编辑配置文件的方法,相对要困难一些。如果没有这方面的经验,首先请参考【打印虎原创】RepRap_Prusa_i3_3D打印机固件Marlin firmware配置教程。在对Marlin配置有了初步了解之后,可以在Marlin的配置文件中发现这样一段,是直接与热敏电阻相关的:

可以看出,这段其实与Repetier-firmware配置工具中的下拉框内容类似,也是分为

(1) 负值是温度感应芯片;

(2) 0是未使用

(3) 100以下是常用的热敏电阻,也就是我们这篇文章讨论的内容;

(4) 100以上是Pt100/Pt1000温度传感器,我没实际用过,不太清楚具体情况,需要的朋友请自己查资料吧;

最遗憾的一件事情,是Marlin似乎并不支持用户直接使用T0, R0以及beta值来定义一个热敏电阻。这让事情变得麻烦了很多。下面,我们只有两个选择了,要么在预定义的热敏电阻中选择一个并使用,要么自己列一个热敏电阻的温度-ADC值表格并使用。

先说使用预定义的热敏电阻。预定义的热敏电阻,每个都在Marlin中对应了一个温度-ADC表格。这样的每个表格,实际上都对应了不同的T0, R0, beta这三个热敏电阻参数以及R2这个电路参数。要想找到对应的表格,必须把这四项内容都对应上。如果没有完全对应,测量出的温度,就肯定不是正确的。

仔细看一下configuration.h中提供的注释,再加上定义热敏电阻温度-ADC值对应表格的文件thermistortables.h中提供的注释,就会发现上面提到的这四项参数在注释中给出的很不全面。有些有beta值,有些没有给。有些指明了一种特定型号的热敏电阻,而另一些则含糊其辞。因此,想全面利用这个表格,我感觉是很困难的。想找到表格中的各种热敏电阻,在国内似乎也是困难重重。

好在这个表格的其中一个选项,也就是选项60,对应了最最常见的一种热敏电阻。经过我们的分析和测试,这种热敏电阻T0=25, R0=100k, beta≈3950, R2=4.7k。如果你的配置正好是这个情况,那么恭喜你,你可以直接在

#define TEMP_SENSOR_0

#define TEMP_SENSOR_BED

后面,填写60这个数字。否则,打印虎的建议是,不要使用预定义的表格了。这个表格引起的麻烦会比你的实际收获多。

好了,到此为止,如果你要用Marlin作为固件,并且使用了并非最常见的可以对应于选项1的热敏电阻作,那大概只剩下最后一条路可以走了,那就是自定义温度-ADC表格。做这件事需要几个步骤:

第一步,创建温度-ADC表格;

第二步,给这个表格赋予一个编号;

第三步,使用这个编号。

参考thermistortables.h文件中的各个表格,要创建一个温度-ADC表格并不算特别困难。为了满足C语言的规范,我们自己创建的表格,也必须满足一定的要求。首先,表格的位置,要放在这里:

然后,表格要以

这样一行作为开头;要以

这样一行作为结尾。

中间的部分,就是这个表格的数据了。同样参考已有的表格,左侧的数字,是由低到高的ADC值;右侧的数字,是由高到低的温度值。

如果你的数据来源,是数据手册中提供的温度-阻值表,那么需要考虑到R2的分压效果,并把分压比例乘以1024(这是10-bit ADC的精度),得到某一温度下阻值对应的ADC值。

如果你的数据来源只有数据手册中列出的T0, R0以及beta值,那么反而好办些,可以利用下一节中介绍的工具,从这三个参数计算得到整个表格。

表格已经搞定了之后,我们要给这个表格赋予一个编号。我感觉99是一个合适的数字,因此把表格的第一行改为

这一步就完成了。

最后,要使用这个编号。使用这个编号的方法也很简单,回到configuration.h文件,把热敏电阻的一段,修改为这样:

当然,这里我们假设了你在挤出头和热床上使用了同样型号的热敏电阻,因此这两个地方都使用了我们自定义的热敏电阻编号99。如果你使用了两种不同的热敏电阻,那么你可能还需要启用数字98,再做一次自定义热敏电阻表格的工作。

第五节,热敏电阻表格计算脚本的使用

在上两节我们已经看到,相比于Repetier-firmware固件,Marlin固件没有直接提供通过T0, R0以及beta值设置一个热敏电阻的方法。如果所使用的热敏电阻在预定义表格中不存在,用户就必须通过一个自定义表格,设置一个热敏电阻。这对于只知道热敏电阻三参数的朋友来说,显然是一个麻烦事。好在RepRap.org提供了一个小工具,可以在一定程度上帮助我们。这个工具叫做createTemperatureLookup.py(打印虎本地下载百度云下载)。

一个坏消息是这个工具是Python语言编写的,如果你用的是Windows,则还需要另外安装Python语言的运行环境。而且,这个脚本只兼容Python 2,对于最新版本的Python 3,则还需要一些修改才行。为了简化,我们这里还是用Python 2.7.8吧(打印虎本地下载百度云下载)。

准备好了环境,我们就可以运行了。在Windows中运行cmd.exe,进入命令行模式。在命令行下,先切换到createTemperatureLookup.py所在的目录(我的是D:\work目录),然后键入命令:

C:\Python27\python.exe createTemperatureLookup.py –t0=25 –r0=100000 –beta=3950 –r1=0 –r2=4700

这一行命令的参数,含义都很明确,包含了热敏电阻内部参数T0, R0和beta,以及电路上的参数R1和R2,完全与上面我们的讨论相同,就不重复解释了。结果如图:

好了,表格已经得到,同样地,左侧的数字,是由低到高的ADC值;右侧的数字,是由高到低的温度值。与我们所需的状态完全匹配。如果用在Marlin中,唯一的不同是在文件thermistortables.h中,左侧的值需要再*OVERSAMPLENR。这里可以理解为一个格式问题,只要大家把格式搞对,最终就可以得到正确的结果了。

第六节,Marlin预置选项设置的对比

上面几节,我们已经介绍并反复使用了在温度-阻值(以及温度-ADC值)数据表。在已知这个数据表,或者已知T0, R0, beta三项关键参数的情况下,我们已经可以正确配置Repetier-firmware和Marlin固件。最后的这一节,我想讨论一下Marlin中预定义的数据表。这纯粹是为了满足和虎哥我一样有好奇心的朋友。如果没有兴趣,就可以不再继续阅读本文了。

如果还有兴趣,那我们继续。话说Marlin固件中,列出了一大堆预定义的热敏电阻的温度-ADC值对应表。根据注释,这些表格,有些我们知道热敏电阻的具体型号,有些知道了关键的三个参数T0, R0和beta,有些则更模糊,只知道其中部分信息。那么我们如何理解这些预定义的热敏电阻表格呢?

首先,上文已经谈到神奇的选项60。它对应了最常见的一种热敏电阻。经过我们的分析和测试,这种热敏电阻T0=25, R0=100k, beta≈3950, R2=4.7k。我们看一下60对应的注释:

这里只提到了R0=100k以及beta=3950,在thermistortables.h中,还有更多的注释:

所以这个表格,其实就是通过createTemperatureLookup.py生成的!和我们在上一节所举的例子完全一样。看到这里,你就知道我们为什么选择了60这个选项了吧。

事实上,再深入研究,就会发现不仅选项60是最常见的热敏电阻,选项7、选项11都是。简单观察数字,其实还很难得到这个结论,如果你把这个表格绘制出来,情况就不同了:

看到这张图,是不是觉得很有趣?红色的点,是选项7;绿色的点,是选项11;蓝色的点,是选项60。可以看出,这三条由采样点构成的曲线,非常完美的匹配在了一起,简直就是一条线。再看选项7的注释:

和选项11的注释:



可以看出几个特点:

(1) 这三条曲线,数据来源确实不同,60来自脚本计算的数据;7和11,应该是来自于各自公司提供的数据手册;

(2) 它们的R2都是4.7k电阻;

(3) 它们的beta都在约等于3950,其中11和60都等于3950,而6根据数据手册beta=3974;

有些朋友,在设置热敏电阻的时候,图省事把选项设置为1。那么1和60的差别有多大呢?大家可以从下图得到一些启发:

图中红色点是选项1,绿色点是选项60。可以看出,在低温区,这着两条曲线差别不大。但当加热到了200℃的时候,如果使用选项1,但实际使用的热敏电阻是选项60的话,会因为热敏电阻设置不当,报告为180℃左右,产生了不小的误差。

最后,我们再比较一下当采用完全相同的热敏电阻,但电路板上的R2不同的时候,会产生什么样的效果。下图两条曲线,都是同样的热敏电阻,T0=25℃, R0=100000, beta=3950,配合不同的R2时,会有这样的结果:

图中红色点R2=10K,而绿色点R2=4.7K。从图中可见,整条曲线都发生了比较大的偏移。这样,使用了不正确的配置,即使在低温区,也会发现明显的温度问题。

第七节,结束语

希望你把整篇文章看完之后,会感觉到对3D打印机热敏电阻设置的理解加深了很多。如果下次再遇到热敏电阻的设置问题,你很有信心能够容易地解决掉,那就说明你已经很好的掌握了这篇教程希望教给大家的东西。

如果读完了之后一头雾水,那很可能是我们的教程讲的还不够清楚,也希望你能跟打印虎联系,告诉我们你的问题。我们希望能持续改进教程,写的越来越清晰易懂。

回顾一下,我们这篇教程中所需的文件都包括:

文件名
描述
createTemperatureLookup.py
热敏电阻表格计算脚本
python-2.7.8.msi
Python 2.7.8 脚本运行环境

所有的这些软件包,都可以在这里下载到(打印虎本地下载百度云下载)。


发表评论
登录后参与评论 / 加入炫逗玩
客户端