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



Часы реального времени DS3231
Микросхема DS3231 представляет собой высокоточные часы реального времени RTC, которая обладает встроенным кварцевым генератором с температурной компенсацией, благодаря чему уход времени составляет всего ±2 минуты за год. Дополнительно реализована функция будильника, также имеется выход прерываний. Часы можно приобрести в виде готового модуля под Arduino с элементами обвязки и отсеком для батареи.

Я заказывал модуль здесь. Схема представлена на картинке ниже:
DS3231 схема модуля
Микросхема использует широко распространенный интерфейс передачи данных I2C. Поддерживается стандартная (100 кГц) и высокая (400 кГц) скорость передачи данных. Адрес микросхемы (7 бит) на шине I2C равен 1101000. Дополнительно на модуле установлена память I2C (24C32), на схеме не изображена.

Режимы электропитания

Напряжение питания микросхемы может находиться в пределах 2,3…5,5В, имеются две линии питания, для внешнего источника (линия Vcc), а также для батареи (Vbat). Напряжение внешнего источника постоянно отслеживается, при падении ниже порога Vpf=2,5В, происходит переключение на линию батареи. В следующей таблице представлены условия переключения между линиями питания:

Комбинации уровней напряжения Активная линия питания
Vcc < Vpf, Vcc < Vbat Vbat
Vcc < Vpf, Vcc > Vbat Vcc
Vcc > Vpf, Vcc < Vbat Vcc
Vcc > Vpf, Vcc > Vbat Vcc

Точность хода часов поддерживается за счет отслеживания  температуры окружающей среды. В микросхеме запускается внутренняя процедура корректировки частоты тактового генератора, величина корректировки определяется по специальному графику зависимости частоты от температуры. Процедура запускается после подачи питания, а затем выполняется каждые 64 секунды.

В целях сохранения заряда, при подключении батареи (подача напряжения на линию Vbat), тактовый генератор не запускается до тех пор, пока напряжение на линии Vcc не превысит пороговое значение Vpf, или не будет передан корректный адрес микросхемы по интерфейсу I2C. Время запуска тактового генератора составляет менее одной секунды. Примерно через 2 секунды после подачи питания (Vcc), или получения адреса по интерфейсу I2C, запускается процедура коррекции частоты. После того как тактовый генератор запустился, он продолжает функционировать до тех пор, пока присутствует напряжение Vcc или Vbat. При первом включении регистры даты и времени сброшены, и имеют следующие значения 01/01/ 00 — 01 — 00/00/00 (день/месяц/год/ — день недели — час/минуты/секунды).

Ток потребления при питании от батареи напряжением 3,63В, составляет 3 мкА, при отсутствии передачи данных по интерфейсу I2C. Максимальный ток потребления может достигать 300 мкА, в случае использования внешнего источника питания напряжением 5,5В, и высокой скорости передачи данных I2C.

Функция внешнего сброса

Линия RST может использоваться для внешнего сброса, а также обладает функцией оповещения о низком уровне напряжения. Линия подтянута к высокому логическому уровню через внутренний резистор, внешняя подтяжка не требуется. Для использования функции внешнего сброса, между линией RST и общим проводом можно подключить кнопку, в микросхеме реализована защита от дребезга контактов. Функция оповещения активируется при снижении напряжения питания Vcc ниже порогового значения Vpf, при этом на линии RST устанавливается низкий логический уровень.

Описание регистров DS3231

Ниже в таблице представлен перечень регистров часов реального времени:

