Сигнал SQW на модуле DS3231 RTC застревает на частоте 1 Гц (необходимо 1024 Гц) - PullRequest
0 голосов
/ 03 февраля 2019

Я хочу использовать DS3231 RTC (ZS-042) для точного измерения времени на моем arduino uno.Мне нужно измерить миллисекунды, чтобы обычные функции времени различных RTC-библиотек не были достаточны.

После поиска и поиска я обнаружил, что мне нужно использовать выход SQW DS3231 и подключить его к прерыванию.или таймер.При использовании соответствующей скорости я мог бы выполнять измерения времени.

Поэтому я попытался подключить SQW к выводу 5 на моем arduino uno (который является входом T1) и настроить T1 для использования внешнего источника.,Я использовал RTC-библиотеку, чтобы включить вывод SQW и установить его на 1024 Гц.Затем я подключил ISR для подсчета тиков и переполнений.

Все это, похоже, работает в основном , однако сигнал SQW застревает на частоте 1 Гц, независимо от того, что я делаю.

Вот мой код:

#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 голосов
/ 02 апреля 2019

Если ваш модуль имеет микросхему DS3231M, то в соответствии с даташидом эта модификация может генерировать только сигнал 1 Гц на выводе INT / SQW (3) и 32768 Гц на выводе 32 кГц (1).У меня есть несколько DS3231M и я проверил его.

Если у вашего модуля есть микросхема DS3231SN: у меня недавно была похожая проблема.Получил 10 шт. DS3231SN от али.Припаял одну микросхему к моей плате и обнаружил эту проблему.К счастью, у меня был адаптер ZIF SO16 к DIP, я построил тестовую плату, подключил ее к осциллографу и проверил все.Только 4 шт. Из 10 смогли генерировать различные сигналы (1024 Гц, 4096 Гц и т. Д.) На выводе SQW в соответствии с даташетом.Также они генерировали стабильный сигнал 32768 Гц на выводе 32 кГц (вывод 1).

Другие 6 (также обозначенные как DS3231SN) давали сигнал только 1 Гц на выводе SQW, все они генерировали сигнал на выводе 32 кГц (одна микросхема).генерируется около 35 кГц), одна микросхема генерирует сигнал с плавающей частотой на выводе SQW (около 1500 Гц, и его нельзя изменить).Я думаю, что это поддельные микросхемы низкого качества.

...