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

时间:2017-06-20 05:18:40

标签: timer arduino real-time-clock

如何获得准确的毫秒数?

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

2 个答案:

答案 0 :(得分:1)

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

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

  1. 32 KHz
  2. 1 KHz
  3. 1.024 KHz
  4. 4.096 KHz
  5. 8.192 KHz
  6. 最后四个选项是通过RS1和RS2控制位的各种组合实现的。

    因此,例如,要获得精确的毫秒数,您可以选择目标选项2,1KHz。设置RS1 = 0和RS2 = 0(参见您提供的数据表的第13页)和INTCN = 0(第9页)。然后,您需要一个ISR来捕获从设备的!INT/SQW引脚到Arduino上的数字输入引脚的中断。

    volatile uint_16t 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;
    }
    

    OR:

    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,则谷歌&#39; Arduino外部中断INT0&#39;。我向您展示了两种方式,一种是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命令设置命令寄存器,并且您已完成所有设置。

答案 1 :(得分:0)

C代码示例每秒获得1ms的增益。应该是:

{
    if (milliseconds == 999)  // roll over to zero
        milliseconds = 0;
    else
        ++milliseconds;
}