Часы-термометр (очередные) на ИН-12, ChibiOS и STM32F1xx

Иногда нужно что-то делать, стараясь, а то забыть можно.


Все данное сделано лишь с той целью… без цели, просто так. Скорее демонстрация того, что и операционка и «большие» МК не так уж и плохо.


Софт
Код программы основан на RTOS ChibiOS, да. Она портирована на множество микроконтроллерных платформ, с качественным HAL-ом и поддержкой, написана на С, с интегрированными комментариями DoxyGen-а, за всей инфой велкам сюда — www.chibios.org/dokuwiki/doku.php

Основа это МК типа STM32F1XXCx (у меня стоит 103С8, ибо другого не было), в котором крутится наша операционка.
Проект просто сделать наиболее в Keil-е, в IAR-е даже проще, но кому надо – сделают. Итак, создаем прожект, стартап предложенный не нужен.

Выбираем чип (в моем случае) STM32F103C8,

далее на следующей вкладке ставим галку IRAM2 и дописываем адрес сразу после IRAM1, но размером в 0x1. Галочку повторной компиляции снять не забудь (или забудь).

Далее во вкладке C/C++ в дефайны прописываем:
__heap_base__=Image$$RW_IRAM1$$ZI$$Limit __heap_end__=Image$$RW_IRAM2$$Base
ставим оптимизацию минимум -01 (не работает при меньшей) и
Потом проставляем пути к исходникам, там много всего, вот скриншот путей к исходникам операционной системе:


То же самое нужно сделать в вкладке Asm, там прописать пути к стартапам, конфигурационным хидерам и прочему. И вписать в MiscControls –cpreproc


Остальные настройки (выбора программатора-отладчика и прочее) выполняются стандартно.

Далее добавляем файлы из папок в проект, добавляем свои файлы (main.cpp и прочее), сохраняем, компилим, чиним если что-то не так. В файлике и halconf.h настраиваем проект, что нам нужно из периферии. Файл chconf.h можно почти не трогать. Бывают ошибки, например:

