搜索
bottom↓
回复: 45

斗胆下个关于UART波特率的结论,请拍砖

[复制链接]

出0入0汤圆

发表于 2005-1-12 09:59:01 | 显示全部楼层 |阅读模式
按照AVR的波特率发生器的结构(51也类似),可以得出波特率发生器的发生频率在+\-4%内漂动都可以保证10位UART(包括起始,终止位)的正确接收,这意味着什么???意味着UBRR值(或51的T1补值)在25以上时,波特率就可以向更低的速度"无级调节",换言之,单片机无论主频如何,都可以无条件适应低于"UBRR=25时所对应波特率"以下的所有波特率(不管是不是标准的波特率值),所以带来的结论是,你若希望UART能适应尽量大的波特率范围上限里"无级适应",那么这个上限就是UBRR=25的时候对应的波特率.提高主频是扩大此自由境界的路子之一



_________________________________________________________________________________________

PS:对于任何RC振荡产生主频的系统,使用异步通信都涉及到时基配合上位机的问题,而RC振荡电路天生的性能离散性,导致我们很大程度上要花费精力来将其(或其分频)校准使用.对于数字系统,校准频率最常见的方法就是调整分频比,缺点是在分频比比较小的情况下,步进分辨率不理想,本贴就是定性指出到底分频比要大到什么程度才能为我所灵活使用.

另一个调整RC振荡器的办法是直接调整RC参数,这个用数字电路实现起来比较难,我个人猜测比较简单的办法是采用电子开关距阵配合电阻构成可以数字方式设定阻值的数控电阻,这样对MCU设计来说比较好实现些(请看贴http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=339563&bbs_page_no=1&sub_kind_id=1050&bbs_id=1000)

说到底异步通信必须要面对要时基同步的问题,而比如I2C,SPI等同步系统就不需要特定约定波特率时基.那么如果你不是使用专门的硬件UART口,你可以自己定义一个脉宽编码的通信方式,用宽脉代表0,用窄脉代表1,一个脉就是一个比特,这样就可以弱化时基对位同步的影响(说弱化而不说避免是因为测量脉宽也是要用时间基准的,但裕度可以放的很宽,不至于要在4%内)


-----此内容被crazyeda于2005-01-12,12:20:03编辑过

出0入0汤圆

发表于 2005-1-12 10:39:59 | 显示全部楼层
可以从以几个方面测试AVR的片内RC振荡器:



AVR片内倒底有几个RC振荡器?从硬件上来看,以下器件需要时钟:系统主时钟、看门狗、波特率发生器。已确认用主时钟的就不提了。



系统时钟是可以校正的,这点毫无质疑。



波特率发生器:从不校正主时钟则波特率不正确来看,这两个时钟为同一源。

波特率发生器的发生频率可校正,应该仅仅是调节分频。



看门狗:手册上提到是独立振荡器,等会就去用示波器看看,修改主时钟会否改变看门狗溢出时间。这个问题,我是一直有怀疑的:不同源,则无法保证每个芯片的的喂狗位置相同。从理论上讲,有可能出现调好的程序,不校准主时钟会出现异常。相同则手册骗人。

出0入0汤圆

 楼主| 发表于 2005-1-12 10:49:22 | 显示全部楼层
看门狗独立震荡我也觉得有点不妥当,不过喂狗时间还是可以比较宽余的,问题不大

出0入0汤圆

发表于 2005-1-12 19:39:26 | 显示全部楼层
"比如I2C,SPI等同步系统就不需要特定约定波特率时基"

因为他们至少有同步时钟及数据线.



异步UART通信的同步时钟及数据等只能在一个方向的传输线上了...



所以,异步UART通信受的条件约束自然会多些,这个要体谅些嘛...

出0入0汤圆

 楼主| 发表于 2005-1-12 21:57:08 | 显示全部楼层
HOTPOWER,我都望眼欲穿了,快出招啊,给小弟们讲讲你的RC振荡器校准

出0入0汤圆

发表于 2005-1-12 22:04:07 | 显示全部楼层
不是我"卖关",因为我发现一个奇怪的问题,及5V用不成此算法,正在找原因...



我所要发表的"水文",必须先要过"水关"才行...



没把握的我绝不胡来...这就是一个技术工作者的"原则"...



误人子弟我绝对不做...虽然我这辈子也不想出名,也不想出书,但"江湖道义"我还是知道些...

