В один тестирующий стенд понадобилось добавить источник автономного точного времени для логов. В коробке с неотсортированными примочками каким-то образом оказался только чип DS3231.

Это чип часов реального времени. Причем необычный RTC. Внутри него есть собственный кварцевый резонатор, а ещё датчик температуры и регистры конфигураций. В спеке написано, что за год ошибка не превысит 2 минуты. Внутри DS3231 всего-навсего 33k транзисторов. Попробуем разобраться, что это за ASIC такой и как с ним работать.

Распиновка корпуса DS3231:

https://docs.google.com/spreadsheets/d/1HU7AiqZ2NBZyWqT0Ura-tjRy0CjZiKvkRfyBWxorrsQ/edit#gid=0

Схема подключения микросхемы:

А это габариты модуля.

3 отверстия по 2 мм
3 отверстия по 2 мм

Программная часть

С точки зрения программиста чип выглядит так.

Чип программируется через 2х проводной синхронный интерфейс I2C. На шине I2C чип обладает адресом 0x68=0b1101000=104. Вот так отображается карта I2C адресов когда к шине подключен DS3231 и еще какая то eeprom.

У любого I2C устройства 2 адреса. На чтение и на запись. Для DS3231 это:

Адрес

Значение

тип

bin

hex

main

0110_1000

0x68

read

1101_0001

0xD1

write

1101_0000

0xD0

Байты передаются старшим битом вперед. У него 19 регистров конфигураций по 8 бит каждый. Всего 152 бита конфигов. Вот полная карта регистров.

Заметьте, что на год выделено всего‑навсего 8 бит. То есть можно отсчитывать только 256 лет, а если учитывать, что под десятки только 4 бита, то получается что 159 лет. Как же закодировать 2023 год? Можно в регистре year (0×06) хранить только десятки и единицы от значения годов. Столетия прибавлять или вычитать как константу.

Часы RTC DS3231 не такие уж и хорошие как написано в спеке. Из коробки при работе на улице летом за две недели работы они ушли в сторону на 20 минут вперед от точного времени из интернета. Если посмотреть осциллографом, что выдаёт пин 32kHz на выходе кварца, то там прямоугольный сигнал не 32 768 Hz а 32 776Hz.

Чтобы окончательно в этом убедиться можно выводить на улицу частоту кварца делёную на четыре. Тут становится совсем явно, что желаемая частота 8192 Hz даже ни разу не появилась.

Это значит, что часы надо подстраивать, варьируя регистр Aging Offset с адресом 10h.

Согласно спеке положительные значения Aging Offset замедляют кварцевый резонатор. Это мне как раз и надо. Попробуем поставить максимальное замедление +127. Частота кварца поделенная на 4 приняла значение из диапазона 8193....8194. Это лучше 8194...8197, но на 4...8 Hz больше нужного значения.

В часах также есть термо‑компенсация. И термо‑компенсация не происходит сама собой. Без термо компенсации часы будут работать совсем плохо и показывать каждый день на 2 минуты больше. Поэтому надо периодически брать регистр Control (0Eh) и выставлять в 1 бит пятый бит CONV.

Плюсы DS3231

1--интерфейс I2C

2--возможность посмотреть реальную частоту кварца

3--есть датчик температуры внутри

4--есть прерывания по совпадению с датой и временем

5--есть подстройка

6--есть термо компенсация

7--автоматическое просчитывание календаря на аппаратном уровне

Недостатки DS3231

1--Не хватает read-only регистра с ID микросхемы

2--Нет возможности заменить кварц так как он внутри микросхемы

3--накапливают ошибку 10 минут в неделю 

4--Много лишних NC пинов на чипе

Идеи проектов на RTC

  • Часы, будильники, календари.

  • Устройство которое напоминает что‑то сделать.

  • Телематические блоки, источник TimeStamp(ов).

  • Навигационные системы.

