Если вы когда-нибудь решите построить часы, рано или поздно вам понадобится система отсчета времени. Каждый микроконтроллер имеет таймер, который отсчитывает время с момента запуска микроконтроллера. Но после сброса, сбоя питания или переполнения соответствующего регистра — отсчет начинается с нуля.
Данные такого таймера вполне достаточны для функций задержки и многих других функций, использующих время, таких как ШИМ или сторожевой таймер. Однако для часов такой таймер не подходит.
Для этих целей, как правило, используют часы реального времени (RTC — англ. Real Time Clock). Это специализированные микросхемы (модули), чаще всего имеющие автономное питание (от аккумулятора или батареи). Их роль — генерировать время и дату даже в ситуации если вся система, в составе которой работает модуль, обесточена.
Содержимое таких чипов (время и дата) может быть установлено самим пользователем или, например, синхронизировано с сетевой службой времени NTP.
На рынке есть несколько подобных систем, например DS1307, MCP79400. Сегодня мы рассмотрим микросхему PCF8563.
Почему PCF8563? Самым большим преимуществом этой микросхемы является широкий диапазон питания. PCF8563 работает от 1 до 5,5В. Благодаря этому, без каких-либо дополнительных конвертеров, ее можно использовать как с Arduino, так и с Raspberry. Чего нельзя сказать, например, о микросхеме DS1307, которая работает только с напряжением от 4,5 до 5,5В.
Подключение PCF8563
Распиновка PCF8563:
Для подключения PCF8563 нам потребуется:
- Кварц 32 кГц,
- Два резистора 10 кОм,
- конденсатор 10..22пФ
Схема подключения из datasheet:
Vdd — напряжение питания, Vss — земля. Напряжение питания может варьироваться от 1 В (или 1,8 В, если вы хотите считывать данные с него) до 5,5В. В качестве конденсатора можно использовать керамику емкостью 10..22 пФ.
Резисторы на линии SDA и SCL можно не ставить — у большинства контроллеров (включая Arduino) есть внутренние подтягивающие резисторы на этих линиях. С другой стороны, они не повредят, поскольку внутренние резисторы контроллеров могут быть слишком слабыми. Можно установить резисторы сопротивлением по 10кОм.
I2C
Чип PCF8563 обменивается данными по шине I2C. Соединение простое — достаточно подключить выводы SDA и SCL взаимодействующих систем (SDA — Serial DAta, а SCL — Serial CLock). У PCF8563 выводы SDA и SCL — это 5 и 6 соответственно. Дополнительно их следует подтянуть (через резисторы) к линии питания.
Для Arduino UNO шина I2C подключена к контактам A4 (SDA) и A5 (SCL). На некоторых клонах они находятся справа в ряду с цифровыми выводами, рядом с USB разъемом:
Программное обеспечение
Каждое устройство, работающее на I2C шине, имеет свой адрес. Вы можете проверить это с помощью простого сканера I2C. Ниже приводится скетч сканера I2C, который отобразит все устройства, подключенные к шине I2C, и напечатает их адреса:
// I2C Scanner #include <Wire.h> void setup() { Serial.begin (115200); // Leonardo: wait for serial port to connect while (!Serial) { } Serial.println (); Serial.println ("I2C scanner. Scanning ..."); byte count = 0; Wire.begin(); for (byte i = 8; i < 120; i++) { Wire.beginTransmission (i); if (Wire.endTransmission () == 0) { Serial.print ("Found address: "); Serial.print (i, DEC); Serial.print (" (0x"); Serial.print (i, HEX); Serial.println (")"); count++; delay (1); // maybe unneeded? } // end of good response } // end of for loop Serial.println ("Done."); Serial.print ("Found "); Serial.print (count, DEC); Serial.println (" device(s)."); } // end of setup void loop() {}
Для PCF8563 вы должны получить следующее:
I2C scanner. Scanning ... Found address: 81 (0x51) Done. Found 1 device(s).
Установка времени и чтение
Вам понадобится дополнительная библиотека для поддержки PCF8563. Вы можете скачать ее здесь. Теперь просто используйте пример Файл > Образцы > Rtc_Pcf8563-master > set_clock. Он содержит практически все, что вам нужно. Пример выглядит так:
/* Demonstration of Rtc_Pcf8563 Set Time. * Set the clock to a time then loop over reading time and * output the time and date to the serial console. * * I used a RBBB with Arduino IDE, the pins are mapped a * bit differently. Change for your hw * SCK - A5, SDA - A4, INT - D3/INT1 * * After loading and starting the sketch, use the serial monitor * to see the clock output. * * setup: see Pcf8563 data sheet. * 1x 10Kohm pullup on Pin3 INT * No pullups on Pin5 or Pin6 (I2C internals used) * 1x 0.1pf on power * 1x 32khz chrystal * * Joe Robertson, jmr * orbitalair@bellsouth.net */ #include <Wire.h> #include <Rtc_Pcf8563.h> // запускаем часы реального времени Rtc_Pcf8563 rtc; void setup() { //очистить регистры rtc.initClock(); //установить время для начала. //день, день недели, месяц, век (1 = 1900, 0 = 2000), год (0-99) rtc.setDate(14, 6, 3, 1, 10); //час, мин, сек rtc.setTime(1, 15, 0); Serial.begin(9600); } void loop() { //обе функции форматирования вызывают внутренний getTime (), так что //форматированные строки имеют текущее время / дату. Serial.print(rtc.formatTime()); Serial.print("\r\n"); Serial.print(rtc.formatDate()); Serial.print("\r\n"); delay(1000); }
Наиболее важные шаги:
1. Добавьте библиотеки Wire и Rtc_Pcf8563,
2. Создайте объект Rtc_Pcf8563:
Rtc_Pcf8563 rtc;
3. Метод initClock () используется для сброса часов:
rtc.initClock();
4. rtc.setDate () и rtc.setTime () устанавливают время. Если вы поместите их, например, в setup () — в память PCF запишется новое время — перезаписав все, что было раньше,
5. Функция get * () используется для получения даты и времени.
Аварийное электропитание PCF8563
Возвращаясь к схеме из datasheet на PCF8563 — обратите внимание на силовую часть:
Отмеченная часть схемы — это аварийное электропитание системы. В случае отсутствия питания Vdd ток будет течь от большого суперконденсатора (он помечен как 1F).
Или можно сделать так:
Примечание.Напряжение питания проходит через диод, чтобы предотвратить разряд конденсатора; Если вы используете обычный диод (например, 1n4148), напряжение Vdd, питающее PCF, упадет примерно на 0,6 — 0,7 В (диод будет «потреблять» его); для меньшего падения вы можете использовать, например, диод Шоттки.
Резистор R1 ограничивает ток, заряжающий конденсатор. Согласно закону Ома:
например, для источника питания R1 = 100 Ом, Vdd = 5 В и диода 1n4148 ток, протекающий на/от конденсатора, будет равен:
Это немного, но помните, что стабилизатор Arduino (то есть Vdd) также имеет ограниченную мощность.
Конденсатор должен иметь максимально допустимое напряжение (Vdd-0,6 В) — при условии, что падение на диоде составляет 0,6 В; ПРИМЕЧАНИЕ: для Arduino и Vdd = 5v это должен быть двойной суперконденсатор, например:
Чем меньше R1, тем больше зарядный ток, но больший ток будет взят из источника Vdd. Для упомянутого конденсатора R1 = 100 Ом и 1Ф постоянная времени будет:
Через 100 секунд конденсатор разрядится до 2/3, а полностью только через 8 минут. Я думаю, что в случае часов это разумное значение.
Конденсатор напрямую подключен к микросхеме. Это не проблема, учитывая, что RTC использует микроамперы (например, 800uA с включенным интерфейсом) или только наноамперы (например, 550nA с отключенным интерфейсом) — этого достаточно.
Тест системы аварийного электропитания
Схема с аварийным питанием на суперконденсаторе была оставлена на неделю. Время от времени отмечали напряжение на конденсаторе. В итоге получилась такая диаграмма:
Судя по разрядным характеристикам конденсатора, в начале работы его напряжение падало довольно быстро. Со временем напряжение падало примерно на 90 мВ/день. Это означает, что полностью заряженный конденсатор должен удерживать часы в рабочем состоянии около месяца.
Резюме
Теперь вы знаете, как самостоятельно создать часы реального времени на основе PCF8563 и подключить их к Arduino. Вы также можете найти готовые модули на PCF8563 с подтягивающими резисторами и батареей питания, например: