Прямоугольный сигнал RTC

rtc

У меня есть модуль часов реального времени DS3231, и я хотел бы использовать выход прямоугольной волны.

Интересно, как мне установить частоту импульса?

Какова (временная) продолжительность импульса?

ОБНОВЛЕННЫЙ ВОПРОС

Чтобы использовать DS3231 как прерывание 1PPS, я хочу использовать выход Square Wave. Вот как я подключил его к Arduino.

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

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

void setup () {
   Serial.begin(9600);
   #ifdef AVR
      Wire.begin();
   #else
      Wire1.begin(); 
   #endif
   rtc.begin();

  if (! rtc.isrunning()) {
     Serial.println("RTC is NOT running!");
     rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    }  
  }

void loop () {

   DateTime now = rtc.now();
   Serial.print(now.year(), DEC);
   // и т. д
   }

(DS3231 отлично работает с библиотекой DS1307)

В этом случае светодиод просто мерцал, поэтому я подумал, что частота по умолчанию SQW должна быть больше 1 Гц. Я немного погуглил и понял, что мне нужно изменить некоторые регистры. Поэтому я нашел этот фрагмент кода, который я вызвал из функции setup(), но безуспешно, светодиод все еще мерцает.

void set1Hz() {
   // Частота хранится в регистре 0x0e в битах 3 и 4
   Wire.beginTransmission(0x68);
   Wire.write(0x0e);
   Wire.endTransmission();
   Wire.requestFrom(0x68, 1);
   uint8_t register0E = Wire.read();

   // очистить биты 3 и 4 для 1 Гц
   register0E &= ~(1 << 3);
   register0E &= ~(1 << 4);

   // вернуть значение регистра обратно
   Wire.beginTransmission(0x68);
   Wire.write(0x0e);
   Wire.write(register0E);
   Wire.endTransmission();
 }

Поскольку теперь я имею квалификацию для низкоуровневого программирования, любые предложения по изменению регистров будут оценены по достоинству.

, 👍1

Обсуждение

Что говорится в техническом описании?, @Roger Rowland

[техническое описание](http://datasheets.maximintegrated.com/en/ds/DS3231.pdf) страница 13., @Gerben


3 ответа


Лучший ответ:

3

Хотя это и необычно, когда кто-то отвечает на свой собственный вопрос, я покопался поглубже и смог решить проблему. Поэтому я хотел бы упомянуть один или два пункта, чтобы помочь тому, кто может столкнуться с той же проблемой.

  • Я использовал библиотеку Джека Кристенсена https://github.com/JChristensen/DS3232RTC, но мне пришлось обновить библиотеку Time.h.

  • В setup() я добавляю эту строку, чтобы включить выход SQW и установить его на 1PPS.

    RTC.squareWave(SQWAVE_1_HZ);
    

    Другие варианты: SQWAVE_1024_Hz, SQWAVE_4096_Hz, SQWAVE_8192_Hz и SQWAVE_NONE

  • Используя светодиод и резистор (390 Ом), как показано на рисунке выше, он работает как делитель напряжения. В этом случае напряжение между выходом SQW и землей не превышало 2,0 В. Таким образом, кто-то должен быть осторожен, если хочет иметь светодиодный индикатор и хочет использовать выход SQW в качестве прерывания.

,

0

с библиотекой DS1307 Tiny RTC:

"rtc.writeSqwPinMode(0x10);" в цикле настройки...

устанавливает выход DS на 1 Гц, прямоугольный сигнал

Это не совсем сигнал 1PPS, который обычно представляет собой узкий импульс,

но этот сигнал с 50%-ным рабочим циклом будет работать как 1-секундное прерывание.

,

0

Выход SQWV имеет только низкий уровень, это выход с открытым стоком.

Подключите следующим образом: 5 В к аноду светодиода, катод светодиода к резистору ограничения тока, другая ножка резистора к выводу SQWV.

Проверьте допустимую нагрузку на вывод. 10 кОм сделают светодиод очень тусклым (если вообще будет виден). Попробуйте 1 кОм.

,