Программирование AVR Динамическая индикация на примере управления светодиодной матрицей 8x8 GNM-7881AUE Fri, December 13 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Динамическая индикация на примере управления светодиодной матрицей 8x8 GNM-7881AUE Печать
Добавил(а) microsin   

Чтобы понять, что такое динамическая индикация, и для чего она нужна, нужно рассмотреть для примера промышленный индикатор GNM-7881AUE.

GNM-7881AUE-IMG_0819.JPG GNM-7881AUE-IMG_0823.JPG

В матрице GNM-7881AUE 64 красных светодиода. Если выводить из матрицы контакты всех светодиодов для управления каждым по отдельности, то понадобится как минимум 65 внешних контактов на корпусе матрицы, а также микроконтроллер с 64 портами вывода. Несомненно, это технологически реализовать очень трудно (и нецелесообразно). Поэтому на заводе светодиоды объединили в 8 групп по строкам и столбцам, и соединили их в матрицу следующим образом:

GNM-7881AUE-sch.PNG

При такой схеме подключения внешних контактов матрицы и портов микроконтроллера потребуется существенно меньше - только 16. Чтобы зажечь, например, светодиод в левом верхнем углу, нужно на контакт 13 матрицы подать плюс, а на контакт 9 минус. Для этого можно использовать, например, порты вывода микроконтроллера ATmega16 или ATmega32 и резистор:

led8x8conn-01.png

Светодиод слева вверху зажжется, если микроконтроллер на порт PA0 выставит лог. 1 (+5 вольт), а на PB3 лог. 0 (0 вольт). Такое управление светодиодами, когда логические сигналы во время отображения какого-то изображения не меняются, называется статическим. Как Вы уже наверное догадались, чтобы иметь возможность управлять всеми светодиодами, то нужно подключить остальные выводы строк и столбцов матрицы к микроконтроллеру:

led8x8conn-02.png

ОК, все очень красиво, но как, например, зажечь один светодиод в центре матрицы, оставив остальные при этом выключенными? Или, как, наоборот, зажечь все светодиоды, кроме одного-двух в центре? Понятно, что при такой схеме включения невозможно этого добиться простой подачей на выходные порты ноликов и единичек (с помощью статической индикации). Тут на помощь как раз и приходит динамическая индикация.

[Динамическая индикация]

Название "динамическая" происходит от того, что формирование изображения происходит не статически, а в динамике, т. е. сначала, например, показывают только первый столбец изображения (все остальные столбцы погашены), на втором шаге показывают только второй столбец, и так далее до 8-столбца. Если это делать быстро (с периодом прокрутки всех шагов не меньше 20 мс), то человеческий глаз не воспримет переключения между столбцами, и ему будет казаться, что отображается сразу вся картинка. Такое последовательное отображение элементов изображения называется разверткой. Для того, чтобы изображение не мерцало и яркость всех точек была одинакова, необходимо выполнение следующих условий:

1. Длительность отображения каждого столбца постоянна, одинакова для всех столбцов.
2. Частота смены столбцов не меняется.

Почему необходимо отображать картинку по столбцам, а не по строкам? Потому что в данной схеме мы подключили токоограничительные резисторы к линиям строк. Чтобы обеспечить одинаковую яркость свечения каждой точки, нам нужно обеспечить одинаковый средний ток через каждый светодиод, что возможно при такой схеме только при развертке по столбцам (когда по столбцам-анодам пробегает лог. 1). Если бы у нас резисторы были подключены не к катодам (не к строкам), а к анодам (к столбцам), то тогда развертку изображения надо было делать не по столбцам, по строкам (у нас бежал бы по строкам лог. 0).

Для примера приведу алгоритм отображения цифры 2 (на рисунке светодиоды, которые надо зажигать, я закрасил красным цветом), столбцы и строки нумеруются от 1 до 8:

led8x8conn-03.png