Несмотря на то, что сам драйвер часов реального времени это сравнительно простая микросхема однако для работы с часами реального времени надо целая куча разнообразных служебных функций для работы с датой и временем. Это сравнение дат. Вычисление порядкового номера дня в году, преобразование даты в строки разных национальный форматов, синтаксический разбор времени‑даты из строчек, проверка структуры данных времени на валидность, вычисление разницы между двумя датами в секундах и прочее и прочее. При этом для всего для этого необходимы модульные тесты.

Как инициализировать часы реального времени?

Понятно что время надо как-то синхронизировать. Тут есть минимум 4 варианта:

1--Получить точное время из GNSS модуля.

2--задавать по какому‑н интерфейсу, например по UART‑CLI вручную.

3--прошивка может также распарсить время прямо из дирректив препроцессора __TIME__ __DATE__. Таким образом время будет отличатся только на длительность компиляции.

4--Если вы живете в нормальной стране, то скорее всего в вашем городе FM радиостанции передают точное время по бинарному протоколу RDS (Radio Data System). Тогда вы можете синхронизироваться при помощи дешевых микросхем FM тюнеров, например Si4703
https://habr.com/ru/articles/687898/

Вывод

DS3231 не оправдал ожиданий. Спешит на 4...8 Hz или мне просто попался бракованный экземпляр микросхемы. Надо поискать что‑то другое. Одно из двух: чип DS3231 реально спешит, либо логический анализатор Saleae Pro бракованный.

Если Вам известны другие варианты проверенных RTC модулей со встроенным батарейным отсеком, то напишите в комментариях.

Словарь

Акроним

Расшифровка

RTC

Real-Time Clock

ASIC

application-specific integrated circuit

RST

Reset

MSB

most significant bit

SQW

square-wave output

AM

After Morning

BCD

binary-coded decimal

PM

post meridiem

INT

Interrupt

I2C

Inter-Integrated Circuit

GPS

Global Positioning System

TCXO

temperature compensated crystal oscillator

VCC

Voltage Collector Collector

DS

Dallas

Links

DS3231: высокоточная микросхема RTC

Часы на DS3231 и AVR-микроконтроллере

DS3231 – подключение часов реального времени

Контрольные вопросы:

— Почему часовые кварцы делают с частотой ровно 32 768 Hz?

