数码之家

 找回密码
 立即注册
搜索
查看: 1589|回复: 9

用示波器调试模拟串口方法全过程

[复制链接]
发表于 2023-5-14 10:06:55 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
      串口是单片机与外部联系的主要通道,一般地,单片机都会设置有标准的串口。但是,在实际工作时往往会发现,由于通信的通道数多于原有的标准串口,开发者不得不用普通的I/O口模拟标准串口以满足实际工作的需要。用普通的I/O口模拟标准串口最重要的关键是数据传输的速度要与系统要求的波特率同步才能正确地识别传送的信息,这样单片机才能在正确的指令下正常地工作。
      用普通的I/O口模拟标准串口网上有很多教程和实例,看起来似乎很简单,但真正的做到稳定地工作却很难,难点在于单片机的发送口和接收口不容易与波特率同步。大多数例子都是通过计算并设置单片机计时器的初始值以获得与波特率同步的动作,然而,理论上根据波特率计算的计时器初始值在实际运行时与预期的波特率会有一定的差别,造成这个差别的因素有很多,比如,单片机内置的时钟电路的精度、单片机自身性能的稳定性、单片机执行指令的多少都可能会影响接收或发送信息的时间间隔,使得单片机执行指令的时间有额外的开销,从而使得计时器的预设值不准,造成波特率也产生漂移,发送或者接收到的信息不准确。当模拟串口接收到的信息与预期的有差别时,调试是很困难的,原因就是无法知道调整的方向和程度,你根本不知道计数器的预设值是往大调还是往小调,需要调多少。本文介绍了一种基于示波器的调整方法,它完全克服了上述缺点,能够快速的调试模拟串口,并稳定的工作。
       笔者使用过一款STC15F(L)104W单片机,它只有8只脚,体积小,性能稳定,价格便宜。但它的缺点全片没有一个标准串口,如果要使用它与外围通信,必须模拟串口。现在笔者就用这款单片机介绍模拟串口调试的全过程。
      首先,确定要实现的波特率,只为说明这个方法,波特率就定为4800吧,在这个波特率下,传送每一位数据的时间开销是1/4800秒,也就是208.3微秒左右,一个字节是8位,再加上起始位和结束位,一个字节一共要传送10位2进制数据,共需要10*208.3=2083微秒,约等于2.08毫秒,这个就是字节传送的周期值,我们采用定时器0中断来拟合这个时间。其次,确定一个字节的传送的数据,本文的这个数据是0x2C,这个是随意选取的,不过,要说明的是,在调试模拟串口时,必须循环传送这个数据,因为要测量周期值,只有相同的数据循环才容易判断周期的起始点和结束点。在STC的ISP中,已经有计算出来的4800波特率的计数器初值,我们从这个初值开始调试:
1.png
      根据公式BAUD=65536-FOSC/3/BAUDRATE/M计算出来的4800波特率的计数器初始值为0xFD00,其中,FOSC是11.0292MHZ,在1T的情况下M=1。实际上本文介始的调试方法无需进行这个计算,只需要知道4800波特率时,一个字节传送的总时间为2.08ms就行了。那么当计数器初始值为0xFD00时的效果是怎样的呢?全部的代码如下:
2.png
      由上图可见,标注得比较详细,几乎每条语句的含义都明确了。这段代码执行的操作是向串口传送16进制的数据2C,执行的结果见下图:
3.png
       显然,串口助手收到的信息不是传送的信息0x2C,其差别肯定是传送的时间与4800波特率要求的时间未同步,我们把示波接到单片机的TXB口看看数据传送的周期:
4.png
      这是个虚拟示波器,分析本文的内容足够了。从图上能看到波形是很规整的方波,并根据波形的周期性测量出了TXB脚的传送数据的周期值为ΔX=733.93微秒,小于4800波特率要求的2.08ms,因此,可以确定计数器的初始值偏大,必须往小的方向进行调整:
5.png
      这次将计数器初始值调到0xF300,其他的代码不变,执行的结果如下:
6.png
      串口助手收到的信息仍然不正确,此时的示波器测量的图如下:
7.png
      如上图可见,调整后的周期值为3.04ms,比4800波特率需要的字节周期值又大了,因此,要把计数器初始值往大的方向调整,就这样,经过几轮的调整,最后调整的计数器初始值:
8.png
      在这个计数器初始值下串口助手收到的信息是:
9.png
      由图可见,串口很准确收到单片机发送的信息,再看看此时的字节传送周期值:
10.png
        从图上看出,周期值也很准确,ΔX=2.08ms,周期值与4800波特率要求的相同了,才能收到正确的数据。
      以上就是用示波器调试模拟串口的全过程。此方法的优点于1、准确地把传送数据或接收数据的字节周期调整到波特率要求周期值,模拟串口精度高;2、调试时清楚地知道计数器初始的调整方向,可操作性好;3、调试过程时间短,调试效率高;4、调试方式独立性强,适用于各种单片机。



打赏

参与人数 2家元 +70 收起 理由
kkdkj + 10 謝謝分享
家睦 + 60

查看全部打赏