1. Отображение столбца 1. Для этого на PA0 подаем лог. 1, на PA1..PA7 подаем лог. 0. На порты PB3, PB4, PD0, PD1, PD3, PD5..PD7 также лог. 1. Держим матрицу с таком состоянии 2.5 мс.
2. Отображение столбца 2. Для этого на PA1 подаем лог. 1, на PA0, PA2..PA7 подаем лог. 0. Подаем лог. 1 на PB3, PB4, PD1, PD3, PD7, подаем лог. 0 на PD0, PD5, PD6. Держим матрицу с таком состоянии 2.5 мс.
3. Отображение столбца 3. Для этого на PA2 подаем лог. 1, на PA0, PA1, PA3..PA7 подаем лог. 0. Подаем лог. 1 на PB3, PD0, PD1, PD5, PD7, подаем лог. 0 на PB4, PD3, PD6. Держим матрицу с таком состоянии 2.5 мс.
4. Отображение столбца 4. Все то же самое, что и на шаге 3, только подаем лог. 1 не на PA2, а на PA3. Держим матрицу с таком состоянии 2.5 мс.
5. Отображение столбца 5. Все то же самое, что и на шаге 4, только подаем лог. 1 не на PA3, а на PA4. Держим матрицу с таком состоянии 2.5 мс.
6. Отображение столбца 6. Все то же самое, что и на шаге 5, только подаем лог. 1 не на PA4, а на PA5. Держим матрицу с таком состоянии 2.5 мс.
7. Отображение столбца 7. Для этого на PA6 подаем лог. 1, на PA0..PA5, PA7 подаем лог. 0. Подаем лог. 1 на PB3, PB4, PD0, PD3, PD5, PD7, подаем лог. 0 на PD0, PD1, PD6. Держим матрицу с таком состоянии 2.5 мс.
8. Отображение столбца 8. Все то же самое, что и на шаге 1, только подаем лог. 1 не на PA0, а на PA7. Держим матрицу с таком состоянии 2.5 мс.

Цикл шагов 1..8 занял ровно 20 мс (2.5+2.5+2.5+2.5+2.5+2.5+2.5+2.5). При непрерывном чередовании шагов 12345678123... получится отображение символа 2 без видимого мерцания. По похожему принципу работают все "взрослые" системы индикации в автобусах, электричках, турникетах, рекламных табло.

[Пример управления матрицей LED8X8]

Для экспериментирования со знакогенераторами 8x8 я сделал небольшой проект для отображения символов на индикаторе GNM-7881AUE. Схема подключения индикатора - точно такая же, как используемая при обсуждении динамической индикации. Красными метками я указал номера выходных контактов макетной платы AVR-USB-MEGA16.

led8x8conn-04.png

Проект управляется через виртуальный COM-порт - в консоли можно было ввести шестнадцатеричный код символа, и он тут же высвечивается на индикаторе. На фото видна макетная плата AVR-USB-MEGA16, на которую припаян индикатор GNM-7881AUE (весь монтаж и резисторы SMD 0805 номинала 150 Ом выполнен с обратной стороны макетной платы).

led8x8_IMG_0845.JPG

Потом проект оброс возможностью отображения бегущей строки и вывода картинок BMP, что позволяет делать забавную анимацию. В качестве знакогенератора используется набор символов от ZX-Spectrum, дополненный русскими символами.

[Что внутри проекта LED8x8]

Проект собран на основе статьи [1]. Скачанный пример дополнен командами, и в главный цикл main добавлена процедура динамической индикации, отображающая символы, бегущую строку или анимацию из картинок BMP. Питается и конфигурируется устройство от USB. Когда активен интерфейс USB, то возможно мерцание отображаемой картинки, так как на программную поддержку протокола (библиотека V-USB) тратится большая доля процессорного времени.

В память можно занести любое количество текстов и картинок (пока хватит места в EEPROM), они сохраняются в памяти после выключения питания. Управление и конфигурирование осуществляется через текстовую консоль, подключенную к виртуальному COM-порту (через любую консоль типа Hyperterminal, Terraterm или putty), интерфейс управления имеет систему подсказок. Вот пример сеанса работы с управляющей консолью проекта:

Тексты можно вводить командой TXT, а BMP-картинки в черно-белом формате 8x8 пикселов можно загрузить по протоколу XMODEM (моя любимая консоль SecureCRT умеет это делать). И тексты, и картинки добавляются в общий пул, и проигрываются по команде RUN в том порядке, в каком Вы их занесли в память — поэтому при желании можно сочинить очень сложную поздравительную комбинацию. Скорость бегущей строки и смены картинок меняется командой SPEED (от 1 до 10). Доступны также некоторые отладочные команды.