出0入0汤圆

 楼主| 发表于 2005-1-13 11:08:01 | 显示全部楼层
老师傅就是稳重,要是现在人都能这么认真就好了.



HOTPOWER大叔,能否把你遇到的问题给小弟讲讲,也许......我的笨脑瓜还能偶尔拐到一条阳关道上.人多力量大嘛

出0入0汤圆

发表于 2005-2-28 14:22:38 | 显示全部楼层
crazyeda 你有什么办法好让UART稳定,但是可以不用外部晶振!

我在测试过程中,如果将校准位填上,然后串口波特率不高(9600)的情况下,串口出错的机会是相当小的!再考虑将电源稳定一下,我想不会有太大麻烦!



就是得烦请hotpower 大侠说说RC自校准的原理了!

出0入0汤圆

发表于 2005-2-28 18:54:35 | 显示全部楼层
RC自校准?我也想听听hotpower的高招

出0入0汤圆

发表于 2005-3-1 01:58:51 | 显示全部楼层
仅对1楼的以下两句加说明:



“波特率发生器:从不校正主时钟则波特率不正确来看,这两个时钟为同一源。”



对的。



“波特率发生器的发生频率可校正,应该仅仅是调节分频。”



不准确。调节分频(即USART的波特率分频寄存器的值),不是“校正”发生的频率,而是确定分频数,产生满足4800、9600等标准波特率。



  而楼主的“波特率发生器的发生频率在+\-4%内漂动”的理解是不正确的。AVR的USART硬件在接受数据时,对一个数据位用16个采样点检测,对8、9、10点采用大数方式确定电平高低,这与51的相同(请仔细看AVR的器件手册)。但对停止位检测时,当8、9、10点确定为低电平后(停止位),后边的11-16点取消了,立即开始检测下一个起始位。因此,AVR在接收时,可以在确定的9600bps时,当两个通信机的波特率偏差+\-4%内,还能正确的接收数据。这个特点保证了采用RS232传送大批量数据时的可靠性,因为异步通信中两个通信机的频率不会完全相同的,这也是AVR芯片USART的优点之一(仅USART就有3-4个优点比51强)。

   注意的是:这个自动的调整,不是调整波特率,而是通过提前检测起始位实现的。



   当然,使用RS232通信,应尽量保证双方波特率的准确。要保证通信的高可靠,或采用高速通信,AVR应采用外部晶体,并且是专用频率的晶体。



   一般4M晶体,AVR产生的9600bps为2%的误差。我的使用经验,采用9600,连续数据长度在48字节以内的话,发送和接收都正常的。



   如果采用内部RC,我会尽量使用内部的1M,因为出厂效正过。同时波特率采用4800或更低一些。这样会省掉很多的麻烦。

   




-----此内容被machao于2005-03-01,02:06:48编辑过

出0入0汤圆

 楼主| 发表于 2005-3-1 11:59:45 | 显示全部楼层
多谢马老师指教,不过还是不明白"但对停止位检测时,当8、9、10点确定为低电平后(停止位),后边的11-16点取消了,立即开始检测下一个起始位。"和我说的有矛盾吗,我的4%正是因此而得到的.

出0入0汤圆

发表于 2005-3-1 16:44:56 | 显示全部楼层
你所指的“波特率发生器的发生频率在+\-4%内漂动”可能你非常清楚,但容易使人误解。

  

  既:这4%的容差是由于:AVR的是波特率发生器的发生频率可以自动微调获得的?还是由于它通过硬件检测方式的改善获得的。



  两个通信机的波特率偏差,以及温度变化引起频率漂动的问题,不管使用51还是AVR都是客观存在的。但AVR的硬件检测方式的改善,获得了4%(强调是在9600bps,10位条件下)的容差,使得通信特性更加可靠些,这正是AVR的优点之一。

出0入0汤圆

发表于 2005-3-1 23:39:51 | 显示全部楼层
打扰一下,我通常都是用8M片内,9600,好象还没出过错。是我运气好,还是232标准之内?232标准是多少?

出0入0汤圆

