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页):
的中断!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;
}