Озадачился я красивым показометром для усилителя. Когда-то перерыл много схем, но ничего подходящего для себя не нашёл. Линейка зелёных светодиодов с красными (в конце шкалы) надоела, хотелось чтобы пик оставался красным при скатывании по всей шкале. Да ещё было бы неплохо изменять цвета, когда надоест. К примеру сделать оранжевыми линии с синими пиками. Все другие проекты были неоправданно сложными, с массой клоунских, не нужных "эффектов". Хотелось реализовать всё максимально просто, на самом дешёвом микроконтроллере. Сел за изучение С++ на старости лет, оказалось всё намного проще, чем предполагалось. Это мой первая работа, мигание светодиодиком не считается...
Выбор пал на PIC16F1825, ценой чуть больше 1$. Памяти и выводов в нём достаточно, даже более чем. Тактовая частота 32МГц. Таким образом, появился проект двухканального индикатора уровня на адресных светодиодах, максимально до 85 светодиодов в канале. Количество можно изменять в меньшую сторону, оперативно менять цветовую палитру при помощи трёх кнопок. А чтобы два раза не вставать, добавил и вторую версию на три канала (левый, правый, сабвуфер) до 64 светодиодов в каждом канале, с возможностью отключения канала сабвуфера отдельным пином микроконтроллера.
Схема (в двухканальной версии элементы для сабвуфера не нужны).
Логика работы:
При старте микроконтроллер просчитывает и заполняет двумерный массив пороговыми значениями АЦП для каждого светодиода (в зависимости от их количества), в диапазоне 0....1024, для линейной и логарифмической шкалы. В процессе работы эти значения сравниваются с текущим значением АЦП и формируется линейка светодиодов для вывода.
АЦП считывает показания 5 раз (можно изменять), берутся средние значения.
Имеется условная метка "0dB", которую можно поставить в любой место шкалы (хоть в самый конец), с любым цветом.
Код написан на C++ в среде MPLAB X IDE v6.15, компилятор ХС8 v2.45.
Сам код довольно простой, без излишеств. Память микроконтроллера использована на 87% в большей трёхканальной версии. Прерывания и "__delay" в программе не используются, кроме трёх "__delay" в обработчике антидребезга при нажатии кнопок. Задержки "скатывания" линий, "зависание" пиков и т.д. формируются путём подсчёта проходов полного цикла программы. Число задержки показывает, сколько проходов пройдёт, прежде чем начнутся изменения в позиции светодиода. Время цикла зависит от количества светодиодов, при трёх каналах и 32 светодиода в каждом канале- около 7mS на полный цикл для всех трёх каналов. Таким образом число 50h в "зависании" пика означает, что пик зависнет на 80х7=560mS. После 560mS начнёт скатываться со скоростью, записанной в "скатывании" пиков.
Все значения записаны в EEPROMке, их можно редактировать на свой вкус. Кнопка "<<" включает/выключает метку "0dB", кнопка ">>" включает/выключает заполнение линии цветом пика после этой метки. Длительное нажатие на кнопку "SEL" запускает процедуру настройки индикатора (если EEPROMка не прописана, настройка запустится автоматически).
Кратковременным нажатием "SEL", по очереди выбираются параметры:
1. Количество светодиодов.
2. Положение метки "0dB".
3. Цвет метки R
4. Цвет метки G
5. Цвет метки B
6. Цвет линии "левый/правый" R
7. Цвет линии "левый/правый" G
8. Цвет линии "левый/правый" B
9. Цвет пика на линии "левый/правый" R
10. Цвет пика на линии "левый/правый" G
11. Цвет пика на линии "левый/правый" B
12. Цвет линии "сабвуфер" R
13. Цвет линии "сабвуфер" G
14. Цвет линии "сабвуфер" B
15. Цвет пика на линии "сабвуфер" R
16. Цвет пика на линии "сабвуфер" G
17. Цвет пика на линии "сабвуфер" B
Изменение параметра выполняется кнопками "<<" или ">>". Одновременное нажатие кнопок "<<" и ">>" делает шаг назад и возвращает настройку на предыдущий параметр. После настройки длительное нажатие кнопки "SEL" записывает данные в EEPROM и возвращает индикатор в рабочий режим. Если не нажимать "SEL", устройство выйдет в рабочий режим без сохранения данных.
Если изменялось количество светодиодов, необходима перезагрузка, для нового заполнения массива опорных значений. Для 2-х канальной версии вся процедура настройки аналогична, с исключением канала сабвуфера. Для тех, кто не хочет заморачиваться с настройкой, можно подправить содержимое EEPROMки и залить в микроконтроллер. Тем более это желательно, там больше параметров можно редактировать.
Содержимое заполнено след. образом (адреса в десятичных значениях):
0. Число светодиодов в линейке
1. Число проходов АЦП для усреднения значения
2. Задержка "скатывания линии"
3. Задержка "скатывания пиков"
4. Зависание "пика"
5. Положение "метки 0dB"
6. Цвет метки R
7. Цвет метки G
8. Цвет метки B
9. Включение метки
10. Включение заполнения пика
(9 и 10 параметр не принципиален, это для запоминания состояния, легко меняется в рабочем режиме кнопками "<<" или ">>" )
16. Цвет линии "левый/правый" R
32. Цвет линии "левый/правый" G
48. Цвет линии "левый/правый" B
80. Цвет пика на линии "левый/правый" R
96. Цвет пика на линии "левый/правый" G
112.Цвет пика на линии "левый/правый" B
144.Цвет линии "сабвуфер" R
160.Цвет линии "сабвуфер" G
176.Цвет линии "сабвуфер" B
208.Цвет пика на линии "сабвуфер" R
224.Цвет пика на линии "сабвуфер" G
240.Цвет пика на линии "сабвуфер" B
Содержимое адресов - шестнадцатиричное, при редактировании EEPROM это надо учитывать. К примеру, количество светодиодов 64 соответствует 40h.
Для остальных значений 0...255 (0...FF), в разумных пределах. При больших значениях светодиоды светят очень ярко и потребляют большой ток. Поэтому очень желательно разделить питания контроллера и светодиодов. Резистором Vref устанавливается опорное напряжение для АЦП, лучше выставить его ближе к питанию микроконтроллера, а сами входные сигналы усилить с помощью ОУ, если амплитуды будет недостаточно. Хотя всё работает и без ОУ, с уменьшением Vref до 0.75...1 вольта (максимальная амплитуда сигнала). Но мне больше понравилась работа с операционниками, Vref при этом выставил около 4.5V.
Операционники - любые пятивольтовые "Rail-to-Rail", для двухканальной версии например MCP6022. Индикатор собирался и тестировался на макетке, печатка думаю сложностей не вызовет, деталей очень мало.
Проверялось на светодиодной ленте с адресацией, WS2812B RGB (144 LED / 1метр). Для конечного устройства заказал маленькие светодиоды 7020 и 4012. Планирую сделать трёхканальную версию на 64 светодиода.
Видео прилагаю. В архиве схема, прошивки под обе версии, заготовки ЕЕPROMок под разное количество светодиодов. В работе использовал программатор TNM5000.
Отзывы и пожелания приветствуются, всем удачи!
Прикрепленные файлы:
- UV_METER.rar (423 Кб)
Автор: sergey23