• RS485使用注意事项(上下拉电阻)


    原文:https://www.cnblogs.com/hao5158/p/3653448.html

     这里把这三天来调试RS485总线所遇到的问题和经验教训总结一下,备忘。

    这两天主要做的是把Keller 30X系列工业用压力变送器的RS485接口和STM32单片机联通,并将数据通过USB口转发到PC上。

    我首先直接使用Keller 30X连接电脑的RS485接口,这自然没有问题,用Keller自带的小软件直接就能看到结果。

    其次让STM32的RS485接口和电脑连接,这步调试整整用了1天半,遇到了几个比较棘手的问题:

    1. 发送时,由于RS485为半双工模式,发送时需要处理收发转换。发送前将T/NR线拉高,然后用串口发送一个字节的数据。发送完之后不能马上把T/NR线拉低,需要等待一会儿(大约发送1~2位的时间,视波特率而定),等接收方确认收到停止位后,再把T/NR拉低进入接收模式。
    2. 接收时和发送同理,电脑向单片机发送数据时停止位起码要有2位,以保证单片机收到停止位,否则连续发送时会把后一位数据中的1->0跳变认作起始位,导致传输错误
    3. 芯片选择方面,要认清MAX3485和MAX485的区别。MAX3485是CMOS电平的,用3.3V供电。MAX485是TTL电平的,用5V供电。STM32单片机的IO都是CMOS电平,所以理应使用MAX3485芯片。如果一定要做TTL和CMOS的电平转换,记住CMOS可以驱动TTL,而TTL驱动CMOS时需要上拉电阻。如果电平搞错了,最明显的状况就是发送正常而接收乱码。
    4. RS485的终端电阻不要乱接。RS485的终端电阻是接在总线最末端防止电波反射的,如果线很短干脆就不要接了,否则反而容易把差分信号拉小,使信噪比降低
    5. RS485的AB线上的上下拉电阻个人认为没有必要接。首先MAX3485内部有上下拉电路,本身就能够把AB线钳位在1上;其次,如果线缆很长,设备所处的地电位和主板所处的地电位很可能不一样,附加上下拉电阻反而会产生附加的暗电流,会把差分信号拉小,降低信噪比。
    6. STM32的Tx口要配置成推挽输出模式,Rx口要配置成内置上拉模式(当然也可以配置成悬空模式,在电路板上用电阻上拉)

    最后尝试将Keller 30X和STM32单片机连接,悲剧就发生了。Keller 30X的485接口完全是针对电脑设计的,(9600,n,8,1)的配置下一帧连续发送20多个字节。正如上文所述,单片机需要至少1位的安全时间用于处理中断程序,在接受Keller的快速连发时,下一字节的开始位到来时,单片机还处于中断处理程序中,所以直接将其忽略了,这导致单片机将数据中出现的1->0的跳变认作下一位的起始位,使后续传输全部出错。

    不幸的是,Keller 30X的通信芯片不能编程,所以也无法给它加入安全事件。最后我只能采用的模拟信号A/D转换的方式来采集Keller 30X的压力信号。这个故事告诉我们,以后设计面向单片机的UART接口时(不管是RS232,rs485还是TTL,CMOS),一定要考虑到目标单片机的性能。单片机不比电脑,处理一个串口接收中断一瞬间就可以完成,向单片机发送数据时,两字节之间一定要留足安全时间,以保证目标单片机有足够的时间处理中断,读取寄存器中的数据。STM32单片机已经算是快的了,处理一个中断尚且需要1位的时间,如果是51的话,相信这个时间还会更长。

     
    好文要顶 关注我 

  • 相关阅读:
    Java代码实现WORD转PDF
    用Java实现在【520,1314】之间生成随机整数的故事
    solr 6.5.1 linux 环境安装
    并发编程学习笔记(15)----Executor框架的使用
    并发编程学习笔记(14)----ThreadPoolExecutor(线程池)的使用及原理
    并发编程学习笔记(13)----ConcurrentLinkedQueue(非阻塞队列)和BlockingQueue(阻塞队列)原理
    并发编程学习笔记(12)----Fork/Join框架
    并发编程学习笔记(11)----FutureTask的使用及实现
    并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理
    服务器被植入木马,CPU飙升200%
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/14259593.html
Copyright © 2020-2023  润新知