Адрес D7 D6 D5 D4 D3 D2 D1 D0 Функция Пределы
0x00 0 10 секунд Секунды Секунды 00-59
0x01 0 10 минут Минуты Минуты 00-59
0x02 0 12/24 AM/PM 10 часов Час Часы 1-12 +  AM/PM или 00-23
10 часов
0x03 0 0 0 0 0 День День недели 1-7
0x04 0 0 10 число Число Дата 01-31
0x05 Century 0 0 10 месяц Месяц Месяцы/век 01-12 + Век
0x06 10 лет Год Годы 00-99
0x07 A1M1 10 секунд Секунды Секунды, 1-й будильник 00-59
0x08 A1M2 10 минут Минуты Минуты, 1-й будильник 00-59
0x09 A1M3 12/24 AM/PM 10 часов Час Часы, 1-й будильник 1-12 +  AM/PM или 00-23
10 часов
0x0A A1M4 DY/DT 10 число День День недели, 1-й будильник 1-7
Число Дата, 1-й будильник 01-31
0x0B A2M2 10 минут Минуты Минуты, 2-й будильник 00-59
0x0C A2M3 12/24 AM/PM 10 часов Час Часы, 2-й будильник 1-12 +  AM/PM или 00-23
10 часов
0x0D A2M4 DY/DT 10 число День День недели, 2-й будильник 1-7
Число Дата, 2-й будильник 01-31
0x0E EOSC BBSQW CONV RS2 RS1 INTCN A2IE A1IE Регистр настроек (Control)
0x0F OSF 0 0 0 EN32kHz BSY A2F A1F Регистр статуса (Status)
0x10 SIGN DATA DATA DATA DATA DATA DATA DATA Регистр подстройки частоты (Aging Offset)
0x11 SIGN DATA DATA DATA DATA DATA DATA DATA Регистр температуры, старший байт
0x12 DATA DATA 0 0 0 0 0 0 Регистр температуры, младший байт

Информация о времени хранится в двоично-десятичном формате, то есть каждый разряд десятичного числа (от 0 до 9) представляется группой из 4-х бит. В случае одного байта, младший полубайт отсчитывает единицы, старший десятки и т. д. Счет времени осуществляется в регистрах с адресами 0x00-0x06, для отсчета часов можно выбрать режим 12-ти или 24-х часов. Установка 6-го бита регистра часов (адрес 0x02), задает 12-ти часовой режим, в котором 5-й бит  указывает на время суток, значению 1 соответствует время после полудня (PM), значению 0 до полудня (AM). Нулевое значение 6-го бита соответствует 24-х часовому режиму, здесь 5-й бит участвует в счете часов (значения 20-23).

Регистр дня недели инкрементируется в полночь, счет идет от 0 до 7, регистр месяцев (адрес 0x05) содержит бит века Century (7-й бит), который переключается при переполнении регистра счета лет (адрес 0x06), от 99 к 00.

В микросхеме DS3231 реализовано два будильника, 1-й будильник настраивается с помощью регистров с адресами 0x07-0x0A, 2-й будильник регистрами 0x0B-0x0D. Битами A1Mx и A2Mx можно настроить различные режимы для будильников, установка бита исключает соответствующий регистр из операции сравнения. Ниже в таблицах приведены комбинации битов для разных режимов будильника:

Будильник 1
DY/DT A1M4 A1M3 A1M2 A1M1 Режим будильника
X 1 1 1 1 Сигнал каждую секунду
X 1 1 1 0 Сигнал при совпадении секунд
X 1 1 0 0 Сигнал при совпадении минут, секунд
X 1 0 0 0 Сигнал при совпадении часа, минут, секунд
0 0 0 0 0 Сигнал при совпадении даты, часа, минут, секунд
1 0 0 0 0 Сигнал при совпадении дня недели, часа, минут, секунд
Будильник 2
DY/DT A2M4 A2M3 A2M2 Режим будильника
X 1 1 1 Сигнал каждую минуту (при значении 00 секунд)
X 1 1 0 Сигнал при совпадении минут
X 1 0 0 Сигнал при совпадении часа, минут
0 0 0 0 Сигнал при совпадении даты, часа, минут
1 0 0 0 Сигнал при совпадении дня недели, часа, минут

Комбинации битов не указанные в таблицах, приводят к некорректному функционированию будильников. Если бит DY/DT сброшен, то для будильника отслеживается совпадение даты (день месяца), при установке бита DY/DT, проверяется совпадение дня недели.

Большинство функций настраиваются в регистре Control. Бит EOSC управляет запуском тактового генератора, сброс бита запускает генератор. Установка бита останавливает генератор, только для режима питания от батареи (Vbat). При питании от внешнего источника (Vcc), генератор всегда запущен независимо от состояния бита EOSC. После включения, значение бита по умолчанию равно 0.

