自定义通信协议,异步不归零码,单线通信,非常巧妙

自定义通信协议,异步不归零码,单线通信,非常巧妙背景介绍我们设计了一款用于增氧泵保护控制的控制器。其特点是需要检测6路的三相电流以及零序电流信号,加上三相电压检测,一共需要26个A/D检测通道

大家好,欢迎来到IT知识分享网。

背景介绍

我们设计了一款用于增氧泵保护控制的控制器。

其特点是需要检测6路的三相电流以及零序电流信号,加上三相电压检测,一共需要26个A/D检测通道。

而且为了简化外围电路的设计,采用了真有效值检测方法。

对每一个通道的信号在1个周期20ms内采样128个数据,需要用到处理器的regular group转换和DMA的功能;

但是,STM32F103处理器regular group转换功能仅支持16通道。

因此,采用两片STM32F030处理器扩展A/D转换通道。

问题来了,两片从处理器如何将数据发送给主处理器。

采用UART?

主处理器的2个UART需要用于RS485以及4G模块的通信,

UART是宝贵的资源,剩余的1个UART口需要留作它用;

而且一路的UART需要占用两个IO口,这会让原来IO口就不够的主处理器雪上加霜;

另外,从处理器没有采用外部晶振,其内部振荡器精度比较差,会导致UART通信误码; 

采用SPI?

占用IO口太多,主处理器表示没有那么多IO口挥霍;

采用IIC?

好是好,就是主处理器需要用为主定时查询,从片从处理器不能按自己的时序即时上报数据,而且万一未来需要降成本,从处理器只能从具有IIC接口的单片机中选择,不能将成本做到极致;

协议介绍

一番深思熟虑之后,我设计了一个采用异步不归零码的单线通信协议;

编码方式如图所示,采用特殊的比特编码格式,根据数据线上两次电平跳变的时间间隔定义比特0和比特1。

自定义通信协议,异步不归零码,单线通信,非常巧妙

比特编码

例如,将两次跳变的时间间隔t1定义为比特0,将两次跳变的时间间隔t2定义为比特1。

接收方设定两个时间区间:

自定义通信协议,异步不归零码,单线通信,非常巧妙

时间区间

若两次跳变的时间间隔t∈T1 ,则为比特0,两次跳变的时间间隔t∈T2 ,则为比特1。

通过设置合理的t1、t2的数值以及T1、T2的范围,可消除发送方以及接收方处理器的时钟误差对通信带来的影响。

假设上述t1小于t2 ,发送和接收方的处理器的时钟相对误差分别为±a1±a2

则接收方解析得到的比特0的最小时间间隔为t1*(1-a1)*(1-a2),最大时间间隔为t1*(1+a1)*(1+a2),而解析得到的比特1的最小时间间隔为t2*(1-a1)*(1-a2),最大时间间隔为t2*(1-a1)*(1-a2)。

为了保证比特0和比特1在最坏情况时钟精度下能被正确解析,必须满足:

自定义通信协议,异步不归零码,单线通信,非常巧妙

时间区间关系

此外,数据发送采用定时器中断,数据接收采用外部中断。

没有设置中断优先级,数据发收发过程中,如果正在处理其它中断,控制器不能即时处理数据收发中断,这将导致时间区间的变化; 

综合考虑如下因素:

1)从处理器的时钟精度在全温度范围内为±5%

2)最坏情况下,从处理器所有中断的总处理时间为20us; 

3)最坏情况下,主处理器所有中断的总处理时间为30us; 

在一番埋头苦算之后,我把时间范围定为0~256us以及512us~2ms。

在发送端,用256us的定时器中断进行数据发送; 

在接收端,采用一个定时器配合外部中断进行数据接收,以384us为判断阈值,

如果跳变时间间隔小于384us则解析为0,否则小于2ms解析为1,大于2ms由认为数据发送开始;

帧超时时间设置为100ms; 

数据发送程序如下:

自定义通信协议,异步不归零码,单线通信,非常巧妙

数据发送程序

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/63960.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信