Например, в строке
void rtc_lld_get_time(RTCDriver *rtcp, RTCTime *timespec) {
(void)rtcp;

uint32_t time_frac;
Кеил выдает ошибку, но это не так уж и плохо, исправляем (меняем местами).

Весь код, кроме функций обслуживания термодатчика, поместился в main-е, лул, вот. Там все очень просто и примитивно, но работало сутки без сбоев.

Вот тут, например, код считывания данных с АЦП и простейшая фильтрация, сделано по-простому, на ожидании готовности.
adcConvert(&ADCD1, &adcgrpcfg1, samples1, ADC_GRP1_BUF_DEPTH);
KeyValue = 0;
for (i=0; i < ADC_GRP1_BUF_DEPTH; i++)
{
KeyValue += samples1[i];
}
KeyValue = KeyValue / ADC_GRP1_BUF_DEPTH;


Хард

Первоначальный вариант платы показан вверху, ее немного переработал (например теперь термодатчик не на отдельной платке а непосредственно на плате). Наверное потом сделаю.

Генератор высокого напряжения для ин-ок выполнен на дросселе, диоде и транзисторе, где задает частоту микроконтроллер. Это избавило от дополнительной микросхемы и уменьшило сложность, но добавило проблем с настройкой (подбор частоты, необходимость в прошитом и работающем МК для проверки работы). Из-за этого произошла проблема – неудачно выбрал режим, на преобразователе напряжение стало свыше 300 вольт, из-за этого пробило ключевой транзистор, а через него достало до МК STM32F100C4, который изначально был припаян ( Так что имейте ввиду, подбор частоты лучше вести с самых малых значений, постепенно повышая.


Схема высоковольтных ключей типичная, там ничего нового, хотя в следующий раз лучше будет применить оптоключи, компактнее, безопаснее и проще. В анодах ламп стоят токоограничительные резисторы, их придется подбирать, дело в том, что у ламп могут быть разные рабочие характеристики (напряжение зажигания, изношенность). Следует избегать режима, при котором видно синеватое свечение в лампе, есть мнение, что это разрушаются электроды. Общий ток потребления всего устройства в целом около 80-120 мА.

На плате индикации расположены собственно лампы, кнопки управления, разъем для пищалки будильника, регистры и высоковольтные коммутаторы и транзисторы и схема генератора высокого напряжения. Диоды любые, у меня D6 (по схеме) это IN4007, D7 это стабилитрон на 50 вольт, я его не устанавливал, работает и так.
Выходной транзистор 13005, остальные MMBTA42 и MMBTA92. Нижние ключи — сборки ULN2003. Из задействованных ресурсов МК используется:
— ШИМ таймера 2
— RTC
— АЦП
— I2C/UART
— Выводы и прочее
— резонатор поставил внешний кварцевый, хотя схема может вполне нормально и без него работать, вот, но необходимо тогда будет изменить в проекте константу частоты.

Детали для высоковольтной части (транзистор, дроссель) взяты из электронного балласта энергосебрегайки.
ЧТО лучше всего улучшить — передалать код на что-то более полезное, подсветка ламп светодиодиками не используется, можно добавить попсовые голубые светодиоды, доделать будильник, сделать что-то с UART-ом, например сделать на нем сеть из DS18B20 или просто сеть.

В прикрепленных файлах внизу схема и исходники. Недочеты (они везде есть, тем более у меня) исправлю позже.
  • +5
  • 22 февраля 2014, 17:57
  • KT3012
  • 3

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

RSS свернуть / развернуть
А что случилось с второй картинкой со схемой?
0
  • avatar
  • Vga
  • 22 февраля 2014, 18:54
Повторите, пожалуйста, другой рисунок. Он, похоже, не до конца залит…
0
А мне нравится, все равно смысла было мало в нем. Вообщем-то.
0
Да, если можно, прикрепите схемы в PDF, полноразмерные. Мне, к примеру, нечем их просмотреть, а те, что в статье — очень мелкие.
0
Добавил sxema.zip
0
Спасибо.
Еще вопрос (уже по схеме): На сколько реально хватает 100uF конденсатора на Vbat?
0
На пару секунд точно. Я его поставил на случай кратковременного пропадания питания, что при моих ненадежных контактах довольно часто происходит. А вообще все нормальные люди ставят батарейку или аккумулятор. Советую добавить, например на bottom платы.
0
Давайте теперь поподробнее про ULN2003. Сборка на 50В, и потом общую точку, к которой внутри сборки подключены катоды ограничительных диодов (вывод 9), вы подключили через диод шоттки (D7) на общий. Зачем там Шоттки и зачем на общий — по мне так все цифры выбранного разряда должны гореть, а если убрать ваш диод D7, сразу пробьет ULN2003.
0
В статье указано, что D7 — стабилитрон на 50В, и с ним получается стандартная схема управления лампами. При закрытом ключе напряжение на нем диодом и стабилитроном ограничивается на уровне 50В. При этом остающегося на лампе напряжения недостаточно для ее поджига. Также эти индикаторы подключались через 74141/155ИД1, которые имели 60В ключи. Не хватает только подтяжки с коллекторов ULN2003 на +HV.
Хотя лучше поставить вниз высоковольтные ключи.
0
Да, виноват, до этого момента не дочитал, но все равно смущает, что автор пишет, что «я его не устанавливал, работает и так», думаю, это до поры до времени.
А на схеме указан именно диод Шоттки MBRS130LT3 (на 1А 30В обратного макс.)
0
Ну, 74141/155ИД1 тоже без внешней защиты работают… Недолго, правда. Хотя, там стоят свои стабилитроны для защиты ключей.
Тут еще фишка в том, что напряжение на ключах не достигает анодного. При закрытом ключе через погашенный катод все равно идет разряд — за счет тока утечки транзистора (а если разряд не идет — то лампа не проводит ток вообще и анодное на транзистор никак попасть не может). При этом на лампе падает достаточное напряжение, чтоы ключу досталось не так много. Плюс к тому, ели зажжен какой-то из катодов — напряжение на аноде просаживается до напряжения горения лампы, что тоже снижает напругу на закрытых ключах.
Но в любом случае, это ненадежно. Надо ставить ограничитель напряжения. Плюс желательно шунтировать лампу резисторами, чтобы не зажженные катоды не подсвечивались.
0
кстати, если на то пошло, то D7 на схеме показан в неправильной полярности
0
Я сейчас тоже часы делаю, просто из-за того, что нравится как горят лампы. Правда у меня статика, 6 разрядов. Все ключи MMBTA42, источник высокого на UC3845, статикой, димированием ламп и светодиодов подсветки управляет ПЛИС Altera MAX II, контроллер STM32F103 по SPI подключен к ПЛИС. Конструктивно выполнено на двух платах, одна процессорная, а на другой только ключи с лампами, чтобы можно было переходить на разные лампы не меняя главной платы. На главное плате установлен GPS (NEO-6M) для синхронизации времени, есть датчик давления для погодной станции, интерфейсы I2C, 1-Wire и AM2302 выведены на разъемы для подключения внешних датчиков, есть датчик освещенности для димирования ламп в темное время. Т.к. у микроконтроллера есть USB, я его тоже вывел на разъем, пусть будет.

Платы заказаны в Китае, уже изготовлены, но пока не пришли. Ждем :). Потом выложу поделку, наверное.
0
Классно, потом обязательно покажите фотки или даже схемы, окей? Насщет ULN — у многих людей они вроде как работают в таком режиме месяцами, наверное в них много волшебного дыма ) А диод я выбрал что под руку попался, от балды, просто показать что там нужен диод, про стабилитрон не думал вообще, склероз.
И да, лучше поставить специальный драйвер уж тогда, с загрузкой через SPI.
0
И кстати, чем статика лучше и где дольше срок службы ламп?
0
Мне попадалась такая инфа:
В общем и целом на долговечность неоновых ламп влияют два явления: poisoning (отравление катодов, или другими словами образование на поверхности каких-то пассивирующих соединений) и sputtering (распыление металла катода и его осаждение где-то в другом месте в баллоне)

