半周期法的问题 为大家介绍了几种模拟串口的方法,其中1/3定时器法和捕获法是作者实验过可行的办法,但是半周期法却是我在项目中常用的小插件,大部分小伙伴平时已经习惯了串口调试,对于一些之前的老项目没有预留串口,如果能直接引出两个IO口就可轻松实现模拟串口,对于打印和调试系统内部是再方便不过了。 那么这里我们回顾一下相比1/3周期法,半周期有哪些不稳定因素呢?如下图所示 
分析一下:
看过上篇文章的小伙伴应该知道,1/3周期采样法采用的办法是通过采集第二次低电平作为起点来进行IO口电平判断,这样处理的主要目的是为了让检测IO口电平不会出现在串口电平不稳定的位置。 通信线路上是存在物理阻抗的,其对应的通信线路上的电平变化是不可能像上图中的方波那么标准的,其过程均存在一个上升时间和下降时间,同时再加上传输的bit时间间隔并不是严格的一致,所以在电平变化附近进行电平的判断是会存在误判的风险。 然而采用半周期法进行模拟判断,如果我们像1/3周期法也在第二个低电平进行IO判断,如上图所示,如果在1位置刚好没有采集到低电平,在2位置采集到了低电平,而在第3位置由于电平不稳定,可能采集出来就是高电平,这样该数据就会错乱,从而导致接受失败。
3、半周期法优化办法 既然半周期法存在上述问题,那么为什么还这么纠结使用半周期来实现模拟串口呢?大家都知道,中断的响应会消耗部分CPU时间,频繁的触发势必降低了CPU的使用效率,然而使用单周期法处理相对有点困难,因此作者这里采用了一种优化方案,其实明白了原理很简单,只需要将定时器周期 > 波特率对应的时间+串口冗余裕度即可在一定程度上稳定的获取串口数据。 

分析一下:
前面主要考虑的问题是如果在1处采集到了低电平, 那么在3处有可能采集到的也是低电平,这样会到处误码,所以我们这里的优化方案就是把定时器周期稍微>串口波特率所对应的bit周期,通过上图我们可以看到在第3次判断位置有了一定的裕度来防止电平跳变,这样就能够正确接收到该串口数据了。
同时也要注意该设置的定时时间不能超过太多,理论上(优化定时时间-原本定时时间)/(电平个数*2) < 串口波特率所对应的bit周期/2,应该都没有什么问题的,不过一般也是根据实际情况调整为有一定裕度即可。
4、优化效果 下面作者就用实验对比一下优化方案的可行性: 1 不加延时处理 不加延时方案的数据传输动图如下图所示:

分析一下:
2 加延时优化方案 加入了5个定时器基础时钟以后的传输效果: 
分析一下:
5、最后小结
那么模拟串口就基本上完结了,大家感兴趣可以自己下去实现一个完整的模拟串口,也方便以后的调试和开发,对于IIC,SPI等等通信的模拟办法其实也就大同小异了。
|