【贼稳定】" IO口模拟串口 "之优化半周期法

时间:2024-04-06 19:53:45

【贼稳定】" IO口模拟串口 "之优化半周期法

1、聊一聊

    今天的文章主要是接着上一篇文章跟大家讲讲模拟串口采用定时器半周期法的优化方案。

【贼稳定】" IO口模拟串口 "之优化半周期法

2、半周期法的问题

    在上一篇<【妙招】一份 " IO口模拟串口 " 独门秘籍>为大家介绍了几种模拟串口的方法,其中1/3定时器法捕获法是作者实验过可行的办法,但是半周期法却是我在项目中常用的小插件,大部分小伙伴平时已经习惯了串口调试,对于一些之前的老项目没有预留串口,如果能直接引出两个IO口就可轻松实现模拟串口,对于打印和调试系统内部是再方便不过了。

    那么这里我们回顾一下相比1/3周期法,半周期有哪些不稳定因素呢?如下图所示

【贼稳定】" IO口模拟串口 "之优化半周期法

分析一下:

  • 看过上篇文章的小伙伴应该知道,1/3周期采样法采用的办法是通过采集第二次低电平作为起点来进行IO口电平判断,这样处理的主要目的是为了让检测IO口电平不会出现在串口电平不稳定的位置。

  • 通信线路上是存在物理阻抗的,其对应的通信线路上的电平变化是不可能像上图中的方波那么标准的,其过程均存在一个上升时间和下降时间,同时再加上传输的bit时间间隔并不是严格的一致,所以在电平变化附近进行电平的判断是会存在误判的风险。

  • 然而采用半周期法进行模拟判断,如果我们像1/3周期法也在第二个低电平进行IO判断,如上图所示,如果在1位置刚好没有采集到低电平,在2位置采集到了低电平,而在第3位置由于电平不稳定,可能采集出来就是高电平,这样该数据就会错乱,从而导致接受失败。

3、半周期法优化办法

    既然半周期法存在上述问题,那么为什么还这么纠结使用半周期来实现模拟串口呢?大家都知道,中断的响应会消耗部分CPU时间,频繁的触发势必降低了CPU的使用效率,然而使用单周期法处理相对有点困难,因此作者这里采用了一种优化方案,其实明白了原理很简单,只需要将定时器周期 > 波特率对应的时间+串口冗余裕度即可在一定程度上稳定的获取串口数据。

【贼稳定】" IO口模拟串口 "之优化半周期法

【贼稳定】" IO口模拟串口 "之优化半周期法

分析一下:

  • 前面主要考虑的问题是如果在1处采集到了低电平, 那么在3处有可能采集到的也是低电平,这样会到处误码,所以我们这里的优化方案就是把定时器周期稍微>串口波特率所对应的bit周期,通过上图我们可以看到在第3次判断位置有了一定的裕度来防止电平跳变,这样就能够正确接收到该串口数据了。

  • 同时也要注意该设置的定时时间不能超过太多,理论上(优化定时时间-原本定时时间)/(电平个数*2)  < 串口波特率所对应的bit周期/2,应该都没有什么问题的,不过一般也是根据实际情况调整为有一定裕度即可。

4、优化效果

    下面作者就用实验对比一下优化方案的可行性:

1

不加延时处理

    不加延时方案的数据传输动图如下图所示:

【贼稳定】" IO口模拟串口 "之优化半周期法

分析一下:

  • 通过上面的动图我们可以看到采用115200波特率定时传输会存在一定误码率。

2

加延时优化方案

    加入了5个定时器基础时钟以后的传输效果:

【贼稳定】" IO口模拟串口 "之优化半周期法

分析一下:

  • 上面的动图通过接收的字节我们发现是比较稳定的,由于数据都是一致的,所以接收区数据看上去基本上没什么变化。

  • 模拟串口115200波特率对于大部分应用基本上够用了,同时为了进一步增强传输中的稳定性和可靠性,大家可以设计通信协议上更加严格的校验和重发机制来进行补充。

5、最后小结

    那么模拟串口就基本上完结了,大家感兴趣可以自己下去实现一个完整的模拟串口,也方便以后的调试和开发,对于IIC,SPI等等通信的模拟办法其实也就大同小异了。

    好了,这里是公众号:“最后一个bug”,一个为大家打造的技术知识提升基地。同时非常感谢各位小伙伴的支持,我们下期精彩见!

【贼稳定】" IO口模拟串口 "之优化半周期法

推荐好文  点击蓝色字体即可跳转

C语言数值常量的“那些事”(细节分析)【贼稳定】" IO口模拟串口 "之优化半周期法

【C进阶】嵌入式开发中"移位操作"可要注意了!【贼稳定】" IO口模拟串口 "之优化半周期法

goto关键字你不知道的"那些事"(C语言提升)【贼稳定】" IO口模拟串口 "之优化半周期法

【重磅】剖析MCU的IAP升级软件设计(设计思路篇)

【OS】“ 文件系统 ” 中这些概念可以这样理解

【典藏】自制小型GUI界面框架(设计思想篇)

【C进阶】听说用 “ 逗号表达式 ” 仅仅为了秀技?

【经典】把脉printf中的C进阶技巧

【进阶】嵌入式编程技法之"数据驱动编程"