Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Timer 如何从DS3231 RTC获得毫秒分辨率_Timer_Arduino_Real Time Clock - Fatal编程技术网

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

Timer 如何从DS3231 RTC获得毫秒分辨率,timer,arduino,real-time-clock,Timer,Arduino,Real Time Clock,如何获得精确的毫秒数 我需要计算从Arduino A向Arduino B发送数据的延迟。我尝试使用DS3231,但无法获得毫秒。如何从DS3231获得精确的毫秒数?上面的评论是正确的,但是当您有专用实时时钟时,使用millis()没有任何意义。我会给你更好的指导 任何硬件接口项目的第一件事是仔细阅读。DS3231数据表显示有五种可能的亚秒输出频率(见第13页): 32千赫 1千赫 1.024千赫 4.096千赫 8.192千赫 最后四个选项由RS1和RS2控制位的各种组合实现 例如,为了获得精确

如何获得精确的毫秒数


我需要计算从Arduino A向Arduino B发送数据的延迟。我尝试使用DS3231,但无法获得毫秒。如何从DS3231获得精确的毫秒数?

上面的评论是正确的,但是当您有专用实时时钟时,使用millis()没有任何意义。我会给你更好的指导

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

  • 32千赫
  • 1千赫
  • 1.024千赫
  • 4.096千赫
  • 8.192千赫
  • 最后四个选项由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;
    }
    
    或:


    就这些。现在,您需要学习的是如何使用I2C命令设置命令寄存器,一切都已设置。

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

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

    寄存器中只提供了第二个分辨率。它有一个32kHz的方波输出作为时钟源,但你必须在ISR中计算脉冲。该函数返回程序启动后的毫秒数,该值为无符号长;这将是相当一致的所有,但最苛刻的时间。您可以轮询RTC,直到发现滚动,此时您可以记忆
    millis()%1000
    ;然后,您可以将该偏移量添加到任何时钟读数中,并将
    ((millis()%1000)-offset)/1000
    添加到RTC值中,以获得毫秒准确的时间读数。数据表上显示的是1Hz而不是1kHz。您可能指的是。一旦你有了足够的声誉,你就可以对这种反应发表评论。虽然您的观察是正确的——代码过早地重置为0,但该示例无论如何都是错误的:正如@gre_gor所评论的,根据(第13页),设置RS1=0和RS2=0会产生1Hz的输出(即,这将是1000ms的周期,而不是1ms)。SQW没有1kHz的选择,因此无法用该芯片产生1ms时钟。
    // 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.
    
    {
        if (milliseconds == 999)  // roll over to zero
            milliseconds = 0;
        else
            ++milliseconds;
    }