打印
[其他ST产品]

通信波特率与系统的时钟频率密切相关

[复制链接]
356|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
是你的乱码|  楼主 | 2024-5-29 15:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通信波特率与系统的时钟频率密切相关,如果系统的时钟频率不准确,确实会导致波特率计算错误,从而导致实际通信中的波特率偏高或偏低。

以下是详细的分析和解决方案:

波特率计算公式

通常,波特率寄存器值的计算公式如下:

\[ \text{UBRR} = \frac{F_{CPU}}{16 \times \text{BAUD}} - 1 \]

其中:
- \( F_{CPU} \) 是系统时钟频率。
- \( \text{BAUD} \) 是目标波特率。
- 16 是分频因子(具体值可能根据使用的硬件有所不同)。

如果系统时钟频率不准确,会导致计算的波特率寄存器值不准确,从而影响实际波特率。


使用特权

评论回复
沙发
是你的乱码|  楼主 | 2024-6-28 15:20 | 只看该作者
解决方案

验证和校准系统时钟频率

首先,确保系统时钟频率是准确的。可以使用高精度的参考时钟源和测量工具(如频率计数器)来校准系统时钟频率。

检查晶振

确保使用高质量的晶振,并且晶振电路正确配置。如果晶振存在问题,可能导致系统时钟频率不准确。以下是一些检查步骤:

更换晶振:尝试更换为规格相同的晶振,以排除晶振本身的问题。
检查负载电容:确认晶振两端的负载电容值正确,符合晶振的规格要求。
电路布局:确保晶振附近的PCB布局合理,避免干扰和噪声。

使用内部或外部校准源

一些微控制器支持使用内部或外部的高精度时钟源进行校准。

利用这些功能,可以校准系统时钟频率。例如,某些微控制器允许调整内部振荡器的校准寄存器。

验证波特率设置

使用示波器或逻辑分析仪实际测量UART信号的波特率,确认是否符合预期值。如果测量波特率偏差较大,需要重新校准系统时钟或调整波特率寄存器。

使用特权

评论回复
板凳
是你的乱码|  楼主 | 2024-6-28 15:20 | 只看该作者
实践步骤

测量系统时钟频率

使用示波器或频率计数器直接测量系统时钟频率,确保其与设计值一致。如果频率不准,按上述步骤校准系统时钟。

使用特权

评论回复
地板
是你的乱码|  楼主 | 2024-6-28 15:21 | 只看该作者
校准和验证波特率

假设系统设计使用16MHz时钟频率和9600bps波特率:
- 计算波特率寄存器值:
  \[ \text{UBRR} = \frac{16000000}{16 \times 9600} - 1 = 103 \]

- 配置波特率寄存器:
  ```c
  #define F_CPU 16000000UL
  #define BAUD 9600
  #define MYUBRR F_CPU/16/BAUD-1

  void uart_init(void) {
      uint16_t ubrr = MYUBRR;
      UBRR0H = (uint8_t)(ubrr >> 8);
      UBRR0L = (uint8_t)ubrr;
      UCSR0B = (1 << RXEN0) | (1 << TXEN0);
      UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
  }


实际测量波特率
  使用示波器捕捉发送的UART信号,测量一个位的持续时间。例如,如果实际测得的位宽为104微秒,则实际波特率为:
  \[ \text{实际波特率} = \frac{1}{104 \times 10^{-6}} \approx 9615 \text{bps} \]
  这是接近9600bps的合理误差范围。

使用特权

评论回复
5
是你的乱码|  楼主 | 2024-6-28 15:21 | 只看该作者
调整波特率寄存器

如果实际测量的波特率误差过大,可以通过微调波特率寄存器的值来补偿时钟误差。例如,如果测得的实际波特率偏低,可以适当降低UBRR值以提高实际波特率。

使用特权

评论回复
6
是你的乱码|  楼主 | 2024-6-28 15:21 | 只看该作者
具体示例

假设测量时发现实际波特率为9800bps,而预期为9600bps,可以通过以下方式调整:

1. 重新计算UBRR值
   假设目标波特率为9600bps,系统时钟频率实际为15.68MHz(偏低)。
   \[ \text{UBRR} = \frac{15680000}{16 \times 9600} - 1 \approx 102 \]
   设置UBRR值为102。

2. 调整代码并验证
   ```c
   #define F_CPU 15680000UL  // 实际测得的系统时钟频率
   #define BAUD 9600
   #define MYUBRR F_CPU/16/BAUD-1

   void uart_init(void) {
       uint16_t ubrr = MYUBRR;
       UBRR0H = (uint8_t)(ubrr >> 8);
       UBRR0L = (uint8_t)ubrr;
       UCSR0B = (1 << RXEN0) | (1 << TXEN0);
       UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
   }
   ```

   使用示波器再次测量实际波特率,确认调整后的波特率接近9600bps。

通过这些步骤,确保系统时钟频率准确,并调整波特率寄存器,以实现精确的通信波特率,确保UART通信的可靠性和准确性。

使用特权

评论回复
7
呐咯密密| | 2024-6-28 18:22 | 只看该作者
有些波特率很难搞出来,所以才有常用的波特率,尽量减少误差

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

286

帖子

1

粉丝