ShIoTiny和世界:最小的模拟传感器或ADC

图片


要点或本文的主题


关于ShIoTiny的一系列文章的续篇 -基于ESP8266芯片的可视可编程控制器。 该控制器的主要功能是能够通过在浏览器中绘制程序来对其进行编程。


本文介绍了模数转换的简要理论以及ShIoTiny ADC控制器的实际应用。


该系列中的先前文章。


ShIoTiny:小型自动化,物联网或“假期前六个月”


ShIoTiny:绘图程序的节点,链接和事件或功能


ShIoTiny:湿室通风(示例项目)


ShIoTiny和周围的世界:将传感器连接到二进制输入,接触反弹和其他问题


项目现场


二进制固件,控制器电路和文档在这里


介绍或代替严肃的理论


在上一篇文章中,我们检查了具有二进制输出的主要类型传感器到ShIoTiny控制器的二进制输入的连接


但是,正如大多数人以及学童和学生所知道的那样,有关周围世界的大部分信息都是各种物理性质的模拟量:光和声的力量,速度,气压,液位等。


几乎所有现代微处理器和微控制器都只能处理二进制表示形式的离散值。


对于那些还不知道模拟值与离散值有何不同的人,我将作简要说明。 谁都知道的人可以跳过它们。 我会立即进行预约-类比和简化都有余地。 这不是论文,而是手指上的简短解释。


模拟量和离散量(您不能读给教授,学者和极客)


每个人都在学校学习数学。 因此,我们转向它,并在模拟量与离散量和数字之间进行类比。


从数学的角度来看, 模拟量是数,定义在数字线给定线段上的任意点。


从数学的角度来看, 离散值是整数 。 它仅在数字线给定线段的某些点定义。


下图示意性地显示了模拟和离散数量数字在数字线上的位置。


图片


例如,考虑从-43的数字线段。 如您所见,用点表示的离散数量-上的整数只有8件。 图中绿线显示的模拟值是无限的。


例如,我们有一定数量X ,其数量范围从0127 。 如果我们将此数量表示为Analog则从理论上讲我们可以以任何精度表示它-例如, 12.123455454980126.00000000007或通常使用百万个小数位。


但是,一旦微控制器开始业务,并且X的值获得离散表示,那么即使从理论上讲也没有任何“无限精度”的说法。 精度受二进制数的限制,我们将其分配给数量X的表示形式


例如,我们取7位。 在这种情况下,我们可以用1的精度表示X的值。 即,可以指定X = 1X = 112 。 但是X = 112.5已经无法显示-位深度不足。 如果我们将X的相同值表示为7而不是10位数,那么表示的精度将不是1,而是0.125 。 以这种形式,您可以想象X = 95.125X = 112.5 。 但更确切地说,例如以X = 112.13的形式-该值无法表示。


如果您对我写分数值并同时将它们说成整数感到困惑,那么请记住,“离散点”可以放在数字行上,而不是以单位为单位,而是以0.50.125单位。 但是,就像过去一样,最终值将保留在任何细分市场中。 并且保留了离散量的所有属性。


离散值和模拟值之间的关键区别在于,在数字行的任何有限段上,将存在有限数量的离散(整数)值和无限数量的模拟(实数)值。 因此,我们获得了数量的离散表示始终具有有限的精度。


综上所述,我们得出了一个简单的结论 。 现实世界中大多数可测量的量都是模拟量 。 微控制器仅使用离散的数字表示形式工作。 因此,在使用微控制器处理任何模拟值之前,该值必须表示为离散值。 是的,并且采用二进制形式。


从模拟到数字的这种转换称为模拟到数字的转换


模数转换器


用于将模拟信号转换为数字的设备称为ADC模数转换器 )。


通常,这种设备具有一个或多个模拟输入,具有给定比特深度的模拟信号和数字输出(通常为8到16位)提供给该设备。


包括ESP8266在内的现代微控制器均具有内置ADC单元。


ADC通常具有什么特性, ESP8266 ADC特别具有什么特性?


第一个特性是ADC将哪种输入模拟值转换为输出数字代码。 通常,该值是ADC模拟输入端的电压。 因此,在我们的情况下。 但实际上,有些ADC具有电流输入。


在实践中需要ADC 的第二个特性是ADC输入值的值范围。 在我们的情况下,这是ADC输入端的最小和最大电压值。 这些值分别为0V1V1V的输入范围似乎很小,但始终可以对大电压进行分压和减小,并且可以放大小电压。


ADC 的第三个 ,也许是最重要的特性是其容量。 该值确定转换的精度,或者(根据我们的类比)确定“离散”点在“实”数字线上放置的频率。 在我们的情况下,ADC的分辨率为10 。 这是什么意思? 这意味着输出的数字代码由10个二进制数字表示,并且具有1024个值-从0到1023。
严格来说,值得记住的是,转换的精度不仅取决于位深度,还取决于许多其他参数,例如ADC的线性度。 但是,非常聪明的叔叔已经在非常聪明的书中对此进行了很多介绍,因此在本文中,我将为读者提供更多细节。