发表于 2023-5-14 12:17:45 | 显示全部楼层
这技术,一般人弄不来
回复 支持 反对

使用道具 举报

发表于 2023-5-14 14:55:47 | 显示全部楼层
本帖最后由 mmxx2015 于 2023-5-14 14:57 编辑

对模拟串口来说,发送比较简单,接收比较复杂。
硬件串口接收处理一般是这样,以波特率的N倍频率去采样RXD以实现在一位数据中间附近采样。下图是某芯片串口模式1(异步全双工)接收功能描述:
硬件串口接收.png
软件模拟时,这样做需要占用大量CPU时间,可以这样近似实现上述接收过程:
(1)初始化RXD为下降沿中断输入
(2)在RXD下降沿中断服务程序中设置RXD为普通数字输入,连读读取若干次RXD状态,以半数以上次数的状态为引脚的状态,如读取5次,读到1次高电平4次低电平,认为当前状态是低电平。如果是起始位,不是电平则重新初始化接收状态,如果是低电平,开启定时器定时,定时时间略少于一位时间的一半,如波特率=9600bps,1位时间=104μS,可以定时45μS。
(3)在定时器中断中设置定时器定时时间=1位时间(实际上只需接收第0位数据时设置即可),接收8位数据+停止位,一位数据也按上述方法读取多干次状态,停止位有效则保存数据,否则重新初始化接收。
(4)接收完一个字节,从第(1)步开始继续接收。

波特率不匹配问题
按照上述接收机制,波特率容许约半位时间的偏差,以1字节10位计算,容许约5%的偏差,以设计波特率=9600bps计算,9120~10080bps波特率都是可以正常通讯的。当然了,这是比较理想的情况,如果发送方2字节之间的时间间隔很短,比如少由于1位时间,容许偏差就没那么多了。

波特率偏差,一般不使用测量信号的校正,而是使用自适应,这个动作一般约定通讯双方的一方来做。自适应实际上就是在设计波特率附近微调,最简单的实现方法是在协议层判断数据是否有效,比如一帧数据以0xAA55开头、一帧数据有校验,当数据无效时,微调波特率直到收到有效数据。


回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-15 13:50:00 | 显示全部楼层
mmxx2015 发表于 2023-5-14 14:55
对模拟串口来说,发送比较简单,接收比较复杂。
硬件串口接收处理一般是这样,以波特率的N倍频率去采样RXD ...

谢谢你的回复。这篇小文主要介绍了发射时如何用示波器调试计数器的初始值以实现预设波特率的数据传送。当然在接收数据时按这个方法读取普通I/O口的数据也是可行的,
回复 支持 反对

使用道具 举报

发表于 2023-5-16 23:00:00 | 显示全部楼层
让我又想当年学51,买了套开发板,第一步烧写一个现成的流水灯就失败了,坚持尝试了两年,反复看教程,当时网络资源并不丰富,最后无奈失去兴趣卖掉了,后来学了AVR、STM8/32,但是心不甘买了个51最小系统板烧写试验仍然失败,百度搜索尝试各种方法,最终结论:USB-TTL波特率有偏差导致单片机不能正式识别电脑发来的数据,使用原生串口完全没有问题。
回复 支持 反对

使用道具 举报

发表于 2023-5-17 07:26:53 | 显示全部楼层
现在 MCU 入门,STC8H8K64U, 原生USB-CDC虚拟串口/就是串口,简单多了

image.png
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-22 11:19:22 | 显示全部楼层
40560335 发表于 2023-5-16 23:00
让我又想当年学51,买了套开发板,第一步烧写一个现成的流水灯就失败了,坚持尝试了两年,反复看教程,当时 ...

波特率偏了是不能识别信息的,还好最终解决了!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-22 11:20:37 | 显示全部楼层
钟山风雨起苍黄 发表于 2023-5-17 07:26
现在 MCU 入门,STC8H8K64U, 原生USB-CDC虚拟串口/就是串口,简单多了

如果原生串口够用当然就不用模拟串口了。
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2023-5-23 08:48:47 | 显示全部楼层

STC-ISP V6.91P 版,STC调试接口 | 串口绘图
STC-ISP 变得越来越强大了,增加的波形绘制功能,1~8通道,可以监控一些控制曲线,
比如PID过程的设置值、当前值、积分、微分、控制量等等。
对于数字处理结果也可以用曲线直观显示出来。

b57f3985da60374ec488fe02516bed9d_152230zz7nxhonsoumoh2s.png

STC-ISP V6.91O 版,STC调试接口 | 波形绘制/串口绘图 - 我爱单片机 数码之家  https://www.mydigit.cn/forum.php ... =%E4%B8%B2%E5%8F%A3




回复 支持 反对

使用道具 举报

发表于 2023-5-29 22:26:44 | 显示全部楼层
多谢楼主的经验分享,只有遇到问题才能增加认知,我玩过STC15F104E的模拟串口但没遇到波特率不准的问题所以真不知道按照计算赋值还会有问题,学习了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-27 02:40 , Processed in 0.187200 second(s), 15 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表