0

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

在谷歌搜索和询问之后,我发现我需要使用 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);
}

这将打印如下内容:

loop
1
loop
2
loop
3

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

4

1 回答 1

1

如果您的模块有 DS3231M 芯片,那么根据数据表,此修改只能在 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。

于 2019-04-02T09:21:53.400 回答