如何从 DS3231 RTC 获得毫秒分辨率

问题描述 投票:0回答:2

如何获得准确的毫秒数?

我需要计算从Arduino A发送数据到Arduino B的延迟。我尝试使用DS3231,但无法获得毫秒数。我应该怎么做才能从 DS3231 获得准确的毫秒数?

timer arduino real-time-clock
2个回答
2
投票

上面的评论是正确的,但是当你有一个专用的实时时钟时使用 millis() 是没有意义的。我将为您提供更好的指导。

任何硬件接口项目中的第一件事是仔细阅读数据表DS3231 数据表显示,亚秒级输出有五种可能的频率(请参见第 13 页):

  1. 32KHz
  2. 1KHz
  3. 1.024KHz
  4. 4.096KHz
  5. 8.192KHz

最后四个选项是通过 RS1 和 RS2 控制位的各种组合来实现的。

因此,例如,要获得精确的毫秒数,您的目标是选项 2,即 1KHz。您设置 RS1 = 0 和 RS2 = 0(请参阅您提供的数据表第 13 页)以及 INTCN = 0(第 9 页)。然后,您需要一个 ISR 来捕获从设备的

!INT/SQW
引脚到 Arduino 上的数字输入引脚的中断。

volatile uint16_t milliseconds;  // volatile important here since we're changing this variable inside an interrupt service routine:
ISR(INT0_vect) // or whatever pin/interrupt you choose
{
    ++milliseconds;
    if(milliseconds == 999)  // roll over to zero
        milliseconds = 0;
}

或:

const int RTCpin = 3; // use any digital pin you need.
void setup()
{
    pinmode(RTCpin, INPUT);
    // Global Enable INT0 interrupt
    GICR |= ( 1 < < INT0);
    // Signal change triggers interrupt
    MCUCR |= ( 1 << ISC00);
    MCUCR |= ( 0 << ISC01);
}

如果 setup() 中的这些命令在您的 Arduino 上不起作用,请谷歌“Arduino 外部中断 INT0”。我向您展示了两种方法,一种使用 Arduino 代码,另一种使用 C。

一旦该 ISR 工作并且 DS3231 的引脚 3 连接到您选择的数字输入引脚,该引脚将以 1KHz 或每毫秒激活。完美!

// down in main program now you have access to milliseconds, you might want to start off by setting:

// When 1-second RTC changes seconds:
milliseconds = 0;  // So you can measure milliseconds since last second.

仅此而已。现在您需要学习的是如何使用 I2C 命令设置命令寄存器,然后就全部准备好了。


0
投票

C 代码示例每秒增加 1 毫秒。应该是:

{
    if (milliseconds == 999)  // roll over to zero
        milliseconds = 0;
    else
        ++milliseconds;
}
© www.soinside.com 2019 - 2024. All rights reserved.