即使某些微控制器使用无法扩展到标准波特率的晶振频率,如何实现波特率?


16

我刚刚意识到8051系列使用11.0592 MHz及其倍数来生成标准波特率。但是有些使用15 MHz的SoC。那他们怎么做呢?


5
通常,它们使用非2的幂数除数来生成可接受的接近标准波特率的速率。
布赖恩·德拉蒙德

4
更重要的是,可能的UART的过采样的信号(例如每UART位16个采样),这解决了定时(和噪声)的问题:electronicdesign.com/embedded/...
弗洛里安卡斯特拉

1
对于感兴趣的任何人,AVR USART时序误差表可用于数据表中的通用时钟(在第168页起)
塞比

Answers:


22

UART不在乎,只要它相当精确即可。

1500000023040065

65230400=14976000

因此您的UART将过快150001+1变成问题15000149761.002204,当跨越11位的时间偏移大于半个位。1+12111.045


9
可能值得注意的是,发射器和接收器都具有时钟,所以如果两者都是错误的方向错了..
Spehro Pefhany

7
更重要的是,相关的串行协议(RS-232等)使用开始和停止位来进一步同步时钟。即使双方都有完美的230400 Hz时钟,两个时钟也可能异相。起始位允许接收方将其时钟同步到发送方。由于这可能发生在每个字节的第一位,因此时钟不完善仅意味着相位调整更加频繁。
MSalters

1
实际上,由于分隔器系统不太可能具有100%的灵活性,因此可能比这篇文章所指出的要多得多。
彼得·格林

2
@PeterGreen:是的。大多数真正的UART需要一个16倍波特率的输入时钟,而可编程分频器必须产生更快的时钟。在此示例中,总分频器必须为64(= 16 x 4),并且误差为或+ 1.7%,这仍然是一个可接受的值。15MHz/64230400baud=1.01725
戴夫·特威德

2
@DaveTweed:但是认真对待异步串行的芯片往往会在其串行外设中允许13的超采样因子,从而获得Simon很好的低误差,Simon从任何3 MHz倍数的时钟开始计算得出。或者,有些人使用分数除法器,即使单个位可能具有大于2%的时序误差,位时间也会平均到正确的值。
Ben Voigt,2016年

12

这是相对高端的ARM MCU的“主要特征”描述。

在此处输入图片说明

有许多具有预分频器和后分频器的PLL和分频器,它们能够以整数比创建几乎任何您可能需要的频率。该PLL 乘以由一些整数的输入频率,以及除法器可以通过一定数目(除以 2在每种情况下一定的权力)。

内部相对较高的频率(在这种情况下约为半GHz)不是问题(就像芯片外的情况一样),消耗的功率相对较小。

仅以2的幂进行除数的日子在很早以前就结束了,现在PLL被普遍使用了,我们不必担心确切的晶体频率那么多了。另一方面,对于多个内部总线时钟,USB,以太网,UART等外设,我们可能需要许多不同的时钟频率。

如果您想了解更多有关它们如何工作的信息,可以研究一些相对简单的专用时钟合成芯片(尽管仍然足够复杂,以至于有些制造商提供了软件来计算设置常数)。


2
(它是所有格,它是“它是”或“它具有”。例如参见如何使用它和它。)
Peter Mortensen16年

4
@PeterMortensen谢谢,固定。由于某种原因,在会话性思考模式下而不是在报告撰写模式下,这样的拼写错误(以及放置不正确的同音异义词)更加容易。
Spehro Pefhany

10

这可以使用调制器来实现。

例如,请参阅《MSP430x1xx用户指南》。在第260页,它说:

USART波特率发生器能够从非标准源频率产生标准波特率。波特率发生器使用一个预分频器/除法器和一个调制器,如图13-7所示。这种组合支持小数除数以产生波特率。

Baud rate timing

(请注意灰色区域)

除法因子N通常是一个非整数值,其整数部分可以通过预分频器/除法器实现。波特率发生器的第二级,调制器,用于尽可能接近小数部分。

[...]