[Применение матричных индикаторов 5x7 точек]

Для светодиодной матрицы можно применить не только индикаторы 8x8 точек, но также и индикаторы 5x7 точек, которые иногда проще найти и купить. К примеру, есть индикаторы TFB2457C, TFB2757C, которые хороши тем, что их можно стыковать друг с другом для получения матрицы любого размера. Вот пример организации матрицы 7x10 точек:

LED7x8 main_view_IMG_2304 LED7x8 back_view_IMG_2310 LED7x8 working_IMG_2308

[Применение силовых ключей на транзисторах]

Как Вы уже наверное успели заметить, в вышеупомянутых схемах подключения LED-индикатора аноды и катоды светодиодной матрицы подключены к портам микроконтроллера напрямую (в нашем примере аноды) и через токоограничительные резисторы (катоды). При этом порты, нагруженные на аноды, испытывают повышенную нагрузку, если необходимо зажечь весь столбец анода - чем больше светодиодов нужно зажечь в столбце, тем выше нагрузка. В самом худшем случае, когда для нашего примера нужно зажечь все светодиоды в столбце, на один порт для анода приходится нагрузка из 8 параллельно включенных цепочек из светодиодов и резисторов 150 Ом. При этом нагрузка на порт превышает паспортную, выход микроконтроллера не справляется с нагрузкой, на анодах светодиодов падает напряжение. Не получится добиться высокой яркости свечения, и столбцы с разным количеством включенных светодиодов могут светиться с разной яркостью, что скажется на качестве формируемого изображения.

Чтобы улучшить работу схемы, для нашего примера целесообразно умощнить выходы, подключенные к анодам. Для умощнения портов ввода вывода применяют транзисторы, работающие в ключевом режиме [4]. Можно применить как биполярные, так и полевые транзисторы, но лучше всего поставить полевые транзисторы (MOSFET). Есть дешевые миниатюрные MOSFET транзисторы с P-каналом, например IRLML6401 или IRLML6402 в корпусе SOT-23. Полевой транзистор в нашем случае хорош тем, что для его подключения не нужны никакие дополнительные элементы (типа токоограничительных резисторов), и на открытом канале транзистора падает очень маленькое напряжение, так как сопротивление открытого канала IRLML6401 порядка 0.05 ом. Поэтому можно легко коммутировать большую токовую нагрузку без почти без потерь мощности - до 3.4A, что для нас более чем достаточно.

IRLML6401-SOT-23 IRLML6401-pinout

На рисунке вывод 1 обозначает затвор G (Gate), 2 исток S (Source), 3 сток D (Drain) транзистора. Чтобы умощнить аноды, транзистор нужно подключить по следующей простой схеме - затвор к порту микроконтроллера (например, к PORTA7), исток S к +5V, а сток D к анодам столбца матрицы.

IRLML6401-connection

Для подключения матрицы из нашего примера понадобится 8 транзисторов IRLML6401, затворы которых подключены к портам PA0..PA7 микроконтроллера ATmega32A, истоки к +5V питания, а стоки к соответствующим столбцам анодов матрицы. Нагрузочные резисторы, которые подключены к катодам матрицы, можно уменьшить для нашего примера до номинала 75 ом.

[Ссылки]

1. USB консоль для управления радиолюбительскими приборами.
2. Проект LED8x8 для AVR Studio.
3. Видеоролик на depositfiles и на YouTube.
4. Реле и транзисторы: как они работают в качестве электронных переключателей

 

Комментарии  

 
0 #3 Андрей 22.02.2024 15:46
На затвор тоже нужен резистор, там же вроде ток смещения будет в момент включения линии. Только я не знаю как номинал посчитать...

microsin: ИМХО никакой резистор на затвор не нужен. У нас же полевой транзистор, не биполярный. Зачем?
Цитировать
 
 
0 #2 Александр Деревянко 15.05.2019 23:39
Отличная статья. Я наконец смог разобраться, почему один светодиод горит ярче, чем линия светодиодов - тусклее. Спасибо!
Цитировать
 
 
+9 #1 Tibman 06.10.2011 15:04
Спасибо автору, разобрался с матрицами благодаря этой статье. Помогла схема матрицы и отличный пример, какие ячейки включать.
Цитировать
 

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


Защитный код
Обновить

Top of Page