Файлы проекта лежат по ссылке
Как известно, для того, чтобы построить высококачественный усилитель мощности, недостаточно поставить в корпус готовые платы и трансформатор.
Современный усилитель должен обладать различными сервисными возможностями, которые может предоставить микроконтроллерное управление.
Такой усилитель и представляю вашему вниманию.
Усилитель имеет следующие блоки:
- Узел дежурного питания 12 В;
- Узел сетевого фильтра, защит и ступенчатой подачи питания на силовой трансформатор;
- Узел аналоговой обработки сигналов и защиты АС;
- Узел управления передней панелью ( графический дисплей, сенсорные кнопки, ИК-приемник пульта ДУ, сенсорный регулятор громкости с круговой индикацией)
- Собственно платы усилителей мощности.
Дежурное питание 12 В осуществляется от готового импульсного блока, основное - через линейный тороидальный трансформатор мощностью около 300 Вт с обмотками ~2х42 В (=2х50 В на выходе блока питания) и ~2х15 В для питания ОУ. Подача питания на силовой трансформатор осуществляется ступенчато, в две ступени: предварительное питание и полное, поскольку выпрямитель нагружен на батарею конденсаторов большой емкости (60 000 мкФ).
Сетевой фильтр типовой, содержит предохранитель, варистор, конденсаторы, синфазный фильтр, термопредохранитель. С сетевого фильтра напряжение 220 В поступает на реле ступенчатого включения силового трансформатора. Первая ступень включается с понижением напряжения на двух включенных параллельно керамических резисторах по 560 Ом. Термопредохранитель на 85°С имеет тепловую связь с этими резисторами (расположен между ними) и предназначен для отключения узла в аварийном случае невключения второй (полной ступени). Реле управляются от узла аналоговой обработки сигналов (АТТ) по команде микроконтроллера.
Узел аналоговой обработки сигналов (АТТ) содержит стабилизатор питания +5 В от дежурного напряжения +12 В, ключи управления реле ступенчатого включения нагрузки, выпрямитель и стабилизаторы питания -15 и +15 В для питания аналоговой части, управляющий микроконтроллер, микросхемы управления громкостью (цифровой аттенюатор PDA2310) и преобразования балансного сигнала в небалансный. Выбор источника сигнала осуществляется через малогабаритное специализированное сигнальное реле от управляющего МК.
Узел передней панели (PANEL) содержит микроконтроллер, ИК-приемник сигналов пульта ДУ (стандарта NEC) с возможностью обучения разным пультам, часы реального времени на DS3231, разъемы для подключения двух термодатчиков (защита от перегрева усилителя мощности), разъем для подключения графического дисплея, и разъем для подключения сенсорного регулятора громкости. Также узел содержит два интегрированных сенсора - включение питания и выбор источника сигнала.
Сенсорный регулятор громкости (ROLLER) построен на микросхеме TTP229 c 16-ю сенсорными площадками, расположенными по кругу, а сенсорный датчик MUTE на TTP223. Узел расположен на круглой печатной плате, прижатой к передней панели из оргстекла толщиной 1,5 мм. Вокруг него размещено кольцо с 16-ю адресными светодиодами, которые через рассеиватель индицируют регулировку громкости.
Узлы ATT и PANEL связаны между собой только одной 4-проводной линией связи UART, по которой узлы обмениваются между собой командами и данными. При этом узел PANEL является ведущим, а узел ATT - ведомым.
ПО микроконтроллеров написано на Bascom AVR (версия компилятора 2.0.8.5).
Основной модуль прошивки панели содержит в имени файла main, модуль определений def, модуль конфигурации cfg. Используется внешняя библиотека glcdSSD1306-I2C_V2.lib для графических дисплеев на чипах семейства SSD1306 с интерфейсом I2C.
Панель может находиться в различных состояниях, определяемых константами const MODE_ххх.
Основные состояния - это MODE_STANDBY и MODE_WORK. Смена режимов может осуществляться непосредственно, изменением значения переменной workmode, но главным образом, при помощи процедуры chmod(mode), которая по мере необходимости производит некоторые действия при смене режима. При включении, после инициализации, МК переходит в состояние MODE_STANDBY командой chmod MODE_STANDBY. В этом режиме на экране с пониженной яркостью отображается текущее время (т.е. аппарат выполняет функцию часов).
Обработка кнопок
Аппаратные кнопки (сенсоры) приводятся к кнопкам ПДУ. Все возможные внутренние коды кнопок определены константами const KEY_ххх. Коды кнопок, поступающие с ПДУ, переводятся в эти аппаратные коды (internal) при помощи процедуры lookup_key(ir_cmd) в результате просмотра EEPROM, где хранятся коды кнопок ПДУ (native). Internal коды могут быть переведены в нативные коды при помощи массива eram_key_code(KEY_ххх), картированного на EEPROM. Все это сделано ради возможности заменять нативные коды ПДУ при помощи процедуры обучения.
Поэтому основная процедура обработки нажатия клавиш использует именно нативные коды. Далее, если режим работы НЕ ОБУЧЕНИЕ, она переводит нативный код кнопки во внутренний код KEY_ххх, и, в зависимости от рабочего режима, вызывает обработчик кнопок key_proc_ххх того или иного режима. Каждый такой обработчик содержит код реакции на те кнопки, которые должны в этом режиме обрабатываться.
Связь
Связь однобайтная. Обработчик прерывания UART выставляет флаг, который обрабатывается в основном цикле. Там же разбирается значение поступившего байта. Если выставлен бит 7 или 6, то в младших битах содержится значение громкости для VU-метра, поступившее от АЦП МК модуля ATT. Иначе если выставлен бит 4, то модуль АТТ сигрализирует о срабатывании защиты колонок. При поступлении такого кода более, чем MALFUNCTION_LIMIT раз, МК уходит в режим неисправности и, после индикации сообщения, выключает аппарат.
Передача в ATT организована аналогично путем последовательного выставления битов, начиная со старшего; используются команды установки аттенюатора LINK_P2A_SET_DB, выбора входа LINK_P2A_INSEL, включения и выключения LINK_P2A_POWER_ON и LINK_P2A_POWER_OFF.
Сенсорная панель
Чип TTP229 при изменении состояния сенсорных площадок кратковременно выставляет на линии данных ВЫСОКИЙ уровнеь, что сигнализирет МК о том, что можно подавать тактовые импульсы на вход CLK микросхемы и считывать с линии данных 16 бит состояния площадок.
За это отвечает прерывание int_roller. После считывания состояния площадок в sens_new_key оно выставляет флаг sens_flag, который обрабатывается в основном цикле. Стоит заметить, что TTP229 сконфигурирован так, что сигнализирует соответстующим битом состояние каждой площадки (режим multi touch).
Обработчик флага sens_flag в основном цикле определяет, началось ли новое движение по серсорным площадкам, и вычисляет направление вращения, выдавая в итоге key_press eram_key_code(KEY_VOLMINUS) или key_press eram_key_code(KEY_VOLPLUS). В рабочем режиме MODE_WORK обработчик key_proc_work() по этим командам выдает в ATT команды управления громкостью через set_volume(value), а также управляет световым кольцом индикации через ring_set_led (num_led, R, G, B), устанавливая цвет нужных светодиодов (тот, что находится под пальцем при ручной регулировке (флаг roller_flag установлен) или пропорционально громкости - при регулировке с ПДУ. За постепенное затухание индикации отвечает таймер 0, флаг которого обрабатывается в основном цикле и вызывает декремент всех горящих светодиодов.
ИК-декодер
Поскольку в Bascom нет встроенного декодера пультов системы NEC, декодирование осуществляет код, который помещен в прерывание захвата таймера 1 int_cap1(). Здесь измеряются интервалы между импульсами и выдается два флага - основной ir_recieved и вспомогательный ir_repeat. Флаги обрабатываются в основном цикле. При этом только для части клавиш реализуется повтор нажатий: KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DN, KEY_VOLPLUS и KEY_VOLMINUS. Для всех остальных клавиш многократный повтор игнорируется.
Секундный таймер
В качестве секундного использован таймер 2, по флажку которого timer2_flag в дежурном режиме обновляется индикация часов, а в рабочем - верхняя строка индикации на дисплее: вход, температура термодатчиков, время.
Игровой таймер
В качестве игрового также используется таймер 2, по флажку которого game_timer в игровых режимах вызывается интерфейс игрового модуля game_cycle.
Игры
В качестве пасхалки реализованы три игры: змейка, динозаврик и пакмэн. Игры можно вызвать из меню about нажатием кнопок 1, 2 или 3 на ПДУ.
Поскольку игры реализованы через игровой интерфейс, который предоставляет прототипы классов, сравнительно просто можно менять их количество и тип, подключая собственный код.
Также в папку games вынесена отдельная реализация игрового интерфейса без всех остальных функций. В принципе это позволяет использовать игры в любых других проектах, просто перенеся код.
Игровой интерфейс реализован в файле games, и содержит три внешних прототипа, которые вызывает внешний управляющий код. Это game_init_interface(), вызов которого обязателен и служит начальной инициализации модуля, game_init_game(game_num) инициализирует соотв. игру (и дальше все операции будут производиться с игрой game_num, покуда метод не будет вызван с другим номером игры; и game_cycle(), вызываемый таймером основного модуля для каждого игрового цикла (шага).
Сами игры специфицированы в вызовах процедуры game_init_interface(), путем ссылки на процедуру инициализации игры, на игровой цикл, на процедуру обработки клавиш, указания частоты таймера и имени игры, которое будет отображаться в консоли. Таким образом, каждая игра должна содержать в себе реализацию трех методов: инициализация, игровой цикл (шаг), обработчик кнопок.








