首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从DS3231实时时钟获取毫秒级分辨率

如何从DS3231实时时钟获取毫秒级分辨率
EN

Stack Overflow用户
提问于 2017-06-20 13:18:40
回答 2查看 13.6K关注 0票数 3

如何获取精确的毫秒数?

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

EN

回答 2

Stack Overflow用户

发布于 2017-06-20 18:36:47

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

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

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

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

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

代码语言:javascript
复制
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;
}

或者:

代码语言:javascript
复制
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上不起作用,google 'Arduino外部中断INT0‘。我已经向您展示了两种方法,一种使用Arduino代码,另一种使用C。

一旦您的ISR和DS3231的pin3连接到您选择的数字输入引脚,该引脚将以1 1KHz或每毫秒激活。太棒了!

代码语言:javascript
复制
// 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
EN

Stack Overflow用户

发布于 2018-07-23 00:25:34

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

代码语言:javascript
复制
{
    if (milliseconds == 999)  // roll over to zero
        milliseconds = 0;
    else
        ++milliseconds;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44644383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档