Модуль DS1302 RTC работает слишком быстро

Я использую модуль DS1302 RTC с Arduino Mega 2560 Rev 3. Я следую инструкциям на этом веб-сайт, поскольку раньше у меня не было опыта работы с модулем RTC. Вот результаты, которые я получаю.

17:15:21.835 -> Current Date / Time: 26/2/2023 17:15:44
17:15:26.830 -> Current Date / Time: 26/2/2023 17:16:13
17:15:31.856 -> Current Date / Time: 26/2/2023 17:16:42
17:15:36.853 -> Current Date / Time: 26/2/2023 17:17:11

Как видно из приведенного выше вывода, DS1302 работает в пять раз быстрее, чем в режиме реального времени (вывод за последние 30 секунд как реальное слово за последние 5 секунд). То же самое произошло, если использовать разные коды с разными библиотеками.

Означает ли это, что сам модуль RTC неисправен, или я могу изменить скорость модуля RTC с помощью кода?

//Этот код предназначен для использования с модулем RTC DS1302, он позволяет вам установить фактическое время и дату
//И вы можете визуализировать их на последовательном мониторе
//Этот код является модифицированной версией кода, представленного в библиотеке virtuabotixRTC
//Обратитесь к https://Surtrtech.com для получения дополнительной информации
 
#include <virtuabotixRTC.h> //используемая библиотека
 
//Подключение SCLK -> 6, ввод/вывод -> 7, СЕ-> 8
//Или CLK -> 6, ДАТ-> 7, сброс -> 8

virtuabotixRTC myRTC(6, 7, 8); // Если вы меняете проводку, поменяйте и здесь пины
 
void setup() {
  Serial.begin(9600);
  // Установить текущую дату и время в следующем формате:
  // секунды, минуты, часы, день недели, день месяца, месяц, год
  myRTC.setDS1302Time(15, 15, 17, 7, 26, 2, 2023); //Здесь вы пишете свое фактическое время/дату, как показано выше
  // но не забудьте "комментировать/удалить" эту функцию, как только вы закончите
  //Настройка выполняется только один раз, и модуль продолжит считать ее автоматически
}
 
void loop() {
  // Это позволяет обновлять переменные для времени или доступа к отдельным элементам.
  myRTC.updateTime();
 
  // Запускаем печать элементов как отдельных
  Serial.print("Current Date / Time: ");
  Serial.print(myRTC.dayofmonth); //Вы можете переключаться между днем и месяцем, если используете американскую систему
  Serial.print("/");
  Serial.print(myRTC.month);
  Serial.print("/");
  Serial.print(myRTC.year);
  Serial.print(" ");
  Serial.print(myRTC.hours);
  Serial.print(":");
  Serial.print(myRTC.minutes);
  Serial.print(":");
  Serial.println(myRTC.seconds);
 
  // Задержка, чтобы программа не печатала без остановки
  delay(5000);
}

, 👍1

Обсуждение

На модуле часов RTC есть кристалл (металлический цилиндр). Не могли бы вы сообщить, что на нем написано?, @Nick Gammon

Резервная батарея установлена?, @Nick Gammon

Кристалл 32,768 кГц и я думаю, что он имеет удельную емкость нагрузки 6 пФ. Была установлена резервная батарея, и она также была подключена к шине 5V от Arduino., @Leo Liang

Если я изменю «задержку (5000)» на «задержку (1000)», она все равно будет работать в 5 раз быстрее., @Leo Liang

[Этот ответ по обмену электрическим стеком](https://electronics.stackexchange.com/questions/323566/32-khz-crystal-not-operating-as-expected) охватывает проблемы, теорию проектирования и тестирования таких кварцевых генераторов. Вероятно, это больше, чем вы хотите знать. Эти вещи дешевые. Менее 10 долларов от авторитетных поставщиков и лишь несколько из сомнительных источников. Если вы купили его у таких компаний, как Adafruit, они могут заменить его. Если я покупаю его из сомнительного источника, я обычно покупаю несколько на случай, если один из них не работает., @st2000


1 ответ


1

Сегодня я столкнулся с точно такой же проблемой (используя Arduino Uno/atmega328) и такой модуль/плату: https:/ /surtrtech.com/2018/01/27/how-to-simply-use-ds1302-rtc-module-with-arduino-board-and-lcd-screen/ При считывании времени после установки оно работает в 5-6 раз быстрее.

Я нашел здесь подсказку относительно точности: https://forum.arduino.cc/t/ds1302-drift/327796/7

Тем не менее, они говорили о 2-минутном дрейфе каждые 24 часа, что, безусловно, является совершенно другим. Один комментарий заключался в том, чтобы обратить особое внимание на землю, так как шум там мог быть интерпретирован как дополнительные сигналы часов и ускорять ход часов. Так что я поигрался с заземлением на плате и отключил все остальное, подключенное до сих пор к контактам платы Arduino, но это ничего не изменило, все равно в 5-6 раз быстрее.

Я также играл с батареей CR2032 и без нее, а также с входными напряжениями 5 В и 3,3 В на входной контакт VCC платы часов, и... внезапно... все заработало нормально. Я думаю, что при входном напряжении 3,3 В на VCC и без батареи у него изначально было «нормальное» напряжение. точность, но теперь я снова могу подключить его к входу 5 В, и он по-прежнему работает нормально ... Я также некоторое время держал его отключенным от внешнего источника питания (работающим только от батареи), затем снова подключил его к ноутбуку и прочитал значения даты/времени, и все равно он работал нормально.

Это совершенно странно.

С уважением, Дэн

,

Хотя это хороший ответ в том смысле, что он показывает способ, как выйти из проблемы, не могли бы вы исследовать этот эффект систематически? Одна из мыслимых моделей может заключаться в том, что кварцевый генератор начинает работать на некоторой обертональной частоте при неправильном питании. Если вы это сделаете, пожалуйста, поделитесь результатами, [редактировав] ваш ответ., @the busybee