" IO口模拟串口 "之优化半周期法
半周期法的问题 为大家介绍了几种模拟串口的方法,其中1/3定时器法和捕获法是作者实验过可行的办法,但是半周期法却是我在项目中常用的小插件,大部分小伙伴平时已经习惯了串口调试,对于一些之前的老项目没有预留串口,如果能直接引出两个IO口就可轻松实现模拟串口,对于打印和调试系统内部是再方便不过了。 那么这里我们回顾一下相比1/3周期法,半周期有哪些不稳定因素呢?如下图所示https://i-blog.csdnimg.cn/blog_migrate/2b1bf47a006389a72e8d043c3287c88a.png分析一下:[*]看过上篇文章的小伙伴应该知道,1/3周期采样法采用的办法是通过采集第二次低电平作为起点来进行IO口电平判断,这样处理的主要目的是为了让检测IO口电平不会出现在串口电平不稳定的位置。
[*]通信线路上是存在物理阻抗的,其对应的通信线路上的电平变化是不可能像上图中的方波那么标准的,其过程均存在一个上升时间和下降时间,同时再加上传输的bit时间间隔并不是严格的一致,所以在电平变化附近进行电平的判断是会存在误判的风险。
[*]然而采用半周期法进行模拟判断,如果我们像1/3周期法也在第二个低电平进行IO判断,如上图所示,如果在1位置刚好没有采集到低电平,在2位置采集到了低电平,而在第3位置由于电平不稳定,可能采集出来就是高电平,这样该数据就会错乱,从而导致接受失败。
3、半周期法优化办法 既然半周期法存在上述问题,那么为什么还这么纠结使用半周期来实现模拟串口呢?大家都知道,中断的响应会消耗部分CPU时间,频繁的触发势必降低了CPU的使用效率,然而使用单周期法处理相对有点困难,因此作者这里采用了一种优化方案,其实明白了原理很简单,只需要将定时器周期 > 波特率对应的时间+串口冗余裕度即可在一定程度上稳定的获取串口数据。https://i-blog.csdnimg.cn/blog_migrate/a47907c24dd48507143a8f95437862fc.pnghttps://i-blog.csdnimg.cn/blog_migrate/f61f449f31fb411a80f2bbbab4c9904b.png分析一下:
[*]前面主要考虑的问题是如果在1处采集到了低电平, 那么在3处有可能采集到的也是低电平,这样会到处误码,所以我们这里的优化方案就是把定时器周期稍微>串口波特率所对应的bit周期,通过上图我们可以看到在第3次判断位置有了一定的裕度来防止电平跳变,这样就能够正确接收到该串口数据了。
[*]同时也要注意该设置的定时时间不能超过太多,理论上(优化定时时间-原本定时时间)/(电平个数*2)< 串口波特率所对应的bit周期/2,应该都没有什么问题的,不过一般也是根据实际情况调整为有一定裕度即可。
4、优化效果 下面作者就用实验对比一下优化方案的可行性:1不加延时处理 不加延时方案的数据传输动图如下图所示:
https://i-blog.csdnimg.cn/blog_migrate/832181879eb5e7dac6e0fa3c94f85aa0.png分析一下:
[*]通过上面的动图我们可以看到采用115200波特率定时传输会存在一定误码率。
2加延时优化方案 加入了5个定时器基础时钟以后的传输效果:https://i-blog.csdnimg.cn/blog_migrate/cabfccfe09528c20e045612df984f35e.png分析一下:
[*]上面的动图通过接收的字节我们发现是比较稳定的,由于数据都是一致的,所以接收区数据看上去基本上没什么变化。
[*]模拟串口115200波特率对于大部分应用基本上够用了,同时为了进一步增强传输中的稳定性和可靠性,大家可以设计通信协议上更加严格的校验和重发机制来进行补充。
5、最后小结
那么模拟串口就基本上完结了,大家感兴趣可以自己下去实现一个完整的模拟串口,也方便以后的调试和开发,对于IIC,SPI等等通信的模拟办法其实也就大同小异了。
在接收 IO 口上检测到下降沿时,启动定时器,并在半个波特率周期后进行第一次采样。如果采样值为低电平,则认为检测到起始位。 IO口驱动能力不足时,需添加三极管或MOS管放大。 在资源受限的单片机上,需合理分配定时器和中断资源,避免资源冲突。 在发送和接收数据时,需严格控制I/O口的高低电平变化时间,确保每个位的持续时间符合波特率要求 由于在每个波特率周期内进行两次采样,可能会引入更多的干扰。可以采用软件滤波的方法,如多次采样取平均值,来提高抗干扰能力。 在接收数据时,采用定时器中断的方式,在每个波特率周期的半周期处进行电平采样。
通过比较连续多个半周期的电平状态,来判断接收到的数据位是0还是1。 可以采用滤波电路或去抖动算法来减少电平波动对接收数据的影响。 缩短信号走线,避免与高频线路平行布线以减少干扰。 要准确实现优化半周期法,对时钟信号的精度要求很高。因为需要精确地控制半个周期的时间,任何时钟的偏差都可能导致数据传输错误。 动态调整定时器参数以支持不同波特率。 发送端和接收端需要精确同步才能正确通信。如果两端的时钟不同步,可能会导致数据传输错误。 为了提高接收数据的稳定性,可以将定时器周期设置为稍大于串口波特率所对应的bit周期,以增加一定的裕度来防止电平跳变。 可以通过合理设计软件流程,在不需要通信时将IO口设置为低功耗模式,以降低整体功耗。 在高频情况下,信号的完整性问题变得更加突出。由于传输线的寄生电容、电感等因素,可能会导致信号的畸变。 若定时器周期设置不合理,可能导致数据接收错误或通信不稳定 优化半周期法的实现依赖于定时器的定时精度,因此在较高的波特率下,可能会受到定时器定时精度的限制。在选择波特率时,要根据单片机的时钟频率和定时器的性能进行合理选择。 时序控制不当可能导致数据传输错误,影响通信的可靠性 在每个半个波特率周期内进行一次采样,连续采样两次,将两次采样值进行逻辑与运算,得到最终的数据位值。 优化半周期法对时钟精度要求较高,定时器的定时误差会影响通信的可靠性。