Установка бита BBSQW разрешает функционирование выхода INT/SQW (3-й вывод) в режиме питания от батареи, при отсутствии внешнего питания. При нулевом значении бита, выход INT/SQW переходит в 3-е состояние (деактивируется), если напряжение внешнего источника Vcc падает ниже порогового значения Vpf. После подачи питания, значение бита по умолчанию равно 0.

Бит CONV отвечает за принудительное измерение температуры, установка бита запускает процесс преобразования, во время которого также выполняется корректировка частоты тактового генератора, результат измерения находится в регистрах с адресами 0x11, 0x12. Запуск возможен только в случае окончания предыдущего преобразования, перед запуском необходимо проверить флаг занятости BSY. Принудительное преобразование температуры не влияет на внутренний 64-х секундный цикл корректировки частоты. Установка бита CONV не влияет на флаг BSY в течение 2 мс. Биты CONV и BSY сбрасываются автоматически после завершения преобразования.

Биты RS2, RS1 устанавливают частоту прямоугольных импульсов (меандр) на выходе INT/SQW. По умолчанию, при включении биты устанавливаются в 1. Ниже в таблице представлены возможные комбинации битов:

RS2 RS1 Частота прямоугольных импульсов на выходе INT/SQW
0 0 1 Гц
0 1 1,024 кГц
1 0 4,096 кГц
1 1 8,192 кГц

Бит INTCN управляет выходом INT/SQW. Если бит сброшен, на выходе появляются прямоугольные импульсы (меандр), частота которых задается битами RS2, RS1. При установке бита INTCN, выход используется для генерации прерываний по сигналу будильника. По умолчанию, значение бита равно 1. Тип выхода INT/SQW — открытый сток, соответственно необходима подтяжка через резистор к высокому логическому уровню, активный уровень – низкий.

Установка битов A1IE, A2IE разрешает прерывания по сигналу 1-го и 2-го будильника соответственно. Сброс битов, запрещает прерывания. По умолчанию значение равно 0.

Регистр Status содержит флаги событий, и управляет выходом 32 kHz. Флаг OSF отражает состояние тактового генератора, значение 1, означает, что генератор остановлен, это событие может произойти в следующих случаях:

  • В первое время после подачи питания
  • Напряжение батареи или внешнего источника недостаточно для работы тактового генератора
  • Генератор выключен установкой бита EOSC в режиме питания от батареи
  • Внешние факторы, влияющие на кварцевый генератор (шум, утечка и т.д.)

После установки значение бита не меняется, необходимо сбросить бит вручную.

Установка бита EN32kHz разрешает генерирование прямоугольных импульсов (меандр) на выходе 32kHz (1-й вывод), частота импульсов фиксирована и равна 32,768 кГц. Сброс бита отключает данную функцию и переводит выход в 3-е состояние (с высоким входным сопротивлением). По умолчанию значение бита равно 1,  после подачи питания на выходе появляются импульсы. Тип выхода 32kHz открытый сток, поэтому требуется подтяжка к высокому логическому уровню.

Флаг занятости BSY устанавливается во время процесса преобразования температуры и корректировки частоты тактового генератора. Флаг сбрасывается после завершения преобразования.

Флаги будильников A1F, A2F устанавливаются при совпадении значений регистров счета времени и регистров будильника. Если разрешены прерывания по сигналу будильников A1IE, A2IE, а также назначен выход прерывания (установлен бит INTCN), то на выходе INT/SQW появляется сигнал прерывания (переход от высокого к низкому логическому уровню). Флаги необходимо сбросить вручную, записав значение 0.

Регистр Aging Offset предназначен для подстройки частоты тактового генератора. Значение регистра добавляется к частоте генератора во время выполнения внутренней процедуры корректировки, если зафиксировано изменение температуры, а также при запуске преобразования температуры битом CONV. Величина смещения знаковая, то есть положительные значения (1-127) уменьшают частоту, отрицательные (128-255) увеличивают. Для одинакового смещения, изменение частоты будет различным в зависимости от температуры. При температуре +25°C, изменение частоты составит 0,1 ppm/LSB.

Текущее значение температуры хранится в регистрах с адресами 0x11 и 0x12, старший и младший байт соответственно, значение температуры в регистрах периодически обновляется.  Установлено левое выравнивание, разрешение составляет 10 бит или 0,25°C/LSB, то есть в старшем байте находится целая часть температуры, а 6, 7-й биты в младшем регистры составляют дробную часть. В старшем байте 7-й бит указывает знак температуры, например, значению 00011011 01 соответствует температура +27,25 °C, значению 11111110 10 температура -2,5 °C.

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

