作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何获取精确的毫秒数?
我需要计算从 Arduino A 向 Arduino B 发送数据的延迟。我尝试使用 DS3231,但无法获得毫秒数。我应该怎么做才能从 DS3231 获得准确的毫秒数?
最佳答案
上面的评论是正确的,但是当你有一个专用的实时时钟时使用 millis() 是没有意义的。我会为您提供更好的说明。
在任何硬件接口(interface)项目中,首先要仔细阅读 datasheet . DS3231 数据表显示亚秒级输出有五种可能的频率(参见第 13 页):
这最后四个选项是通过 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 命令设置命令寄存器,一切就绪。
关于timer - 如何从 DS3231 RTC 获得毫秒分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44644383/
我是一名优秀的程序员,十分优秀!