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模块上的SQW信号卡在1Hz(需要1024Hz)_Timer_Arduino_Real Time_Interrupt_Time Measurement - Fatal编程技术网

Timer DS3231 RTC模块上的SQW信号卡在1Hz(需要1024Hz)

Timer DS3231 RTC模块上的SQW信号卡在1Hz(需要1024Hz),timer,arduino,real-time,interrupt,time-measurement,Timer,Arduino,Real Time,Interrupt,Time Measurement,我想使用DS3231 RTC(ZS-042)对我的arduino uno进行精确的时间测量。我需要测量毫秒,因为各种RTC LIB的常规时间函数不够 在谷歌搜索和询问之后,我发现我需要使用DS3231的SQW输出,并将其连接到中断或计时器。当使用适当的速率时,我将能够执行时间测量 因此,我尝试将SQW连接到我的arduino uno(即T1输入)上的引脚5,并将T1配置为使用外部电源。我使用了一些RTC库来启用SQW输出,并将其设置为1024hz。 然后我连接了ISR来计算滴答声和溢出 所有这些

我想使用DS3231 RTC(ZS-042)对我的arduino uno进行精确的时间测量。我需要测量毫秒,因为各种RTC LIB的常规时间函数不够

在谷歌搜索和询问之后,我发现我需要使用DS3231的SQW输出,并将其连接到中断或计时器。当使用适当的速率时,我将能够执行时间测量

因此,我尝试将SQW连接到我的arduino uno(即T1输入)上的引脚5,并将T1配置为使用外部电源。我使用了一些RTC库来启用SQW输出,并将其设置为1024hz。 然后我连接了ISR来计算滴答声和溢出

所有这些似乎基本上都能工作,但无论我做什么,SQW信号似乎都停留在1hz

这是我的密码:

#include <Wire.h>       //I2C library
#include <RtcDS3231.h>  //RTC library

RtcDS3231 <TwoWire> rtcObject(Wire);

static volatile unsigned long overflows = 0;


void setup() {
  Serial.begin(9600);

  rtcObject.Begin(); //Starts I2C
  rtcObject.SetSquareWavePin(DS3231SquareWavePin_ModeClock); //Sets pin mode
  rtcObject.SetSquareWavePinClockFrequency(DS3231SquareWaveClock_1kHz); //Sets frequency

  noInterrupts(); // disable all interrupts
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;

  OCR1A = 32000;
  TCCR1B |= (1 << WGM12); // CTC mode
  TCCR1B |= (1 << CS11); // external source / no prescaler
  TCCR1B |= (1 << CS12); // external source / no prescaler

//  TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
  TIMSK1 |= (1 << TOIE1);   // enable timer overflow interrupt
  interrupts(); // enable all interrupts
}

ISR(TIMER1_OVF_vect)
{
  TCNT1 = 0;
  overflows++;
}


void loop() {
  delay(1024);
  Serial.println("loop");
  Serial.println(TCNT1);
}

我的代码中有什么错误/缺失?

如果您的模块有DS3231M芯片,那么根据datasheed,此修改只能在INT/SQW引脚(3)上生成1Hz信号,在32kHz引脚(1)上生成32768Hz信号。我有几个DS3231M并检查过

如果您的模块具有DS3231SN芯片: 我最近也有类似的问题。从阿里那里得到了10台DS3231SN。 将一个IC焊接到我的电路板上,发现了这个问题。幸运的是,我有ZIF SO16的DIP适配器,并建立了一个测试板,连接到示波器,并测试了所有这些。根据数据集,10台中只有4台能够在SQW引脚上产生不同的信号(1024Hz、4096Hz等)。他们还在32KHz引脚(引脚1)上产生稳定的32768 Hz信号


其他6个(也标记为DS3231SN)在SQW引脚上仅给出1 Hz信号,所有这些都在32 kHz引脚上产生信号(一个IC产生约35 kHz),一个IC在SQW引脚上产生浮动频率信号(约1500 Hz,无法更改)。我认为这是低质量的假IC

你想测量什么?为什么Arduino的毫秒()或微秒()不够好?与精密时钟相比,在更长的时间内,测量不够精确。你想以更高的精度测量长时间?我想以毫秒精度测量<1小时的持续时间。使用内置时钟与实际时钟的测量值相差约0.3分钟1分钟18秒1分钟?那不可能是真的。18微秒?谢谢你的提示。与此同时,我也能找到相同的答案。事实上,我有一个芯片绑定到1Hz,而其他模块能够提供1KHz(代码相同)。
loop
1
loop
2
loop
3