Часы на STM32 на внутреннем периферийном модуле RTC
Автор: Aheir, aheir@fromru.com
Опубликовано 18.12.2012.
Создано при помощи КотоРед.
Давно я что-то часов не делал… Более того, я еще не сделал ни одних часов на STM32 с начала их изучения… Ну вот сейчас сразу два упущения и устраним)
Мне понадобились некие несложные (в смысле – без особых наворотов) часы с достаточно крупными цифрами. В наличии были 70мм светодиодные семисегментные индикаторы SA23-11HWA, уже достаточно давно по случаю приобретенные у одного из наших форумчан, на них и остановился. Схема получилась такая:
Сразу скажу, что микросхема RTC DS1307, термометр TMP101, ИК-приемник, ЕЕПРОМ и датчик освещенности ISL29010 не устанавливались, хотя такая возможность и сохранена на печатной плате.
Всем огородом управляет микроконтроллер STM32F100C4 (базовая конфигурация, об этом ниже) или С6 (расширенная версия). В качестве часов реального времени задействован встроенный модуль микроконтроллера, тактирование от часового кварца на 32768Гц ZQ1. Микроконтроллер посредством одного из своих аппаратных SPI загружает данные для отображения на дисплее (читай – время) в 4 сдвиговых регистра 74HC4094, нагрузкой которых являются сборки ULN2003 и транзисторные ключи, управляющие непосредственно индикаторами. Индикация получается статическая – ну вот не люблю я динамику, если нет особых ограничений. Питание индикаторов – 12В, от меньшего напряжения их не зажечь – диодов много (9В, думаю, тоже хватит, если что). Входные 12В преобразуются в 5В для питания логики и в 3,3В для микроконтроллера. Управление – пятипозиционная кнопка-джойстик. Короткое нажатие – переход к показу секунд (всегда делаю такой режим, чтобы можно было сразу понять, что часы живы и куда-то идут – полезно на этапе отладки. Долгое нажатие до одного звукового сигнала – настройка: влево/вправо изменение значения, короткое нажатие – подтверждение, сначала ставим часы, потом минуты. Влево/вправо в основном режиме – изменение яркости индикации (сделано ШИМом, причем посредством загрузки в регистры нулевых данных; можно было бы сделать проще, но не предусмотрел и не развел на плате цепь Enable регистров…) Все нажатия подтверждаются звуковым сигналом.
В расширенной версии установлен BlueTooth модуль для удаленной установки/синхронизации времени. Подробнее об этом можно узнать в этой статье. Пришлось несколько доработать софт для синхронизации, новая версия обратносовместима с софтом из упомянутой статьи. Алгоритм и последовательность синхронизации такая же, как в часах «Orbit LED»
Программа для контроллера подготовлена в Keil. Версия прошивки задается на этапе компиляции путем включения или отключения
#define BLUETOOTH 1
Неприятность в том, что при подключении функций работы с BT-модулем код чуть-чуть не влезает в микроконтроллер C4 и требуется уже С6 или С8. Включение оптимизации приводит к получению неработоспособной прошивки. Честно сказать, с причинами такого явления не разбирался: код несложный, критичных мест я там не вижу, возможно, это следствие использования StdPeriphDriverLibrary...
По конструкции – одна печатная плата:
Для удобства подключения – два по-разному ориентированных входных разъема питания. Корпус тоже сделал из текстолита:
На задней крышке сразу подготовлены мета для крепления кронштейна:
Боковой разъем:
Внутри в нужных местах предусмотрены технологические медные площадки, вскрытые от маски, так что все изделие собирается воедино при помощи паяльника – детали корпуса и основная плата просто аккуратно спаиваются между собой.
Проблем при сборке и отладке не припомню, единственно что пришлось поменять один часовой кварц: плохо заводился генератор STM-ки почему-то. Часики, изготовленные в двух экземплярах, уже пару месяцев исправно тикают, без синхронизации уползают за месяц примерно на минуту – не так уж и плохо, как мне кажется.
Файлы:
Схема и печатная плата P-CAD 2006
Проект HiAsm и ПО для синхронизации
Исходники и прошивка Keil
Обратная связь
Интересуют вопросы реализации алгоритмов, программирования, выбора электроники и прочая информация, постараюсь осветить в отдельных статьях
пишите мне на netdm@mail.ru