个人觉得,片内的RC不能用作(像通信,定时这类)对精度有要求的时钟源这应该是常识
实际上,这是一个容差的概念。 在串口通讯下,并非要求你的波特率时钟与基准分毫不差,它允许一定的误差。并且,由于它的协议设计,每一个字节的误差不会传导至下一个字节。我们以你发送为例来说明。假如你所用的是 10-bit 帧,且接收端是在每一 bit 的中点采样,那么你的理论极限容差就是 5%,因为第 10 bit 时误差已经累积到半个周期了。当然,在实际应用中,我们设计时所容忍的误差远小于 5%。因为接收端可能存在反向的误差。传输方向反过来,道理也是一样的。 厂商给出工作条件的时候,应该是考虑到在这个范围内都保证满足容差的。这个还可以在进一步咨询 ATMEL 的技术支持,确认他们给出的工作温度范围是否对 RC 时钟振荡器通用适用。特别要问,在最高温度下,产生的偏差有多大(如果 Spec 中没有的话)。 一般情况下,产品的特性参数是在标准大气环境下测试的,温度一般就是我们所说的室温(一般采用 25C 或 20C,要看厂商的 Spec)。你在这一点下尽可能准确地将波特率调整到标称值。 如果厂商所给的工作温度范围是有效的,那么你在这个范围内所产生的误差,应该在容差范围内。 不知我说清楚了没有。换句话说,你在 25C 下校准到 115200; 在厂商承诺的最高温度下,波特率是变了,但它应该在容差之内。 还有一种方法,你预先测一下温度升高之后,实际波特率与常温相比是升高了还是降低了(与芯片 RC 所用的工艺有关)。假如是升高,那么你可以在常温下预先给一点负偏置,也就是略调低一些,来保证你的高温下仍不超差。反之亦然。当然,这是以你不在低温下使用为条件的。 至于 115200 下稳定性比 9600 差的问题,可能与分频系数的误差有关。在 UART 模块中,它所获得的采样和发送时钟,实际上是通过对系统时钟分频得到的。在某些情况下,某一波特率与系统时钟没有整倍数的关系,因此分频系数(必须是整数)是个近似值。在高波特率下,这种误差更大,因为分频系数每加减 1,其分频偏差相对于短的时钟周期引起的误差要大得多。 说穿了,很多情况下,你在芯片上实际得到的波特率往往不是标称值,而且波特率越高,误差率越大。
[quote=引用 16 楼 nilwade 的回复:] 感谢各位的回帖。 我自己也总结一下:RC片内时钟受温度、电压等外部环境影响大。所以对于串口通信而言,不是一种可靠的解决方案。片内RC校正可以部分解决这个问题,但是校正结果只针对特定的温度及电压,假若这些值变化了,那么就需要再次的校正。因此,对于串口通信,尤其是高速率情况,建议方案是外加晶振作为参考时钟。
27,375
社区成员
28,770
社区内容
加载中
试试用AI创作助手写篇文章吧