poisoning данного катода происходит во-первых, если катод не горит, а горит какой-то другой катод в баллоне, либо если даже данный катод горит, но ток через него недостаточен.
наличие poisoning вызывает несвечение катода (частичное или полное).

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

Исходя из сказанного выше, рекомендованный режим газоразрядных индикаторов — динамический со скважностью около 4. Ток в импульсе подбирается достаточный для равномерного горения катодов. При этом, благодаря скважности, импульсный ток достаточно велик, чтобы не происходил poisoning, чтобы яркость была достаточна, и чтобы слегка отравленные катоды светились целиком. Более того, при достаточном токе в импульсе происходит самоочищение катодов. Sputtering при этом тоже не происходит благодаря тому, что средний ток через катоды с учетом скважности не настолько велик, как требуется для сравнимой яркости при статической индикации.

Очень важно, чтобы все катоды периодически зажигались. Например, в часах не все цифры в каждом разряде зажигаются. Неиспользуемые цифры со временем будут обязательно отравлены. Для борьбы с этим иногда вводят подпрограмму, по которой все цифры индикатора периодически перебираются.
+3
Благодарю за столь развернутый ответ.
0
По мне так смотря что подразумевать под «лучше». Срок службы очевидно будет меньше у статики, но нет мерцания, особенно при димировании. Ток в обоих вариантах очень важен, для ламп вреден как слишком большой, так и слишком низкий. Поэтому диммирование в любом случае должно быть импульсным.
Почему я статику выбрал — часы не на продажу, значит можно не волноваться по поводу стоимости, зато я смогу поэкспериментировать и оставить все так, как мне нравится, да и можно сделать и выбор режима индикации из меню.

Как абсолютно точно написал Vga, лампы очень легко угробить «неправильным» управлением. Для этого я в своей конструкции подключил все цифры, даже те, которые не используются для индикации в часах, все для того, чтобы равномерно изнашивать лампы и не допускать отравления катодов.

А вообще, лично мое мнение, при импульсном питании ламп все равно происходит «распыление» материала электродов, возможно, оно даже больше, чем в статике (постоянные быстрые нарастания тока с высокой начальной разницей потенциала, выше, чем требуется для зажигания лампы наверняка не идут ей на пользу — не забываем, что ток постоянный). Мне кажется, заявления про «самоочищение» и при этом полное отсутствие распыления — это два противоречащих друг другу утверждения. Т.е. если нет распыления — вообще не должно быть отравления соседних катодов.

Вот так будет выглядеть основная плата. Дроссель и D2PAK-5 — это источник напряжения 5В, почему такой здоровый — да чего было много, на том и сделал, к тому же у часов будет несколько каналов для управления электромеханическими звоночками, типа «боя» в механических часах. Неустановленный модуль справа — GPS, чуть левее него в LCC8 — датчик давления, еще левее EEPROM, выше — STM32, по центру Altera MAX II. Чип SO16 — это ULN2003 для звоночков. Литиевая батарея находится на другой стороне платы, больше там, кроме разъема JTAG ничего нет.
Основная плата
0
судя по топике на радиокоте лампы служат слишком долго, чтоб об этом задумываться. 30 или 50 лет она проживет, какая разница?
0
Полностью согласен! Просто лично мне как-то греет душу мысль, что я позаботился о долговечности ламп. А есть ли реальная польза от этого или нет — какая разница, главное нравится! :)

Хотя если один катод на максимальном токе «жарить» постоянно, последствия будут вполне реальные.
0
Ну зря вы так. Я вот пользуюсь настольными часами (не с такими индикаторами, но всё же), которым уже 25 лет. А где 25, там и 30 и т.д. Подумайте о детях, где они в будущем такие лампы возьмут. :D
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.