RS485去接收TTL电平的串口数据,真的可行吗
当人家叫我把RS485接口直接接到TTL串口上时,一开始我是拒绝的 :>。但是,看到对方坚定不移的眼神,我抱着试试看的态度(反正打坏了板子不用我赔,( ̄▽ ̄)")还是接上去了。我滴天纳~!!,还真收到数据了。
Blog【老杨的开发小站】: http://www.yangchunlei.com/?id=13 同步更新!
一、问题来源:
这事情发生在某个1+x的嵌入式考证培训中,但是具体是什么原理谁都不知道,目前只知道这是开发板厂家公司给出的数据监听方案。
就是上面这张图,用了一个无源的“232转485”模块的485端口,去对接STM32板子上的UART1-TTL串口。当然,数据通讯的场景是仅有TTL口数据发出,485端口不会向TTL端口发送数据。
看到这个图纸时,起初我也是表示怀疑的,难道说我前面这几年开发中,一直用的是假的485…./?由于培训是时间和条件有限,所以没做过多的分析和测试。回来后,我用自己的板子做了些测试,并记录下来。
二、485与TTL知识复习:
接口 | 电气标准 |
---|---|
RS485 (这里的电压差指的是AB端的) |
逻辑‘1’ : AB电压差>=200mV 逻辑‘0’ : AB电压差 <=-200mV(注意前面有个负号) |
UART-TTL (这里的电平,是相对于板子GND的) |
逻辑‘1' : 输出电平 > 2.4V 逻辑 '0' : 输出电平 < 0.4 V |
从我们正常的理解,上两个接口电气标准不同,是无法对接的。
三、如何让485模块收到1010数据
有上面两图可以知道, 当485接口输出逻辑1的时候,是需要A端口电压高于B端口电压,反之,是A端口电压低于B端口电压。上面表格里所说的-200mV ,负电压是指Ua-Ub的值为负,并不代表其输出值相对于芯片供电电压来说的伏电压,毕竟RS485芯片没有负电压发生器。Ua、Ub的电压存在一定的共模电压,在通讯接收 的时候,只要485芯片只要检测到Ua、Ub管脚电压差值有200mV的变化,就会转换为数字逻辑1或者0。
比如,Ua = 4.3V Ub=4.0V ; Ua-b = 300mV > 200mV ,则芯片就认为获得逻辑1。当然,在Ua= 2.3V,Ub = 2.0V的时候,也是满足条件的。
但是,TTL串口在发送的时候,是只有一个管脚Tx在变化电平。那么,能否产生所谓的 “负电压”吗?请看下面!
四、最最“敷衍”的TTL转RS485电路。
“敷衍”这词应用于485来自这篇文章:http://bbs.elecfans.com/forum.php?mod=viewthread&tid=924233&extra=page=8
如何让TTL-Tx管脚的变化电平,去驱动485的接收器呢? 在Tx发送数据的时候,我们只有1个IO在电平变化,且变化访问为0—5V。如果要让它和另一管脚产生正负变化的电压差,那么只有一个办法,让另一个管脚的电平固定在0到5V之间,且要满足压差大于200mV的话,那就缩小固定电平值的范围到[0.2V---4.8V]。当然,2.5V是最合适的选择。
所以,可以得到这样一个最敷衍的TTL ---->RS485 单向转换电路
五、实际动手测试。
使用STM32新建了仅带串口输出的项目。main函数内添加了如下发送语句:
while (1)
{
HAL_UART_Transmit(&huart1,(unsigned char*)"hello world\r\n",13,1000);
HAL_Delay(1000);
}
测试电路如下:
由于我板子上没有固定的2.5V电压,所以利用了一个电位器来调节出2.5V左右电压值。另外一个485A 管脚直接对接TTL-Tx 引脚。
打开串口对应的485转换器引脚,可直接看到板子发出的串口数据了。当我尝试把电位器调节到最大和最小时,485端也就收不到数据了,这也验证了我上面的推理。
但是,我记得在培训现场那边,用无源转换器的时候,将485的B端是直接接到TTL-Rx管脚的。我也尝试着去做了下,但是,我的有源485转换器就没法收到数据。测量下485B端的电压为0V附近,(485内部B端一般都有一个下拉电阻到地,而且STM32的Rx端常态下应该是浮空状态的)。
我在想,难度是有终端电阻的情况下,造成B端电压有一定的上浮?于是我有加上了终端电阻,就像下面这样:
但是,还是没有收到数据。。。
六、总结:
现在来回答标题提出的疑问,RS485转换器去接收TTL电平的串口数据,真的可以吗?
回答是: 是可以的。利用上面第四点里提到的 “最敷衍”的转换电路,是可以收到。
可以说,在临时没有USB转TTL调试器的情况下,确实是一个好办法。想到这一点的工程师确实是妙啊。当你在客户现场调试,没有TTL转换器,随手可以拿来一个485转换器临时看下数据还不错。 但是它的稳定性,可以说仅限于调试,连接的杜邦线长度也不宜过长。另外,也可能会受不同型号的485转换器的性能而影响。
目前我的有源485模块下,只能在给485B端一个稳定中间电平时,才能正常接收。至于将B端接TTL-Rx为和 无源485不一样,不能收到数据的原因还有待研究。(有小伙伴知道的能告知下)
从教学和考证角度说,不推荐引导学生采用该方法。那样会带坏学生对485和TTL端口的理解,因为他们本来对这些理解的不是很透彻,你再来一个“偏方”应用给他们去调试,在考试或者考证环境下,会让他们一下子打蒙掉。甚至会开始怀疑其以前所学的理论知识。就好比学车,你不可能在它还没学会正常起步的情况下,就教他拉手杀学弹射起步吧!!
考证环境下,还是提供个232转TTL模块吧!
本文地址:https://blog.csdn.net/kimiyang123/article/details/107903681