发表于 2005-3-1 23:52:13 | 显示全部楼层
bany:

   部分AVR MEGA芯片对1,2,4,8MHz都作了出厂校准,(5V 25'c  +/-1%)

   0'c/50'c温度时就可能不行了。

出0入0汤圆

发表于 2005-6-24 16:13:53 | 显示全部楼层
马老师讲的精辟,这个4%我查了半天,终于在这里找到了。

出0入0汤圆

发表于 2005-9-10 16:46:06 | 显示全部楼层
我是刚刚开始学习AVR,问一个低级问题

为什么不用11.0592M的外接晶振,在2400/4800/9600等处误差均为0。用外部晶振是不是有什么负作用

出0入0汤圆

发表于 2005-9-10 22:02:20 | 显示全部楼层
学习中

出0入0汤圆

发表于 2005-9-27 10:17:05 | 显示全部楼层
使用内部RC振荡器,我曾经实现波特率的自校准.

思路是这样的:

首先接收一个0x7F的数据,它实际上是一个数据位的低电平和7个数据位宽的高电平的脉冲,用定时器测量这个高电平的宽度,单片机的振荡频率的偏差影响这个宽度的数值,然后根据宽度的数值去调整波特率的设置值.
-----此内容被zhoupix于2005-09-27,10:20:11编辑过

出0入0汤圆

发表于 2005-9-27 10:27:37 | 显示全部楼层
需要主机(采用标准的通讯格式)配合----需要定时重同步。

好像PHILIPS的一款单片机的ISP就是采用这种自同步技术(忘了)。



觉得采用RC时钟做通讯的意义在哪里?

1 如果单片机的引脚很少,没法接晶振---但那内部的FLASH也是很小的

2 如果单片机的FLASH足够,那引脚一般也不少,可以接晶振



多用在功能简单,成本低,采用少引脚的单片机的场合
头像被屏蔽

出0入0汤圆

发表于 2005-9-28 17:05:04 | 显示全部楼层
紧急求助:



本人用M162双串口芯片,串口0工作在波特率为115200.

发送时,用串口调试软件接受,就是不正确,如何解决?



MSN:WFT2@HOTMAIL.COM

QQ:11639882



我在上海,有空来喝酒

出0入0汤圆

发表于 2005-9-28 17:09:24 | 显示全部楼层
to wft2 王海峰

  请另帖提问。



   PS: 你的描叙不详细,说了跟没说差不多。
头像被屏蔽

出0入0汤圆

发表于 2005-9-28 20:15:36 | 显示全部楼层
就是能发送,但接受却是乱码.

波特率不匹配,但设置都对啊.

搞不懂:(

出0入0汤圆

 楼主| 发表于 2005-9-29 14:07:06 | 显示全部楼层
philips那个自校准的程序,原先看过一篇HOTPOWER的分析,基本原理就是上位机发0x55(方波),下位机用计算出来的定时器装载值设定波特率并返回握手数据,如果沟通了,即为波特率已对上,我已经用这个方法很久例如,只不过把校准值写进EEPROM,以后直接调用。

出0入0汤圆

发表于 2005-9-29 23:21:52 | 显示全部楼层
我用M162双串口时曾出现乱码, 串口0和串口1的波特率都是9600



后来改为外部晶振, 乱码的问题就解决了

出0入0汤圆

发表于 2006-2-7 11:25:42 | 显示全部楼层
to wft2 王海峰

M162与232接口时进行电平转换了吗

出0入0汤圆

发表于 2006-2-16 15:55:19 | 显示全部楼层
我的经验:一般情况下,读出内部RC校正值写入校正寄存器后,通讯的波特率出错的概率很小,

但是当温度变化到70度已上时,出错的概率非常大,以致不能正常通讯.而且ATMega的内部RC振荡器随温度增高频率一般是下降的,一致性也不太好,我曾尝试通过监测温度调城校正寄存器

有一点效果,前提是必须附加芯片自身温度监测电路.

出0入0汤圆

发表于 2006-2-24 21:26:21 | 显示全部楼层
请教各位大虾:我用Mega64的单片机与CDMA的CM300系统模块通信,但收到的都是乱码!请问这是不是两者波特率不匹配的原因?有谁能告诉我该怎么办?谢谢

出0入0汤圆

发表于 2006-3-17 13:34:24 | 显示全部楼层
出于成本的原因可以考虑RC,但在需要通信的场合,建议使用晶体。



我用M16 8M内部,25度校正好的参数在温度变化时会出错,即使加了温度补偿,对于生产也是得不偿失

出0入0汤圆

发表于 2006-3-17 17:22:27 | 显示全部楼层
想稳定就用晶体,想便宜和简单用RC,好使的东西不好使了不要哭;晶体再差,只要不坏,总也比一般的RC振荡器好。做的最好的RC振荡器是430的21xx系列的,宽温、宽电压;PIC的其次,AVR的还要差一些。小弟玩的吐水得出的结论。



总的来说呢,RC振荡器在量产的时候并不低成本,除非你不用调试。

出0入0汤圆

发表于 2006-6-2 11:25:07 | 显示全部楼层
AVR的USART硬件在接受数据时,对一个数据位用16个采样点检测,对8、9、10点采用大数方式确定电平高低,这与51的相同(请仔细看AVR的器件手册)。但对停止位检测时,当8、9、10点确定为低电平后(停止位),后边的11-16点取消了,立即开始检测下一个起始位。



拜读了.收益不浅.近期正打算用AVR.过来看看有关方面技术.以上技术点在51没听说过.

出0入0汤圆

发表于 2006-8-5 05:49:34 | 显示全部楼层
向马老师讨教:

前期搞了一个项目,用MEGA32完成UART的大数据量收发(1K以上)。结果是接收时正常,发送时后部数据出差。检查下来是数据帧的同步匹配出错。原因也可解释:AVR在接收时的同步容错很好,但其它设备的同步容错不如AVR,所以出错。后改为分包发送解决问题(1次64字节)。

UART技术标准中对UART同步容错的标准究竟是如何规定的?

查看了一些有关UART技术标准的文章,好象无明确的指标。

出0入0汤圆

发表于 2006-10-24 12:12:51 | 显示全部楼层
我就因为这个问题搞了好久。开始还不知道原因。后来无意中发现串口1接地(ddr为输出)时,芯片发热,热了一会后接收发送就正确了。这才想到原来还有个误差在里面,不得不一点一点的去试。结果试了10多次,才准。2%可能也是一个参考值范围吧。

出0入0汤圆

发表于 2007-9-12 13:39:12 | 显示全部楼层
UART同步容错标准,不清楚.
以前老师讲4%以内是可以的, 单片机能自调整. 也没有仔细去深究.
看了会也没有看明白大家怎么从MEGA128的DATASHEET上的那个16 怎么算出来的4%.
TL16C550也是16分频,容差也是4%. 从信息论的熵值上讲,既然过采样这么多次了,怎么才能容4%?
要是给我发一个数据我采集16次,前向数据恢复应该没有任何问题.

出0入0汤圆

发表于 2007-12-14 23:01:15 | 显示全部楼层
我接受你的结论

出0入0汤圆

发表于 2008-3-10 15:54:21 | 显示全部楼层
使用了AVR的 大哥大姐们 斗胆问一问
都喊着51不好,AVR有多少个优点,就UART来说 你们讨论了很多 51不会出现的问题。还有 停止位的检测10点以后的 数据不会检测的问题。除了能提高接收数据的速度 。这有什么意义?大家 在异步串行通信上都是按着一个标准来做的 你省略了停止位的 后边几个检测点有什么意义?不过是为了懒人和笨蛋(算不准波特率的)做个遮羞布吧?!或者是使用了不能直接产生标准波特率的晶振。这样的技术优点在设计的过程中一点参考的价值都没有。倒可以做为AVR的通信可靠性高宣传一下。
引一下 28楼的话
想稳定就用晶体,想便宜和简单用RC,好使的东西不好使了不要哭;晶体再差,只要不坏,总也比一般的RC振荡器好。做的最好的RC振荡器是430的21xx系列的,宽温、宽电压;PIC的其次,AVR的还要差一些。小弟玩的吐水得出的结论。

总的来说呢,RC振荡器在量产的时候并不低成本,除非你不用调试。

好东西就是好,不用这样。本来想好好学一下的,看见这里象丁春秋的那个什么教,真能吹!别这样好不好。

出0入0汤圆

发表于 2008-3-10 17:18:11 | 显示全部楼层
实际上电脑的UART单工通讯有10%误差都没问题的,单片机就差一些变成4%了

出0入0汤圆

发表于 2008-4-24 16:44:27 | 显示全部楼层
vivalite :
实际上电脑的UART单工通讯有10%误差都没问题的,单片机就差一些变成4%了  

太夸张了吧?
我倒是觉得,串口通信对于波形畸变的容忍度要好一些,但是对于波特率的误差,裕量要小的多
特别是用了FIFO的单片机,数据可以一刻都不停地发,就更容易出错,除非发一个字节等一段时间以便通信再同步。

正在学习AVR中,以上是在51上得出的经验。

出0入0汤圆

发表于 2008-4-24 17:31:42 | 显示全部楼层
停止位不管设多少,接收方只看半位,这是异步通信不积累时钟误差的保证,UART都是这么做的,未必是AVR特有的处理手法。
因异步通信帧最长是11位(start:1、data:8、parity:1、stop:1+),那么半位就是整个帧长的0.5/11。换言之,一帧从头至尾双方时钟差5%不到一点的话,停止位还是能被正常检测到,4%的依据就是从这来的。
不过从通信的任何一方看,你不能把5%误差都独霸了,得留一半给对方(礼貌和规矩嘛),所以约定自己的时钟误差不要超过2.5%,——准确地说是0.5/22≒2.27%,放点富余就说2%咯。

出10入95汤圆

发表于 2008-4-24 22:44:30 | 显示全部楼层
高手很多!

出0入0汤圆

发表于 2008-9-8 15:19:59 | 显示全部楼层
dddddddddddddddddd

出0入0汤圆

发表于 2009-1-15 01:33:31 | 显示全部楼层

 (原文件名:1.JPG) 

不作口舌之争.随便去找本80年代的51书翻翻都有说


只是我说得也有问题,三次采样是在中心附近,约占3/8或3/16的宽度.这样做的对于容差的可靠性完全没有提升,只不过是为了消除毛剌影响.

本贴被 rainyss 编辑过,最后修改时间:2009-01-15,01:44:24.

出0入0汤圆

发表于 2009-1-15 00:18:12 | 显示全部楼层
楼上的,你先看了AVR和51手册中USART接收硬件部分的描述后再发表高见。

采样频率是设置波特率的16倍,AVR的高速方式,也有8倍!

出0入0汤圆

发表于 2009-1-14 23:24:22 | 显示全部楼层
误会啊,天大的误会啊.....

你们知道那个"x%的误差"是怎么来的吗?

传统的串行通信,对信号进行采样时,其采样频率是按波特率1:1进行的,比如9600的波特率,则采样频率为9600次/秒.所以,当信号的波特率精确等于采样端波特率时,则每个采样点正好位于每个数据位的中央,而当信号的波特率偏低时,采样点将发生左移,反之右移.此时注意看了:----如果偏移的周期大于一个采样的50%时,采样点就肯定移出信号的范围了,也就出错了.这个50%是积累性的,所以波特率的总偏差为50/(8+2) = 5,即偏差不能超过4.9999999999999....%

然而问题来了:

凡兼容MSC 51 UART通信协议的串口,采样并不是这样进行的,它是以3倍于波特率的速度进行采样,并要求每三次采样中的两次相等,否则视为采样出错,这样做的目的之一是为了能检测出波特率失步(相比之下,传统的采样方式是无法检测得到失步的).而带来的副作用是,未位积累偏差不得大于33.33...%,而不是49.99...%!!!!

当然,这种做法我个人认为其实用处不是很大,连续1和0是检不出来的.

几乎所有的手册里都按50%来算,所以很多人搞到死都想不明白明明是按公式算出来的,为什么他的单片机总是多收到少收到一个字节.因为没人怀疑过手册.


至于

"AVR的硬件检测方式的改善,获得了4%(强调是在9600bps,10位条件下)的容差,使得通信特性更加可靠些,这正是AVR的优点之一。 "

的说法,愿主宽恕我的愚钝,因为我实在想不出用了什么高明的办法来"使得通信特性更加可靠些",请指点.

本贴被 rainyss 编辑过,最后修改时间:2009-01-14,23:26:19.

出0入0汤圆

发表于 2009-1-14 14:01:15 | 显示全部楼层
还有就是怎么检测时钟啊,用示波器在XTAL1上都测不到时钟信号. 是不是设置为内部时钟的时候 外部时钟就不起作用了

出0入0汤圆

发表于 2009-1-14 13:52:58 | 显示全部楼层
看门狗1M的时钟就是缺省设置对主频分频得到的.这个可以从修改主频,喂狗时间改变了能看出来.

出0入0汤圆

发表于 2010-8-1 00:30:58 | 显示全部楼层
MARK~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-7 14:53

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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