当需要非整数除数时,可以使用调制器逐位调整BITCLK,以满足时序要求。如果设置了调制器位mi,则每个位的时序将扩展一个BRCLK时钟周期。每次接收或发送一个位时,调制控制寄存器中的下一位将确定该位的时序。设置的调制位使分频因子增加一,而清除的调制位保持UxBR给定的分频因子

[...]


5

很多人认为UART实际上是在固定时钟上运行的,即您每隔一个采样 Ť秒。这不一定是真的。至少不是在我设计的所有UART模块中。

它的工作方式是您有一个内部采样时钟。假设您可以每100ns采样一次。您知道每一位的中间位置。因此,选择一个最接近中间点的采样点。这最多会给您50ns的误差。

发生的是您收到了起始位。然后,确定位的中间位置,即参考点。然后,您知道需要等待多长时间才能采样下一位。因此,您加载了一个计数器,并在重置时采样。现在,您最多将以快速内部时钟为一个时钟周期关闭,但是在大多数情况下,这是十亿分之一秒。另外,您知道您的境遇。对于下一位,您将使用不同的值加载计数器,因此您应尽可能靠近中间位置,依此类推。

在实际系统中,还会发生很多其他事情。例如,您不采样,可以采样几个,然后对其进行一些处理等。实际上,它是一个1位ADC,具有所有影响,例如量化噪声。但是您应该了解一般的想法。


3

现代SoC使用所谓的PLL生成(几乎)接口可能需要的任何时钟。简而言之,PLL电路使用高频VCO(电压控制振荡器),然后在VCO和输入时钟上使用双精度分频器,并根据频率比生成电压反馈。该反馈控制VCO,从而将整个环路锁定到所需的频率。


2

假设一个8位字节前面有一个开始位,然后是一个停止位,并假设接收器进行了完美采样,这意味着在9.5个位周期之后,时钟必须关闭不到半个位周期。

这意味着发送器和接收器之间的最大可容忍时钟差约为5%。但是,链路的两端都可能出现错误,并且接收器的同步可能并不完美。因此,在实践中,我通常建议实际波特率保持在标称波特率的1%以内。

我最熟悉的单片机是PIC18器件。这些旧型号使用灵活的8位计数器来缩放波特率,而新型号则使用灵活的16位计数器。还有可选的“高”和“低”速度模式,它们将波特率更改为四倍。

在20 MHz输入时钟的情况下,对于从1800到19200的所有速率,此生成方案的8位版本足以达到标称波特率的0.25%以内。16位版本使您可以降低速度。

http://www.nicksoft.info/el/calc/?ac=spbrg&submitted=1&mcu=+Generic+16bit+BRG&Fosc=20&FoscMul=1000000&FoscAutoSelector=0&MaxBaudRateError=1(忽略sync = 1列,它们用于在USART中运行同步模式)

UART串行实际上不需要PLL,小数分频器等。


0

要交换串行数据,控制器必须在“理想”时间的某个窗口内输出或采样数据。虽然最简单的是一种控制器,该控制器将时钟除以可编程系数,然后再除以附加的硬编码系数,但并不需要以相等的间隔读取或写入这些位。如果连接的远端以与波特率匹配的精确均匀间隔输出位,则只要接收器在正确的时间对其进行采样,接收器就可以通过大于波特率两倍的任何采样率。例如,假设数据以19,200输出,一个正以48,000Hz(2.5x)采样。

当看到下降沿时,您将知道停止位在0和1个采样时间之间已经开始。如果将第一个样本标记为观察到起始位的时间为0,则位0将在时间1.5和2.5之间开始;位1将在时间4.0到5.0之间开始,位2将在时间6.5到7.5之间开始,位3将在时间9.0到10.0之间开始。因此,将确保在时间3采集的样本捕获位0(从时间1.5和2.5开始,到时间4.0和5.0之间结束)。同样,在时间6采集的采样将捕获位1,在时间8、11、13、16、18和20采集的采样将捕获位2-7。

使用更快的采样率将使接收器更能容忍信号源中的瑕疵,但是即使采样率仅为2.5倍比特率,裕度也不是很糟糕[大约1/5的比特时间]。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.