Часы реального времени: подключение PCF8563 к Ардуино

Если вы когда-нибудь решите построить часы, рано или поздно вам понадобится система отсчета времени. Каждый микроконтроллер имеет таймер, который отсчитывает время с момента запуска микроконтроллера. Но после сброса, сбоя питания или переполнения соответствующего регистра — отсчет начинается с нуля. 

Данные такого таймера вполне достаточны для функций задержки и многих других функций, использующих время, таких как ШИМ или сторожевой таймер. Однако для часов такой таймер не подходит.

Для этих целей, как правило, используют часы реального времени (RTC — англ. Real Time Clock). Это специализированные микросхемы (модули), чаще всего имеющие автономное питание (от аккумулятора или батареи). Их роль — генерировать время и дату даже в ситуации если вся система, в составе которой работает модуль, обесточена.

Содержимое таких чипов (время и дата) может быть установлено самим пользователем или, например, синхронизировано с сетевой службой времени NTP.

На рынке есть несколько подобных систем, например DS1307, MCP79400. Сегодня мы рассмотрим микросхему PCF8563.

Тестер транзисторов / ESR-метр / генератор
Многофункциональный прибор для проверки транзисторов, диодов, тиристоров...
Подробнее

Почему PCF8563? Самым большим преимуществом этой микросхемы является широкий диапазон питания. PCF8563 работает от 1 до 5,5В. Благодаря этому, без каких-либо дополнительных конвертеров, ее можно использовать как с Arduino, так и с Raspberry. Чего нельзя сказать, например, о микросхеме DS1307, которая работает только с напряжением от 4,5 до 5,5В.

Подключение PCF8563

Распиновка PCF8563:

распиновка PCF8563

Для подключения PCF8563 нам потребуется:

  1. Кварц 32 кГц,
  2. Два резистора 10 кОм,
  3. конденсатор 10..22пФ

Схема подключения из datasheet:

схема подключения из datasheet PCF8563

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 — обратите внимание на силовую часть:

Аварийное электропитание PCF8563

Отмеченная часть схемы — это аварийное электропитание системы. В случае отсутствия питания Vdd ток будет течь от большого суперконденсатора (он помечен как 1F).

Или можно сделать так:

Аварийное электропитание PCF8563 - второй вариант

Примечание.Напряжение питания проходит через диод, чтобы предотвратить разряд конденсатора; Если вы используете обычный диод (например, 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 с подтягивающими резисторами и батареей питания, например:

Источник

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

Ваш электронный адрес не будет опубликован.


*