Подключение DS3231 к микроконтроллеру

Я подключил часы к микроконтроллеру PIC16F628A, для отображения времени использовал цифровое табло из семисегментных индикаторов на драйвере MAX7219. Схема подключения представлена ниже:
DS3231 схема подключения
После подачи питания на индикаторах высвечиваются знаки тире (– – – – – –), далее выполняется инициализация часов, значение времени появляется на индикаторах с задержкой в 1 секунду, которая требуется для запуска тактового генератора часов. На индикаторы выводится значение часов, минут и секунд, разделенных десятичной точкой, формат времени 24-х часовой. Кнопкой SB1 “Индикация” можно сменить формат отображения, где на индикаторы будет выводиться температура, а также значение часов и минут, разделенных десятичной точкой, которая мигает с частотой 2 Гц. Температура отображается без дробной части, в программе считывается только старший байт хранения температуры по адресу 0x11.

Значение времени считывается из часов по прерыванию на линии SQW/INT, которая управляется сигналом 1-го будильника, в процессе инициализации часов будильник настраивается на ежесекундный сигнал. Светодиод HL1 служит в качестве индикатора и вспыхивает по сигналу прерывания каждую секунду. Светодиод HL2 загорается в случае ошибки передачи данных по интерфейсу I2C.

Дополнительно добавил в программу возможность настройки часов кнопками SB2 “Настройка”, SB3 “Установка”. Вход в режим настройки производится нажатием кнопки SB2, на индикаторах высвечивается 00 часов, и знаки тире вместо минут и секунд (00 – – – –). Кнопкой SB3 задается значение часов (инкремент при каждом нажатии), далее нажатием кнопки SB2 осуществляется переход на редактирование минут, вместо тире высветится 00 минут. Кнопкой SB3 также задается необходимое значение и так далее. После редактирования секунд и нажатия кнопки SB2, время в часах перезаписывается, на индикаторах отображается обновленное время.

Неполный код программы приведен ниже (полную версию можно скачать в конце статьи):

Интерфейс передачи данных I2C реализован программно. Инициализация часов состоит из следующих шагов:

  1. Настройка 1-го будильника на ежесекундный сигнал, то есть запись двоичного числа 10000000 в регистры с адресами 0x07-0x0A, тем самым выполняется установка битов A1M4-A1M
  2. Настройка регистра Control, где запрещаем функционирование вывода INT/SQW для режима питания от батареи. Выход INT/SQW задействуем для генерации прерываний по будильнику, и разрешаем прерывание по 1-му будильнику.
  3. Настройка регистра Status, где запрещаем генерирование импульсов на выходе EN32kHz, и сбрасываем флаги прерываний обоих будильников.

Далее опрашиваем линию INT/SQW, если уровень сменился на низкий, то произошло прерывание по сигналу будильника, считываем регистры отсчета времени с адресами 0x00-0x02 (секунды, минуты, час) и выводим на индикаторы. После чего снова сбрасываем флаги прерываний будильников, далее цикл повторяется.

Заключение

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

DS3231 внешний вид модуляDS3231 макетная плата

Ниже на видеоролике можно увидеть функционирование схемы с часами DS3231, а также процесс установки времени:

Прошивка МК и исходник для подключения часов

