我的max485单片机程序如下,中断接收数据,主程序中判断收到4个字节数据就转发。
PC串口转485通过MAX485与单片机UART连接。调试助手发送单个字节,发送4次,能正确收到转发回来的数据。一次发送4个字节,则必须发送两次,才能收到转发回来的4个字节数据,不过该数据是两次发送的前2个字节。
用示波器观察MAX485的数据接收端RI,波形很好。无论发送单字节还是4字节,波形都正橘闷确!问题应该在程序。请各位帮助我分析一下程序拦滑,我可能陷入某个误区。
关于485的收发切换电路,在没有执行延迟要求时对自收发电路需求不是非常迫切。如今,安卓、linux当道,非自收发响应速度太慢,485自收发就变得非常重要了。传统的自收发电路如下(网上随便找的):
1.不发送数据时,TXD为高电平,TLP113第5脚为高电平,Q2导通,RE、DE为低电平,485此时为接收模式。
2.发送数据时,码清若发送1,TXD为高电平,TLP113第5脚为高电平,Q2导通,RE、DE为低电平,485此时为接收模式,485芯片的AB引脚进入高阻状态,因为RD8把A拉高,RD9把B拉低,所以,AB传输的是1。
3.发送数据时,若发送0,TXD为低电平,TLP113第5脚为低电平,Q2截止,RE、DE为高电平,485此时为发送模式,485芯片会把DI上的电平反应到AB引脚上输出,所以AB传输的是0。
以TX的反向作为485芯片的收发切换,当处于接收状态时,TX为高电平,由于三极管的反向作用,RE被拉低,此时为接收状态,没有任何问题,当处于发送状态时,TX分高电平时间和低电平时间,其中,起始位为低电平,此时,485芯片立即切换为发送状态,这也没有问题,当发送的数据里有高电平位,TX为高时,485芯片会切换为接收状态,此时,485总线不会再被芯片驱动拉高,变成自R4,R6电阻拉高拉低,以有效实现驱动总线的目的。
该电路的主要缺点:响应速度太慢,波特率一般达到19200就到头了,原因是电阻不能太小(太小了功耗会很大,通常以500R-1K为宜),驱动能力不会太强,同时,由于电路上的寄生电容,导致电路响应时间比较慢,方波可能会出现尖峰。
另外还有一个缺点也是由于上下拉电路不能者裤太小,驱动能力相对较弱,不能带标准485协议规定的那么多设备。
此电路再传统电路的基础上,增加了TX从低电平变成高电平时,485芯片RE端的延时,而TX从高电平变低电平时,几乎没有延时。
原理:当TXD为低电平时,9012马上导通,由于是直接3.3V供电,3485的RE会直接被拉到高电平,转成发送当TXD为高电平时,9012关断,RE从原来的高电平,缓慢放电,变成低电平,转成接收,理论上,只要有一点点延时,保证TXD先驱动总线,再转成接收就可以了,同时延时也不能过大,超过1bit可能会导致从端发数据时主端还处于发送状态,以115200的波特率计算,1bit为8.7us,15P的电容(实际电路中,要考虑485接收芯片的输入阻抗,电容会大很多,可以在1000P-10000P之间调节,建议用示波器首模简实测大约9us的延时,取最佳电容值)与2.1K的电阻,放电周期13us,考虑误差,周期应该在6-20us之间,达到最大波特率的1个bit,就能满足要求了,低速的时候,更是没关系。
此电路有效的解决了响应速度的问题,跑到115200波特率毫无压力,但还是没有解决驱动能力的问题,同样不能带太多的设备,实测,30个从设备通讯正常,如果有网友解决了驱动能力的问题,请不吝指教。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)