硬件基础知识和典型应用-关于485方式通信
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/LearnHardware" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
前言
之所以写这一节博文,主要是说一下关于485的自动收发问题!
不过还是从485怎么来的开始说起,然后到各种具体使用细节.
冒昧问一句:485是什么?
485是什么呢? 答:485是一种传输逻辑0和1电信号的方式!
讲一下历史
1.要想知道为啥有485,那要从实际应用中出发,
咱当前使用的这些已经规定好的通信方式,是人们在长期的摸索中最终总结出来的比较好的方式.
最简单的就像下面这样子,发送端是5V,接收端接收到5V
发送端是0V,接收端是0V.
但是呢长久以来人们要解决的问题是:如何让传输的电压更小,传输距离更远,抗干扰性更强!
2.如何让传输距离更远?
大家都知道导线都是有电阻的,你在这边电压是5V,经过导线以后肯定会衰减到5V以下
导线越长,衰减的越厉害!
好多人就在考虑了怎么解决呢??
其实人们就想,直接增加输出端的电压,然后RS232传输方式就出来了
同时人们规定:
如果要发送高电平信号就把导电的电压设置为-3V到-15V之间
实现RS232通信方式的芯片有很多(MAX232,SP3232)
假设我要让对方接收高电平信号,那么其实是这样子
假设我要让对方接收低电平信号,那么其实是这样子
3.但是这样子还是不能满足,毕竟无限的提高电压不是长久之计
后来呢有人发现了用差分的方式传输数据
什么是差分呢!
就是用两根电线作为一个数据线做数据传输
咱把其中一根电线叫 A,另一根电线叫B
然后规定:
如果A线电压比B线电压高200mV以上,就认为传输是高电平信号!
如果B线电压比A线电压高200mV以上,就认为传输是低电平信号!
4.看图说明
假设我要让对方接收高电平信号,那么其实是这样子(A>B)
假设我要让对方接收低电平信号,那么其实是这样子(B>A)
5.不过一开始兴起来的是RS422通信方式(发送是发送的线,接收是接收的线,分开了)
在这里引入一个名词:全双工
发送数据的同时也能够接收数据,两者可以同步进行 美名曰:全双工通信
422通信方式发送是发送的线,接收是接收的线,分开了,所以RS422通信方式是支持全双工通信的
6.后来呢,人们感觉4根线太多就去掉其中两根(RS485)
不过这样就出现了另一个名词: 半双工
通信的时候在一个时间点,只能单方向的传输
左边发送数据给右边的时候,右边不能同时发送数据给左边.反之亦然.
关于串口通信
咱们做单片机的经常会说串口通信
其实当RS232方式通信出来的时候,当时用RS232方式通信叫串口通信
就是老式的台式电脑后面的这个口(RS232出来的时候还没有出现差分通信方式,所以电脑是没有USB的)
但是随着时间的推移,渐渐地把单片机上面的UART通信叫做了串口通信
注意哈,如果你和老工程师聊天,说到串口通信.
你一定要说电脑RS232通信,单片机TTL通信!
说一个我朋友经历过的故事:
一个老工程师问我朋友,单片机上有串口通信,
是不是直接可以接到电脑上(RS232接口)实现通信??
其实这个老工程师那心里面串口通信就是RS232通信
他把单片机的串口通信也认为了是RS232电平的通信了!
关于UART通信协议
1.基本上所有的单片机都有UART通信的引脚.现在用的最多的通信协议还是UART.
我就直接举例子说了.
假设通信的波特率是9600
那么意思就是说每隔 1/9600 秒传输1位数据(约104us)
假设传输8位数据 0x55(0101 0101) ,然后没有奇偶校验,停止位1位
根据UART协议,真实的信号是这样子的
注意1:上面之所以是1010 1010 是因为先传输的低位后传输高位
注意2:因为是9600HZ所以每隔约104us传输一位数据,上面测得的是103.97us
注意3:UART协议规定在传输开始的时候是先有一个低电平
(低电平时间就是传输每一位的时间,当前为约104us)
注意4:最后有一个停止位,停止位就是有一个高电平
(高电平时间就是传输每一位的时间,当前为约104us)
当然如果停止位是1.5位,停止时间对于现在来讲就是104*1.5 = 156us
如果停止位是2位,停止时间对于现在来讲就是104*2 = 208us
2.奇偶校验位
奇校验:
如果发送的一个字节数据中的数据位中的1(高电平)是偶数个,那么最后的奇偶校验位需要是高电平
保证整个数据位里面的1(高电平)个数是奇数个.
如果发送的一个字节数据中的数据位中的1(高电平)是奇数个,那么最后的奇偶校验位需要是低电平
保证整个数据位里面的1(高电平)个数是奇数个.
发送的0x55,有4个1,所以奇偶校验位需要是高电平,让1的个数为奇数个
偶校验:
如果发送的一个字节数据中的数据位中的1(高电平)是奇数个,那么最后的奇偶校验位需要是高电平
保证整个数据位里面的1(高电平)个数是偶数个
如果发送的一个字节数据中的数据位中的1(高电平)是偶数个,那么最后的奇偶校验位需要是低电平
保证整个数据位里面的1(高电平)个数是偶数个
关于485通信芯片的使用
1.一般哈用MAX485,SP485EE MAX13487
如果是用在工业控制建议用户使用6LB184等工业级的芯片
当然还有TVS,磁珠,自恢复保险丝,如果不计成本还需要加上DC-DC隔离(BC0505)还有ADUM1201.
BC0505是5V转5V的电源隔离芯片,5元左右,用来给485芯片单独供电
ADUM1201是不让485的输入输出引脚直接接到单片机上,再次隔离一下.
当然,如果防雷击,记得加上放电管
反正是大家自己去取舍.
2.现在说一下我要说的主题:485的自动收发电路
大家可能说,网上不是很多吗?
答:网上的做的不够严谨,都有问题!
先看一个
注意:单片机的TX默认是高电平,所以485_TX是高电平,三极管导通,RE/DE为低电平.
我现在说一下原理:
首先大家都知道RE/DE处于低电平,芯片处于接收数据状态
RE/DE处于高电平,芯片处于发送数据状态.
现在咱看上面的电路,假设咱发送:0x55
加上起始位 ,先发送高位后发低位 ,1位停止位
发送的电平为:(0 10101010 1)
发送0:
485_TX为0 ,三极管截止 ,RE/DE为高电平 ,处于发送状态 ,DI连接的低电平
所以把0发送了出去.
然后发送1:
485_TX为1 ,三极管导通 ,RE/DE为低电平 ,处于接收状态
由于外面的A上拉,B下拉,所以当前信号为1 ,所以可以看做把1发送了出去
然后发送0:(后面的就不说了,和上面一样)
3.为了保证信号更加的好,很多工业上都用斯密特触发器做.
一般都使用74HC14 或者 74LS14
如果要问我斯密特触发器有啥作用,我就直接给你一张图
如果是使用的74HC14芯片,因为是反向的,
所以上面的信号经过74HC14处理后的信号应该是相反的.
如果想得到正的,可以再经过一路反向器
4.和485配合使用,典型电路如下:
(画的有点不好看,看箭头方向吧.....)
注:发送数据有两路信号,一路送给了485的DI,另一路送给了RE/DE
假设发送0(第一路信号):(0信号经过两路反相器最终还是0,然后送给了485的DI引脚)
假设发送0(第二路信号):(0信号经过三路反相器最终是1,然后送给了485的DI引脚)
然后用485把0发送了出去.
不过中间经过了一个电路(电容 ,电阻,二极管):电路的作用是延迟一下控制方向的这个引脚
让数据电平先到达,然后控制方向的后到达.
和大家分析一下吧:
默认 UAER1_TX是高电平,经过两路反相器以后,74HC14的4引脚输出高电平
此时给电容充电.
然后开始发送数据
发送0的时候74HC14的6和4引脚以相同的时间输出低电平,
低电平信号已经给了485.
但是4引脚此时先给电容放电.等到74HC14认为1引脚是低电平以后
经过2输出高电平,把芯片置为输出状态,把0发送出去
发送1的时候74HC14的6和4引脚以相同的时间输出高电平,
高电平信号已经给了485.
但是4引脚此时先经过电阻给电容充电电.等到74HC14认为1引脚是高电平以后
经过2输出低电平,把芯片置为输入状态,所以可以看做把1发送了出去.