DS3231 RTC 模块上的 SQW 信号卡在 1Hz(需要 1024Hz)
SQW signal on DS3231 RTC module is stuck at 1Hz (need 1024Hz)
我想使用 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
我的代码中的 wrong/missing 是什么?
如果您的模块有 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脚上只给出了1Hz的信号,它们都在32kHz脚上产生了信号(一个IC产生了大约35kHz),一个IC在SQW脚上产生了浮动频率信号(大约 1500 Hz,并且无法更改)。我认为这是低质量的假冒 IC。
我想使用 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
我的代码中的 wrong/missing 是什么?
如果您的模块有 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脚上只给出了1Hz的信号,它们都在32kHz脚上产生了信号(一个IC产生了大约35kHz),一个IC在SQW脚上产生了浮动频率信号(大约 1500 Hz,并且无法更改)。我认为这是低质量的假冒 IC。