Автоотключение/автовключение аудиоусилителя

Ситуация сложилась так, что мой временный усилок добросовестно впахивает уже третий год, подтверждая высказывание “ничто так долго не работает, как временный костыль”.

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

power_switcher

Итак у нашего девайса есть две основные функции как можно догадаться:

  • Отключение усилителя при отсутствии сигнала
  • Включение усилителя при появлении сигнала

Это все дело можно условно изобразить в виде следующей структурной диаграмки:

PowerSwitcherИнвертирующий усилитель раскачивает сигнал минимальной громкости до нужных величин, после чего этот сигнал подается на компаратор, сигналы которого в свою очередь обрабатываются микроконтроллером.

В качестве ОУ для первого усилка я выбрал TL062 (просто потому что он у меня был), компаратор + мк = pic12f629, 628а мне здесь показался избыточным.

Все мои фантазии вылились в такую схему:

PowerSwSchematic

Реле вынесено за пределы схемы, т.к. оно будет закрепляться отдельно. Резистор R5 на плате не установлен, я просто предусмотрел дополнительные площадки на всякий пожарный.

Схема собрана, надо бы проверить как там все дышит, для этого я набросал такой код:

Есть звук светодиод мигает, нет – остается в старом положении. Ниже видео с небольшим тестом(звук лучше сделать погромче):

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

SwitchingOFF

 

Здесь нам повезло и после выключения звука не проскакивает ни одного артефакта, но судя по статистике моих наблюдений время от времени это происходит.

Предположим у нас будет ситуация типа этой:

ONtoOFF

Вначале идет пачка пульсов – явная работа компаратора на звук, потом особняком идет пульс артефакт, которого хорошо бы было уже вообще не засекать. Для меня наиболее логичным путем показалось сохранение значения времени предыдущего промежутка, на каждом новом шаге. То есть, по прерыванию компаратора мы:

  1. Сохраняем текущее значение времени в переменную
  2. Обнуляем таймер и запускаем его заново

Осталось дописать условие останова, которое бы не задевало наш импульс артефакт и тогда по идее наше общее условие будет выглядеть примерно так:

tcur+tprevious >=tstop

Такое условие нам позволит не видеть один левый импульс, если их будет несколько, естественно оно не сработает, но как показывает практика, у меня они появляются по одному и крайне редко.

Все вышесказанное можно засунуть в вот такой код:

При частоте кварца 4 МГц, максимум что мы можем получить это ~500мс, то есть здесь я настроился на ожидание в 40 секунд, естественно эта цифра в дальнейшем будет увеличена, мало ли вдруг там в фильме все молчат долго :)

А вот и результат работы:

FromONtoOFFАртефакты упорно не появляются :) Ну да ладно, здесь видна пачка с выхода компаратора (шел звук) потом я нажал на паузу, и примерно через 40 секунд наша линия пошла вверх.

Ну с выключением вроде разобрались, что теперь делать с включением?

Снова нам поможет картинка :)

OFFtoON

Вкратце: В течение определенного времени, после срабатывания компаратора считаем импульсы, если их больше чем n, то на входе есть сигнал и пора включаться.

Подробнее: Чтобы адекватно и без ошибок проводить такую обработку необходимо некоторое время игнорировать все срабатывания компаратора, например, при первом включении питания девайса можно наблюдать красивую стартовую пачку импульсов, которые к звуку отношения никакого не имеют, а значит мы их должны фильтровать. А такая фильтрация замечательно производиться с помощью программной задержки. Ну в общем хватит слов, пора к коду!

Здесь я не увеличиваю счетчик срабатываний компаратора, до тех пор пока таймер не натикает 20 секунд, а дальше уже считаю в течении 10 секунд сколько раз пощелкает и если там будет больше 6 срабатываний, врубаю логическую единицу на затворе н транзистора.

А вот и тест нашей системы для включения:

FromOFFtoON

А теперь попробуем вывести такую диаграмму от подачи питания, включения девайса и до пропадания звука:

OFF-ON-OFF

Работает! Теоретически можно было бы все оставить как есть и заняться внедрением в действующий усилок, но захотелось таки еще защиты от зависаний, что нам поможет сделать сторожевой таймер (Watchdog).

О нем нам нужно знать следующее:

  • Независимый RC осциллятор с периодом 18 мс
  • Время может быть увеличено в 128 раз с помощью предделителя таймера TMR0

C учетом этого приходим к максимально возможному времени в 2.3 секунды, при нашем периоде работы в 500 мс это вполне себе нормально. Чтобы настроиться на этот самый максимальный период, нужно проделать следующее:

Дальше, чтобы не происходило преждевременного сброса просто нужно растыкать по коду инструкцию CLRWDT(), по временам меньшим чем 2.3 секунды от прошлой инструкции.

Теперь осталось расширить время отключения, для начала я выбрал 2 минуты, а потом посмотрим надо ли будет его увеличивать/уменьшать:

Это финальная версия кода. На данный момент код тестируется в реальном режиме, возможно в будущем выложу проапдейченную версию с актуальными таймингами.

Но остались некоторые манипуляции с железяками, нам необходимо:

  1. Взять питание +5В
  2. Взять питание +12В для реле (ну или найти другую релюшку)
  3. Взять сигнальный провод и землю
  4. Установить реле и плату нашего свитчера в действующий усилок

Первые пункты все происходят вокруг материнской платы компьютера и предполагают, что мы потянем как минимум 2 кабеля от материнки (+12 и +5 вольт), а лучше еще и землю еще одну затянуть для перестраховки.

Ну и как обычно, исходники здесь.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">