При сборке конструкций на микроконтроллерах порой начинаешь сравнивать их с обычными персональными компьютерами.
Здесь всё очень похоже. Всё как у "больших братьев" ‒ настольных и ноутбуков. Только гораздо проще и компактнее.
В качестве процессора сам микроконтроллер. Прошивка словно операционная система. Она же ‒ работающая программа, причём единственная.
Есть оперативная память, есть память для хранения данных. Есть вычислительный модуль, выполняющий заданный прошивкой алгоритм.
Есть и периферийные устройства для ввода и вывода информации.
Устройства ввода ‒ кнопки и всевозможные датчики.
Для вывода ‒ устройства отображения, визуальные или звуковые, реле, двигатели и разные исполнительные механизмы.
В свою очередь для отображения информации используются как простейшие ‒ светодиоды, так и всякого рода дисплеи и индикаторы.
И иногда возникают ситуации, когда обычных светодиодов становится уже недостаточно, а использовать дисплей пока ещё неоправданно излишне, громоздко или просто дорого.
В таком случае в качестве промежуточного, компромиссного варианта стоит обратить внимание на сегментные светодиодные индикаторы.
За последние несколько лет цена на них, вытесняемых дисплеями, упала достаточно сильно и стоимость одного сегмента практически приблизилась к стоимости отдельного светодиода ‒ три-четыре рубля за сегмент, рублей 25-35 за один разряд, рублей 40-50 за двух- или трёхразрядные.
Между тем подобные индикаторы позволяют выводить не только числа, но и некоторый ограниченный набор символов.
Достаточно просто научиться с ними работать. И этим мы сегодня и займемся.
Как и прошлые статьи, данная статья для всех, кто изучает микроконтроллеры и учится их программировать. Для всех, кому это интересно. Каких-либо открытий и инноваций здесь нет, за исключением собственного полученного практического опыта.
И заодно, наверное, нужно пояснить само название статьи. Ко всем прочим своим достоинствам устройства на микроконтроллерах можно собирать и отлаживать по частям, отдельными модулями, участок за участком полной схемы. Если есть уже готовые модули ‒ используем их. Если нет ‒ собираем самостоятельно. В итоге вся конструкция собирается из таких вот "цифровых кирпичиков". Ну а третий номер потому, что раннее уже были статьи про программирование светодиодов и про вывод звука с помощью микроконтроллера. Теперь вот дошла очередь и до индикаторов.
1. Про сегментные индикаторы
Для начала опять немного скучной теории.
Обычный светодиодный сегментный индикатор представляет собой несколько светодиодов, помещенных в единый корпус и пространственно расположенных таким образом, чтобы при зажигании отдельных сегментов зрительно это воспринималось как один из алфавитно-цифровых либо каких-то иных символов.
Наибольшее распространение получили 7-ми сегментные индикаторы, как самые простые и дешёвые.
Ещё встречаются 15-ти и 16-ти сегментные индикаторы, управлять которыми несколько сложнее, но и возможностей отображения у них больше.
В 7-ми сегментном индикаторе на самом деле чаще всего 8 светодиодов, дополнительный используется для отображения десятичной точки.
Некоторые индикаторы имеют ещё и разделительные сегменты между разрядами, в виде двоеточия ‒ их используют в электронных часах.
Также подобные индикаторы отличаются друг от друга количеством отображаемых цифр: одноразрядные, двухразрядные и т.д.
Для сокращения количества выводов обычно светодиоды объединены по схеме с общим анодом или общим катодом.
Индикаторы с общим катодом встречаются чаще.
Также к сегментным индикаторам можно отнести различные светодиодные линейки или шкалы.
Как бы не были конструктивно оформлены подобные индикаторы и для каких задач бы не применялись ‒ фактически это всего лишь набор обычных светодиодов.
Для удобства отдельные сегменты одного разряда обычно обозначают символами: a, b, c, d, e, f, g. Точку обозначают как dp.
Номера разрядов в многоразрядных индикаторах обозначают цифрами: 1, 2, 3, 4 и т.д. Принято нумеровать разряды слева направо.
Для подключения индикатора нужно знать распиновку его выводов, но если разыскать её не удалось, тоже не страшно.
Она определяется буквально за несколько минут с помощью обычного мультиметра в режиме измерения сопротивлений или прозвонки цепей.
Последовательно подключаем к выводам индикатора измерительные контакты мультиметра и по зажиганию отдельных сегментов индикатора определяем их наименования и номера выводов.
У разных моделей индикаторов расположение выводов может отличаться друг от друга. Вот один из примеров - четырехразрядный индикатор. Катоды обозначены как K1-K4.
2. Микросхема-драйвер светодиодных индикаторов MAX7219 и используемая схема.
В простейшем случае можно подключать сегменты индикатора к портам микроконтроллера как обычные светодиоды, через токоограничительные резисторы.
Но при этом недостатков получается больше, чем достоинств:
- Каждый сегмент индикатора занимает целую линию ‒ порт микроконтроллера, учитывая, что в нашем микроконтроллере всего три 8-ми разрядных порта больше трёх знакомест индикатора использовать не получится
- Приходится организовывать программное управление отображением информации каждого сегмента в отдельности, что требует использования значительных вычислительных ресурсов микроконтроллера
- В зависимости от количества подключенных сегментов требуется учитывать ограничения по максимально допустимому току на отдельный порт микроконтроллера и на весь чип
Чтобы высвободить порты микроконтроллера и разгрузить его от выполнения низкоуровневых задач часто при работе с индикаторами используют дополнительные микросхемы, например дешифраторы 74HC154, сдвиговые регистры 74HC595 или специализированные драйверы MAX7219-MAX7221.
В случае с драйвером MAX7219-MAX7221 задача программирования вывода с микроконтроллера на индикаторы плавно замещается задачей программирования самой микросхемы-драйвера.
При этом через одну микросхему-драйвер к микроконтроллеру можно подключить до восьми разрядов 7-сегментных индикаторов или матрицу светодиодов 8х8. Кроме этого есть возможность и каскадного включения микросхем-драйверов, а значит количество разрядов индикаторов можно соответственно увеличить. И для управления понадобится задействовать всего лишь три линии одного порта микроконтроллера.
Схема электрическая принципиальная нашего индикаторного модуля в этом случае может выглядеть так.
Назначение выводов MAX7219:
Выводы сегментов индикатора, обозначенные символами a, b, c, d, e, f, g, dp подключаются к соответствующим выводам микросхемы MAX7219.
Выводы общих катодов светодиодного индикатора поразрядно подключим к выводам DIG0-DIG7 микросхемы.
На вход микросхемы 1-DIN подаются данные с микроконтроллера, бит за битом, всего 16 байт.
На вход микросхемы 13-CLK подается сигнал тактирования. В техническом описании указана максимально допустимая частота в 10 мГц. Сначала я пытался использовать MAX7219 совместно с Arduino Nano работающей на частоте 16 МГц, но эксперимент не удался, схема не работала.
Поэтому позже использовал обычный микроконтроллер, работающий от внутреннего генератора с тактовой частотой в 8 мГц и включенным делителем на 8.
Вход 12-LOAD (CS) управляет записью полученных от микроконтроллера данных в MAX7219.
Вход 18-ISET через резистор подключается к плюсу питания. Сопротивление данного резистора (минимальное значение 9.53 кОм) ограничивает ток, текущий через сегменты индикатора, тем самым регулируя яркость свечения. При заданном минимальном значении сопротивления пиковый ток сегмента будет равен примерно 40 мА. Если вместо данного резистора поставить переменный, яркость свечения индикаторов можно будет регулировать аппаратно.
Есть возможность программной регулировки яркости свечения, для этого в регистр 0A MAX7219 нужно записать одно из 16-ти значений (0-минимум, 15-максимум).
На вывод 19 микросхемы подается +5 вольт от источника питания.
Выводы 4 и 9 GND нужно подключить к минусу источника питания. Обязательно оба.
Вывод 24-DOUT. Последовательный вывод данных. Используется при каскадном включении нескольких микросхем-драйверов. На этом выводе появляются принятые на входе DIN данные c задержкой в 16 с половиной тактов.
Как видно на схеме я также подключил к выходам MAX7219 светодиодную шкалу из 10 сегментов. Первые восемь из них a-g и dp будут относиться к разряду 5, оставшиеся два сегмента a-b отнесем к разряду 6.
С полным техническим описанием микросхем MAX7219/MAX7221 можно ознакомиться здесь или здесь.
Для управления индикатором необходимо передать в микросхему MAX7219 два последовательных байта.
В первом байте указывается номер регистра.
Во втором байте идут непосредственно сами данные.
Связь отдельных битов передаваемого байта данных с сегментами индикатора выглядит так:
Регистры управления MAX7219:
Если первый байт ‒ регистр от 01 до 08, то это команда микросхеме вывести последующие данные в соответствующее знакоместо-разряд индикатора.
Регистр 00 ‒ No Op ‒ понадобится при совместном подключении нескольких драйверов.
Регистр 09 ‒ Decode Mode ‒ включает или выключает режим декодирования. В режиме декодирования драйвер использует встроенную таблицу из 16 заранее определенных символов. А именно 0-9, -, пробел, H, E, L, P.
При отключенном режиме декодирования можно использовать свою таблицу знакогенератора, с гораздо большим количеством символов, ограниченным только вашей фантазией да размером выделенной программной памяти микроконтроллера.
Принцип составления подобной таблицы прост.
Пример 1:
Необходимо отобразить в одном из разрядов индикатора символ F. Для этого нужно зажечь сегменты a, e, f, g соответствующего разряда. Разложим байт передаваемых данных на биты в соответствии с вышеприведенной табличкой: 0-1-0-0-0-1-1-1. Переведем это число из двоичного вида в десятичный. Получится 71. Полученное значение и нужно пересылать побитно в виде данных во втором байте посылки.
Пример 2:
Нужно зажечь третий по счету сегмент светодиодной шкалы. В соответствии с принятой нами кодировкой он же сегмент c. Двоичный код для такой комбинации по таблице выше 0-0-0-1-0-0-0-0. В десятичной системе это число 16. Его и отсылаем во втором байте.
Регистр 0A ‒ Intensity ‒ позволяет программно управлять яркостью свечения индикаторов (0-минимум, 15-максимум)
Регистр 0B ‒ Scan Limit ‒ здесь устанавливается число используемых разрядов индикатора. Если планируется использовать не все 8, а меньше, то рекомендуется отключать неиспользуемые. От этого будет зависеть частота обновления индикатора, а также пиковый ток через сегменты.
Регистр 0C ‒ Shutdown ‒ включает, если записать в него 0, или отключает, если записать 1, режим энергосбережения. В режиме энергосбережения все индикаторы гаснут, данные и состояние регистров не теряются, энергопотребление индикаторов падает до 150 мкА.
Регистр 0F ‒ Display Test ‒ 0-выключен, 1-включен. В тестовом режиме включаются все сегменты индикатора, даже если драйвер находится в режиме энергосбережения. Используется для проверки работоспособности индикатора.
При подаче питания на микросхему-драйвер предыдущие значения настроек не сохраняются, поэтому настройки регистров (инициализацию драйвера) нужно задавать при каждом новом включении.
Более подробно о настройках, режимах работы и программировании микросхем MAX7219-MAX7221 можно почитать, например здесь, здесь и здесь.
3. Готовим тестовый стенд
Наглядная схема соединения деталей для тестового стенда показана ниже.
Выглядит она несколько сумбурно. На схеме расположены микросхема микроконтроллера ATmega328P-PU, микросхема драйвера светодиодных индикаторов MAX7219, 4-х разрядный 7-ми сегментный индикатор и светодиодная шкала на 10 сегментов.
Часть соединений, показанных на схеме оранжевым цветом, делал с помощью скобок из лужёного медного провода диаметром 0.75 мм. Остальные соединения выполнял разноцветными монтажными проводами с игольчатыми разъёмами на концах.
На схеме показан часовой индикатор с 16-ю выводами. У меня такого не нашлось, поэтому использую 4-х разрядный индикатор с 12-ю выводами.
Подключаю его соответственно цоколевке. В случае, если вы решите повторить данную схему учитывайте, пожалуйста, этот момент и подключайте ваш индикатор правильно.
Светодиодная шкала на наглядной схеме расположена катодами снизу.
Нумерация её сегментов, так же, как и нумерация разрядов индикатора, идёт слева направо.
Электролитический конденсатор, подключённый к цепям питания нужен для сглаживания пульсаций и бросков напряжения источника и обеспечивает большую стабильность работы микроконтроллера.
Конденсатор на 100 нФ в цепи Reset устраняет возможные наводки и также улучшает стабильность работы микроконтроллера.
Сам тестовый стенд, собранный по данной схеме выглядит так.
Впрочем, если собирать подобный тестовый стенд из отдельных компонентов покажется слишком обременительным, вы всегда можете использовать готовые модули светодиодных индикаторов с уже впаянными микросхемами MAX7219. Останется только подключить их на макетной плате к микроконтроллеру и электропитанию с помощью разъёма или пяти проводков.
4. Программа для микроконтроллера
Программа для демонстрации возможности работы с индикаторами была написана в среде Bascom-AVR.
Основой для неё послужили подпрограммы Max7219_setup, Disp_write и Prepare для инициализации драйвера MAX7219 и передачи на него данных от микроконтроллера.
Исходные коды этих подпрограмм с последующими внесенными незначительными изменениями были взяты из статьи "КОГДА НЕ ХВАТАЕТ НОГ. ЧАСТЬ 3. ДРАЙВЕР ИНДИКАТОРОВ MAX7221" замечательного сайта "AVR project ‒ проекты на микроконтроллерах AVR".
Оставалось добавить к ним лишь таблицу кодировок да основной цикл программы, в котором последовательно, код за кодом идет вывод символов из таблицы на индикаторы.
Итоговый исходный текст получившейся программы можно скачать отсюда.
Код прошивки после компиляции в виде .hex-файла находится здесь.
В памяти микроконтроллера данная версия программы занимает 2328 байт, поэтому для компиляции вполне можно использовать бесплатную demo-версию среды Bascom-AVR.
В результате работы программы содержимое таблицы знакогенератора последовательно, символ за символом, выводится на 4-х разрядный индикатор.
Для большей зрелищности десятичная точка отображается, продвигаясь в противоположном направлении, справа налево.
Одновременно с этим на светодиодной шкале последовательно зажигаются сегменты, сначала в виде перемещающейся точки, а затем в виде нарастающего и убывающего столбика.
Я постарался уложить данную функциональность в единый основной цикл программы, для чего пришлось использовать кучу дополнительных переменных и вводить проверки их ограничений. Выглядит это не очень наглядно и совсем не похоже на структурное программирование Дейкстры.
Если разобраться с кодом основного цикла программы будет затруднительно даже с комментариями, попробуйте использовать более простой вариант.
При схожей функциональности он куда нагляднее. И занимая на сотню строк меньше кода, он занимает 2570 байт, то есть всего лишь на пару сотен байт больше по размеру в памяти микроконтроллера.
Скачать исходный текст второго варианта программы можно отсюда.
Код прошивки второго варианта после компиляции в виде .hex-файла находится здесь.
Добавлю, что в обоих вариантах программы для отображения зажигаемых сегментов светодиодной шкалы используются буквы кириллицы:
- а, б, в, г, д, е, ё, ж ‒ если нужно выводить бегущую точку
- з, и, й, к, л, м, н, о ‒ для вывода нарастающего столбика
- п, р, с, т, у, ф, х, ц ‒ для вывода убывающего столбика.
Сделано это, так как цифры и символы латиницы уже заняты под вывод для сегментного индикатора.
А сама операция вывода отдельных символов в главной части программы сводится всего к двум командам и может выглядеть, например, так:
Digit_str = "--8- а" ‒ заносим в строку для вывода нужные данные
Gosub Prepare ‒ выводим их вызывая подпрограмму
В данном случае в разрядах 1,2,4 индикатора будет высвечиваться знак минус, в разряде 3 отобразится восьмёрка.
Первые восемь сегментов светодиодной шкалы будут погашены, девятый сегмент зажжён, десятый сегмент погашен.
Или так:
Digit_str = "-HI-аб" ‒ заносим в строку для вывода нужные данные
Gosub Prepare ‒ выводим их вызывая подпрограмму
В первом и четвертом разрядах индикатора минусы, между ними приветствие "HI", на светодиодной шкале горят крайние слева и справа сегменты.
В общем, что в данную строку для отображения поместите, то и отобразится.
А можете и вовсе использовать свою собственную кодировку.
5. Прошиваем микроконтроллер
Для записи откомпилированной программы в микроконтроллер вы можете использовать отдельный программатор и подробную пошаговую инструкцию из статьи "Микроконтроллер вместо Arduino ‒ это просто! И три дополнительных мелодии для "шарманки".
Только в пункте 9 данной инструкции вам не нужно будет переводить микроконтроллер на тактирование от внешнего кварца с частотой 16 мГц.
Достаточно оставить заводские установки чипа ‒ работу от внутреннего генератора с частотой 8 мГц и включенным делителем частоты на 8.
Fuse-биты в программе CodeVisionAVR при этом будут выглядеть так:
Или можете использовать для прошивки микроконтроллера любой другой, более удобный и привычный для вас способ.
6. А что дальше?
Представленный в данной статье тестовый стенд, равно как и приводимые к нему программы ‒ это совсем не окончательная конструкция.
В лучшем случае это всего лишь часть разрабатываемого вами будущего устройства, отлаженный отдельно кусочек, "цифровой кирпичик номер три", ответственный за визуализацию цифровых показаний.
И где именно вы сможете его применить, в цифровом вольтметре, амперметре, счетчике импульсов, частотомере, домашних часах или метеостанции, каком-то другом приборе или гаджете ‒ существует много возможностей, окончательное решение и реализация зависят только от вас.
05 августа 2020 года.
С уважением, Ваш @mp42b.
<-- Предыдущая статья | Содержание 2019-2020 | Следующая статья -->
#простые вещи #сегментные индикаторы #mp42b #микроконтроллеры_mp42b