此外, ESP8266 ADC可以检测到溢出,即在输入端施加大于1V的电压的情况。


如果您看一本关于ADC的聪明的参考书,然后看那里,那么就会有很多其他特征。 所有这些都是必要和重要的,但是我们不会走太远了。 例如 ,我们不会涉及ADC的时间参数 ,因为我们认为在我们的情况下,测量值变化相当缓慢,并且ADC会“立即”将其转换为数字表示形式。


总结初步结果
ShIoTiny控制器的ESP8266内置有一个ADC。


ADC ESP8266的输入端施加01V的电压。


ESP8266 ADC的输出端我们得到一个与输入电压成比例的数字,范围为01023 。 电压0V对应于ADC输出处的代码0 ,电压1V对应于ADC输出处的代码1023


ShIoTiny中的ADC读取数据的速度约为每秒10次


ADC的硬件输入具有过压保护,类似于二进制输入Input1,2,3的保护方式请参见此处 )。


ShIoTiny ADC硬件就是这样


现在让我们处理ADC1节点,该节点处理ESP8266硬件ADC的数据


软件铃声或口哨ADC1


ElDraw编辑器的程序图中,模数转换器组件称为ADC1



如前所述, ADC1节点每秒大约从ESP8266硬件ADC接收数据10次 。 但是指定的节点不会对此放松,而是开始处理此数据,甚至进行一点分析。


首先 ,检查-ADC溢出了吗? 那是-ADC输入的电压是否不超过1V ? 如果检测到这种情况,则将ADC1节点的输出设置为NAN不是number )。


其次 ,如果没有溢出,则将ADC 0..1023的输出值转换为ADC输入的电压值 uin-在0..1范围内的浮点数。


第三 ,根据公式重新计算转换后的值0..1 X=k cdotuin+b在哪里 uin-ADC输入端的电压(从01V ); k是范围( ADC范围 ), b是偏移量( ADC offset )。 最后,将获得的X值设置为ADC1节点的输出。


最后是第五名 。 如果X的值已更改指定百分比(从1100% ),则ADC单元会生成事件,从而导致与其连接的节点的值转换。 这本质上是ADC灵敏度参数( ADC变化,范围% )。 毕竟,通常没有理由对“每次打喷嚏”做出反应,也就是说,对ADC低位的变化很小-它们经常“发出噪音”。 因此,灵敏度参数具有重要的现实意义。


提出了合理的问题-我们如何配置这些设置? 在图表中的ADC1节点上单击鼠标右键,然后您会在其中看到一个设置窗口。


您可以在其中设置所需的一切。 对于我们的情况,将是如图所示的窗口。


图片


在此窗口中,您可以设置上述所有参数-ADC的范围,偏移和灵敏度。


如果未指定任何内容,则范围将为1。偏移量为零。 灵敏度为1%。


也就是说,实际上,默认情况下, ADC1节点的输出将是提供给ADC输入的模拟电压值。


如您所见, ADC1节点非常复杂。 为什么要完成所有这些? 是的,您,我亲爱的用户! 当然,我只是在开玩笑,作为一个恶意的自我主义者,我考虑了以前的经验,并试图使我的生活更轻松。


作为简单的工程师,我们希望这些值不是以“鹦鹉”的形式显示,而是以正常且易于理解的值(伏特,安培,千克或米)显示。


许多传感器发出“鹦鹉”中的值,希望智能微控制器将其重新计算为所需值。


为此,介绍了通过给定的函数对ADC的测量值进行转换的方法。


但是,像往常一样,看一次比听十次更好。 尝试一次比查看十次也更好。但这不是重点。
因此,我将举几个简单的例子:一个电源控制系统和一个基于具有4-20mA电流输出的传感器的温度测量系统。


电源监控


测量电压是一项常见的任务。 例如,我们要测量220V的电源电压。 如果我们的电力供应很差,那么任务是非常实际的。 我们不需要非常非常准确的更改。 当电压比标准高15%时,在ShIoTiny上触发Relay1足够了 ,而当电压比标准降低15%时, 就可以触发Relay2


当然,我们不能将ShIoTIny控制器的ADC1输入插入插座。 怎么办 首先,必须将电压降低到可接受的水平-0..1V 。 其次,必须对其进行校正:我们的ADC无法测量交流电压。


网络中的电压可以低于标准电压也可以高于标准电压。 为简单起见,我们假设 220V的电源电压将对应于ADC输入电压的0.5V


接下来,我们寻找输入电压约为220V时能给我们提供输出电压约3V的任何降压变压器,并组装下图所示的电路。



在这里, 惊喜可以等待电子学的无知。 在整流器的输出端,不是​​突然出现3V DC电压,而是出现了4V以上的电压! 实际上,一切都简单地解释了。 当我们测量交流电压时,电压表会向我们显示实际电压值。 当我们对这个电压进行整流时,在整流器的输出端会得到峰值电压值,对于正弦信号,该峰值约为1.41 ,并且正好  sqrt2是目前的一倍。 因此,整流器输出处的“难以理解”的4.23V