Последние записи:

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

  1. Добрый день. Как обычно, замечательная статья.
    Я правильно понял, что данный чип, как бонус, можно использовать как термометр?

    • Здравствуйте, как термометр использовать можно, если не требуется высокая точность, по даташиту погрешность может составлять ±3 градуса Цельсия

  2. Здравствуйте.
    Подскажите как при индикации температуры отобразить знак градуса,
    и устанавливать будильник.
    На вашем видео модуль 3231 работает без батарейки, у меня заработал
    только с батарейкой, пробовал с 2 модулями.

    • Здравствуйте, применительно к индикатору на MAX7219 для вывода значка градуса нужно отключить декодирование индикатора на котором будет отображаться значок, далее записать байт в этот индикатор, где необходимо зажечь сегменты A, B, F, G. В этой статье есть ссылка на статью про драйвер и его описание.

      В прошивке приведенной в этой статье будильник задействован на ежесекундный сигнал, можете посмотреть. Для установки будильника сначала надо настроить биты A1M4, A1M3, A1M2, A1M1, и одновременно записать значения секунд, минут, часов и т.д в регистры будильника. Установить бит INTCN, для использования выхода INT/SQW в качестве прерывания от будильника, Сбросить флаг прерывания будильника A1F, разрешить прерывания от 1-го будильника установкой бита A1IE. Далее при срабатывании будильника записать новое значение будильника и сбросить флаг прерывания A1F.

      Модуль должен работать и без батарейки, проверьте напряжения питания на 2-ом выводе микросхемы DS3231, возможно напряжение ниже порогового значения 2,5В.

  3. Здравствуйте, вопрос наверное не совсем в тему, но все же. Может подскажите возможно ли реализовать саму идею?
    Суть в следующем: в большинстве бытовой техники сейчас встроенные часы. Как пример: духовка, микроволновка, печки, холодильник и т.д.. Но случаются ситуации с пропаданием электричества и в этом случае часы приходится выставлять с нуля. На многих устройствах это те еще танцы с бубном. Да и если их более трех в доме, то это тот еще ритуал.
    Решить вопрос с бесперебойником, тоже не всегда возможно. Я так понимаю микроволновку к бесперебойнику нельзя подключать, да и печка в случае пропадания электричества в момент работы тут же его усадит в 0. Так что этот вариант отбрасываем.
    Остается один более-менее нормальный вариант, это получение сигнала точного времени с интернет сервиса по Wi-Fi (посредством ESP8266). То есть после пропадания электричества и его восстановления устройство коннектится через роутер к инету и устанавливает время.
    Правда здесь видио сложность будет в другом. Как правило эти часы многофункциональны (вернее табло). На нем же и может быть в определенный момент и оставшееся время, и истекшее время от начала чего-либо ну и так далее.
    Собственно вопрос, это реально модернизировать сохранив прежний функционал?

    • Здравствуйте, а прежний функционал и не изменится, чтобы его изменить надо влезать в прошивку микроконтроллера который установлен в микроволновке, стиралке. Я так понимаю настройка времени будет производиться через кнопки, ну то есть ESP8266 будет через транзисторы коммутировать кнопки настройки времени. После факта пропадания напряжения, и дальнейшего восстановления, будет производиться вход в меню настройки времени и его обновление. Думаю что это можно реализовать.

      • А в автомате это как то можно реализовать? Без кнопок? Или я не так понял Вас?
        Скажем по событию подачи питания на ту же плату Wi-Fi.
        То есть: напряжение есть все работает как положено. Потом оно пропало. Тут все ясно. Нет напряжения — нет действия. Дальше оно появилось. Плата само собой запускается и конектится к роутеру, получает данные и выдает их в бытовое устройство. Тут я так понимаю в любом случае нужна ардуинка.

        • В автомате можно при появлении напряжения, но новое полученное время из интернета как-то загнать же надо в микроконтроллер микроволновки, а там неизвестно какой контроллер стоит, какая программа у него там, как его прошивать это все неизвестно, самый простой способ это через меню самой микроволновки, то есть симулируя нажатия кнопок микроволновки, дополнительные кнопки не нужны, просто к кнопкам микроволновки подключить транзисторы которые будут управляться от arduino например, или другого контроллера. Я просто не знаю что из себя представляет ESP8266, может ли он выполнять функции микроконтроллера.

          • А ну собственно я именно это и имел ввиду. Эмуляцию нажатия кнопок. В зависимости от времени нужное количество раз. Еще такой вопрос. Если не кнопки, а колесико? Я думаю это не сильно большая разница? И если кнопки сенсорные? А то у меня как раз весь зоопарк. Только что механических часов нет.

            • Если колесико, то это энкодер, у которого 2 выхода, там сигналы сдвинуты по фазе относительно друг друга, в этом случае придется эмулировать эти сигналы, что тоже выполнимо, у меня есть статья по энкодеру, можете почитать http://radiolaba.ru/microcotrollers/podklyuchenie-enkodera-k-mikrokontrolleru.html

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *