【问题标题】:Atmega highest BAUDRATE vs TIME-MEASUREMENT accuracyAtmega 最高的波特率与时间测量精度
【发布时间】:2016-04-09 09:44:10
【问题描述】:

在我的项目中,我需要 Atmega328p 和 BTM-222 之间的最高可用 UART 波特率,因此我必须使用 18.432.000 Mhz 晶体来实现 460.8 kbps 的无错误传输。

但同时我需要高精度的时间测量。 以前当我使用 16Mhz 晶体时,我使用的是这种方法: Timer0 带有 64/ 预分频器。所以增加计数器寄存器需要 4us。

(1/16000000)*64 = 4us

4us 是我的测量分辨率 溢出计数:每1024us发生一次计数器溢出

4us * 256 = 1024us

那么要接收在我们身上缩放的时间,有一个等式:

time(uint32) = current_counter * 4 + overvlow_counter * 1024

一切都很简单,因为 x4 和 x1024 相乘是位移。 我使用的是长整数,所以我可以测量的最长时间是

2^32 * 1ms = 71 分钟。

太棒了!

然后当我使用 18432000 MHz 晶体时 (1/18432000)*64 = 3,47(2) 所以它不能用我以前的代码来计算。

也许你有一些想法我能做什么? 我有一个:使用来自晶体的 1MHz timer0 外部时钟源。 我的问题是:如何将 1MHz 晶振连接到 T0 引脚并为 timer0 提供时钟源?

【问题讨论】:

    标签: timer serial-port avr uart atmega


    【解决方案1】:

    您似乎混淆了这里的几个术语:准确度、精确度和便利性。

    您的问题是如何使您的代码方便,允许简单的位移。

    但是通过使用位移来增大间隔会牺牲精度。

    如果您真的想要问题标题中所说的准确度,那么您应该使用最准确的晶体,看起来是 18.432 MHz,并在您的代码中进行算术运算。如果您想要更高的精度,请使用更多变量来保存计时结果。如果您想要准确,则在增加毫秒计数器之前将时钟设置为计数到 18432。

    最糟糕的解决方案是连接和额外的水晶。它的成本更高,但精度和准确度更低。

    【讨论】:

      猜你喜欢
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 2021-12-20
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      相关资源
      最近更新 更多