Комментарии (26)


  1. Quartz32
    06.07.2023 03:37
    +5

    Если следовать логике, то первый опрос лишний. Любые ответы на второй и третий, автоматически отвечают и на первый.


    1. devprodest
      06.07.2023 03:37

      В принципе не понятен сам посыл этих опросов. Опросы ради опросов.


    1. aabzel Автор
      06.07.2023 03:37
      +2

      Это parity-вопрос для проверки четности голосования.


  1. Javian
    06.07.2023 03:37
    +1

    Заменить кварц на нормальный и проблема решена. Можно со старой мат платы выпаятьфу - там неплохие.

    Я как-то удачно купил на aliexpress 5 штук, которые оказались очень точными в сравнении с теми что у меня в домашних часах были, куда их и впаял вместо заводских.


    1. prinv
      06.07.2023 03:37
      +8

      Покажешь как заменить кварц в DS3231?


    1. Quartz32
      06.07.2023 03:37
      +2

      Заменять кварц это бесперспективное занятие, любые проекты чувствительные ко времени должны синхронизироваться по NTP или GPS.


      1. aabzel Автор
        06.07.2023 03:37

        Есть ли способ получать точное время по радио от FM станций?


        1. Javian
          06.07.2023 03:37
          +1

          В RDS есть время https://habr.com/ru/articles/303104/


          В вашем же комментарии:
          image


          1. aabzel Автор
            06.07.2023 03:37
            -1

            я проверял. В Москве никто пакет 4A не присылает.
            https://habr.com/ru/articles/687898/


            1. Javian
              06.07.2023 03:37
              +1

              Наверное за 10+ лет владельцы станций поняли, что это никому не надо. Раньше точно было, хотя бы у одной местной.
              Те, что "национальные сети" — они вещали через интернет на арендуемый местный передатчик и у них ничего не было, кроме сильно пожатого звука.


      1. da-nie
        06.07.2023 03:37
        +1

        любые проекты чувствительные ко времени должны синхронизироваться по NTP или GPS.

        Не-а. Ещё можно рубидиевый стандарт частоты поставить. Он, кстати, весьма небольшой. Но дорогой, конечно. :)


        1. aabzel Автор
          06.07.2023 03:37


          1. da-nie
            06.07.2023 03:37
            +1

            Тут здоровый блок. И неизвестно, насколько он качественный. У Мориона блоки встраиваемые как компоненты схемы и компактные, но цена, как мне когда-то говорили, в районе сотни-двух тысяч.


  1. Ivanii
    06.07.2023 03:37
    +8

    Ниразу не видел DS3231 с такой погрешностью, DS3231 наверно лучшие часы.

    DS3231M - мемс, DS3231S - кварц, он точнее и измерение температуры происходят значительно реже.


    1. makkarpov
      06.07.2023 03:37
      +1

      А я видел, причем из Чип-и-Дипа (дело было в 2020 году). Только у меня они отставали секунд на 10 в сутки.


  1. aumi13
    06.07.2023 03:37
    +5

    На шине I2C чип обладает адресом 0x68=0b1101000=104.

    програмирование для альтернативно одаренных


  1. FGV
    06.07.2023 03:37
    +4

    Кхм. А модуль то где покупали, на алиэкспресс поди? Очень похоже что попалась подделка.

    Пару ds3231m в свое время мучал (покупал в чипедипе) свои заявленные 5ппм вполне себе держали в температурном диапазоне -20...+25 гр.Ц.


    1. Ivanii
      06.07.2023 03:37
      +1

      На Али в основном перемарк б.у. и DS3231M в DS3231SN, вполне работоспособны.


  1. shadrap
    06.07.2023 03:37
    +2

    Отличная RTC , оптимальный выбор по соотношению цена, возможности, точность, энергопотребление. По своему опыту с Али можно купить как хорошо сделанные так и полный фуфел, даже не рабочий. До , если не ошибаюсь, 17го года их делал MAXIM , подразделение "аналог девайсес" и тогда они были великолепными , после их начали фигачить "разные" китайские фабрики и тут уж кому что попадет.. Незаменимы для батареечных устройств с ультра-низким потребелением , если не подключать их по типовой схеме , то можно расчитывать на 2-4мка

    Несколько раз я и партнеры натыкались на М версию маркированную как DS3231. М-использует МЕМС кварц, что сделанное плохо и дешево усугубляет положение. хотя сами чипы были маркированы SN.


  1. select26
    06.07.2023 03:37
    +8

    Ну поперло у автора: освоил чтение и копипаст из datasheet и осциллограф. Второй пост за два дня.
    Скоро, наверное, будет "Обзор электролитического конденсатора 50мкФ х 25В"


    1. Yak52
      06.07.2023 03:37
      +2

      …. и с удивлением обнаруживаем, что у него разброс емкости от +80 до -20%, по крайней мере у советских К50-16


      1. select26
        06.07.2023 03:37

        Откройте datasheet и удивитесь еще больше. Посмотрите раздел: разброс по емкости.


      1. LAutour
        06.07.2023 03:37

        У современных разброс +20..-20%, при этом +% встретить шансов гораздо меньше чем -%.


  1. andreykorol
    06.07.2023 03:37
    +1

    Не хватает read-only регистра с ID микросхемы - в драйвере приходиться предполагать, что раз "висит" на адресе 0xD0 то это именно DS3231M, а не что-либо другое


  1. da-nie
    06.07.2023 03:37
    +1

    Там на таких платах, кстати, должна стоять не батарейка, а аккумулятор (так как есть диод для её зарядки). И вот пока я этот диод не выпаял, CR2032 долго не жили.


  1. azudem
    06.07.2023 03:37
    -1

    Спасибо, что перевели даташит.