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

时间:2019-02-03 11:28:29

标签: timer arduino real-time interrupt time-measurement

我想使用DS3231 RTC(ZS-042)对arduino uno进行精确的时间测量。我需要测量毫秒数,以至于各种RTC库的常规时间功能还不够。

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

因此,我尝试将SQW接线到arduino uno上的引脚5(这是T1输入),然后将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);
}

它将打印类似的内容:

loop
1
loop
2
loop
3

我的代码有什么问题/缺少什么?

1 个答案:

答案 0 :(得分:1)

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

如果您的模块具有DS3231SN芯片: 我最近有一个类似的问题。从Ali获得了10个DS3231SN。 将一个IC焊接到我的板上,发现了这个问题。幸运的是,我有ZIF SO16转DIP适配器,并构建了一个测试板,将其连接到示波器并对其进行了测试。根据datashet,只有10个中的4个能够在SQW引脚上产生不同的信号(1024Hz,4096Hz等)。他们还在32KHz引脚(引脚1)上生成了稳定的32768 Hz信号。

其他6个(也标记为DS3231SN)在SQW引脚上仅产生1 Hz信号,它们全部在32 kHz引脚上产生信号(一个IC产生约35 kHz),一个IC在SQW引脚上产生浮频信号(大约1500) Hz,并且无法更改)。我认为这是低质量的假冒IC。