最后,我们需要计算分压器,即电阻R1R2 。 我们需要在分压器的输出端获得0.5V的电压,在其输入端获得4.23V的电压。 因此, 4.23V的整流电压应除以8.46倍。 为此,设置电阻器R2 = 100欧姆 ,电阻器R1 = 746欧姆 。 但这是理想的。 实际上,不存在电阻为746欧姆的电阻器。 是的,变压器不是特别准确。 因此,如果有人敢尝试此解决方案,我强烈建议您将电阻器R1 = 760欧姆 ,然后将电阻R2调整为电阻180欧姆220欧姆 。 然后,您可以使用电压表进行调整R2,以便在〜220V时,变压器初级绕组,分压器输出(或ADC1输入相同)上的电压= 0.5V


我们不仅测量电压,而且通过超出或降低电压来做某事。 例如,打开备用电源,以使某些设备不会烧坏或关闭。


因此,我们将画出最简单的程序方案,当电压比正常值高 15%时 ,使继电器Relay1工作 ,而当电压比正常值降低15%时 ,继电器Relay2起作用 。 此外,网络上的过电压或欠电压必须保持至少1分钟才能触发继电器。 这样可以防止在网络上经常出现的短电压峰值期间出现误报。 图中显示了实现我们想法的方案程序。


图片


为了使该电路正常工作,必须在ADC参数的设置中将系数k(范围)设置为等于440 ,如图所示。


图片


系数为440 ,ADC的输入端电压为0.5V时, ADC1节点的输出为220 。 那才是真正的电源电压!


这非常方便,因为它允许您立即以伏特为单位设置常数: 220V + 15%253V,220V-15%187V 。 如有必要,可以轻松更改这些值,而无需浪费时间计算并将电压转换为“鹦鹉​​”。


4-20mA温度传感器


具有4-20mA电流输出的传感器在工业中非常普遍。 在日常生活中,您不会经常遇到他们。 然而,有人拥有它们,而这个人想要使他们适应事业。


ADC允许将此类传感器与ShIoTiny控制器结合使用。


为什么传感器输出电流精确到4-20mA ? 我会解释。


电流输出在长线上运行良好。 说一公里。 他们不在乎导线的电阻:无论导线的电阻如何,电流在导线的整个长度上都是相同的。


初始电流值为4mA ,而不仅仅是缺少电流,这使得检测断线变得容易。 如果传感器是完整的,并且电线没有断线,那么总会有电流。 至少4mA 。 如果电线断开,则没有电流( 0mA )。


假设我们有一个温度传感器,其电流输出为4-20mA ,测得的温度范围为-40C+ 125C 。 我们想将其连接到ShIoTin 。 我们需要做的第一件事是将电流转换为电压。 进行这种转换的理想方法是使用常规电阻器。


由于ADC输入端的最大电压为1V ,线路中的最大电流为20mA ,因此很容易计算出将20mA转换为1V的电阻的电阻为50欧姆 。 ( 不知道欧姆定律-呆在家里! )。


如图所示,我们将连接传感器。


图片


传感器是与所测温度成比例的电流发生器。 通过将50欧姆的电阻ADC1输入并联连接,以下电压值将在ADC输入端,具体取决于传感器电路中产生的电流:


  • 电流小于4mA ,ADC输入电压小于0.2V-断线;
  • 电流从4mA到20mA ,电压从0.2V到1V-传感器正在工作;
  • 电流大于20mA ,输入电压大于1V-传感器故障。 传感器短路时,如果功率小于2W,则50欧姆电阻可能会烧坏。

假设我们要测量温度并通过MQTT进行发布。 此外,我们将发布传感器的状态(开路,短路或一切正常)。


我们要做的第一件事是将“鹦鹉”中的值重新计算为度。 知道-40 ° C的温度对应于4 mA的电流且ADC的输入端的电压为0.2 V+125°C的温度对应于20 mA的电流且ADC的输入端的电压为1 V ,我们得到了系数k = 206.25b = -81.25 。 如图所示,在ADC设置窗口中输入这些系数。


图片


谁想亲自验证kb的计算的正确性- 自己决定最简单的方程组:


\开cases0.2 cdotk+b=401 cdotk+b=125 endcases


好了,程序方案根本不会很复杂,如下图所示。


图片


在一切正常且4-20mA温度传感器正常工作的情况下,温度将以/ t_sens的名称发布在MQTT服务器上。 症状也以/ sens_short/ sens_break的名称发布 。 如果一切正常,那么事故的征兆为零。


如果断线 ,则温度将低于-40C 。 在这种情况下, MQTT代理上的参数/ sens_break将作为一个单元发布。


如果线路中发生短路,则温度将超过+ 125C1 NAN ( - ). /sens_short MQTT .


Relay3 , , , .


«» , , , 200 .


结论


ShIoTiny , . , .


, - «» , - , - .


— . .


: shiotiny@yandex.ru .


参考文献


, , .




-


.




: 4-20 –


ESPPOWER ANDROID

Source: https://habr.com/ru/post/zh-CN466443/


All Articles