Чего только не бывает на поприще разработки электроники. Кто бы мог подумать, что таймер может быть микрофоном. Однако это в какой-то степени так.

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

Постановка задачи

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

Каков план?

Подать звук на аппаратный таймер микроконтроллера и считать положительные перепады. Если счетчик увеличился, значит звук есть. Если не увеличился, значит звука нет.

Реализация

У меня на микроконтроллере AT32F435ZM к GPIO пину PB5 проложен провод от дифференциальной пары, которая поступает от аналогового микрофона. В микроконтроллере на пине PB5 я активировал канал входа, который тактирует аппаратный таймер №3 на втором канале.

Этот режим называется внешнее тактирование. GPIO пин PB5 надо сконфигурировать на вход в режим альтернативной функции Timer 3 канал 2 (TMR3_CH2). Эта функция соответствует значению PIN_MUX равному 2.

Как поступает положительный перепад, так сразу надо счетчик увеличить на 1. Таким образом аппаратный таймер станет считать импульсы от микрофона. Небольшой комментарий по настройке карты регистров таймера 3. Таймер надо переключить в режим External clock mode A.

Вот ключевые настройки в карте регистров:

Регистр

битовое поле

значение

пояснение

TMRx_CTRL1

TMREN

1

Включить на таймер

TMRx_STCTRL

SMSEL

7

External clock mode A — Rising edge of the TRGIN input clocks the counter

TMRx_STCTRL

STIS

6

Filtered input 2 (C1IF2)

TMRx_STCTRL

ESP

0

rising edge

TMRx_CM1

c2c

1

Input, C2IN is mapped on C2IFP2

TMRx_PR

PR

65535

максимальный предел счета

TMRx_CCTRL

c2en

1

Channel 2 enable

Остальные поля можно оставить без изменения, так как при сбросе они выставятся в нужные значения сами по себе.

Вот по такому пути должен просочиться сигнал тактирования от микрофона до таймера.

путь импульса
путь импульса

Отладка

У меня в прошивке есть UART CLI. Поэтому я могу отлаживать функционал в отдельности, по частям. Вот в логе загрузки появился текст про то, что канал настроился.

Можно заметить, что GPIO в самом деле переключился на таймер №3 канал 2.

Конфигурацию таймера 3 целиком и полностью определяют его регистры. Вот валидный конфиг.

timra 3
timra 3

Звука ещё не было, поэтому счетчик ожидаемо в нуле.

input_capture_diag
input_capture_diag

А теперь включим мелодию. Вот так выглядит фрагмент сигнала на осциллографе.

аналоговый сигнал на микрофоне
аналоговый сигнал на микрофоне

После того как прозвучала мелодия, можно заметить, что значение аппаратного счетчика увеличилось на 286.

input_capture_diag
input_capture_diag

Получается, что датчик звука работает. Можно ликовать.

Достоинства

  • Это своего рода эрзац-технология для тех, кто по разным причинам не может пользоваться микросхемами аудио кодеков.

  • Простота и топорность. Нечему ломаться. Такой импровизированный датчик можно сделать даже на дискретной логике.

  • Никаких вычислений. Никакой нагрузки на микропроцессор. Всё происходит полностью аппаратно. Звук тактирует аппаратный таймер.

  • Это санкционно-стойкий способ проверки звука.

Недостатки

  • Невозможно понять спектральную составляющую звука.

  • Невозможно понять смысл прозвучавшей мелодии.

Итоги

Вот так просто и незатейливо можно смастерить какое-то подобие микрофона. Удалось сделать автоматическое определение звука при помощи обыкновенного аппаратного таймера.

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

Словарь

Акроним

Расшифровка

КМОП 

Комплиментарный Металл-Оксид-Полупроводник

CMOS

Complementary metal–oxide–semiconductor

Ссылки

Комментарии (51)


  1. CitizenOfDreams
    24.09.2024 16:26
    +2

    А это точно хорошая идея подавать аналоговый сигнал на цифровой вход? И в каком режиме этот вход находится при нормальной работе микрофона?


    1. aabzel Автор
      24.09.2024 16:26

      Этот пин настроен на вход с подключением аппаратной функции: timer 3 channel 2. Внутренней подтяжки на стороне MCU нет.


      1. rukhi7
        24.09.2024 16:26

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

        Внутри АЦП тоже есть что-то наподобие таймера, там тоже надо время измерять, а это тоже просто регистрация импульсов по сути, но с другой целью, куда же без таймера деваться то (без регистрации импульсов).


    1. aabzel Автор
      24.09.2024 16:26
      +1

      А это точно хорошая идея подавать аналоговый сигнал на цифровой вход?

      Разумеется это паллиативное решение. Санкции делают своё дело. Приходится вот так выкручиваться.


      1. kuzzdra
        24.09.2024 16:26
        +1

        Ну, оно либо работает согласно ТЗ либо нет.


      1. Yuri0128
        24.09.2024 16:26
        +1

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


      1. rukhi7
        24.09.2024 16:26
        +1

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


        1. aabzel Автор
          24.09.2024 16:26

          можно же вообще на GPIO пин повесить прерывание, например по уровню,

          GPIO прерывания не смогут считать так быстро как аппаратный таймер.
          В случае с EXT INT будет вызываться ISR код.
          В случае с таймером никакой код не вызывается.


          1. kuzzdra
            24.09.2024 16:26
            +2

            GPIO прерывания не смогут считать так быстро как аппаратный таймер.

            Бесспорно. Но вы же мегагерцы с микрофона не планировали снимать? Или планировали? ;)


          1. rukhi7
            24.09.2024 16:26

            В случае с EXT INT будет вызываться ISR код.

            так это как настроите, можно сконфигурировать чтобы не вызывался, читаем флаг прерывания только когда надо. Что-то вы с таймером про все забыли, но там действительно интересно, я тоже так раньше увлекался таймерами :) .


        1. NutsUnderline
          24.09.2024 16:26
          +1

          оно уловит фронт, а что дальше? считать фронты? для этого есть счетчик


    1. Yuri0128
      24.09.2024 16:26
      +1

      В свежеподвешенном, ну в смысле в Z - высокоимпендансном. Без нагрузки на линии это весьма чревато (как лишним потреблением так и куда более серъезными последствиями).


  1. nUser123
    24.09.2024 16:26
    +1

    а почему не АЦП?


    1. Yuri0128
      24.09.2024 16:26
      +1

      А есть такое, что его и нету. Или он сильно-сильно занят. Или просто процу отвлекаться впадлу. Ну, много чего бывает.


      1. nUser123
        24.09.2024 16:26
        +1

        Уж больно ненадежно, про фильтр и триггер шмитта написали в комментах


        1. Yuri0128
          24.09.2024 16:26
          +1

          Так я ж и писал....

          Если уровень сигнала вольт так = питанию контроллера, то чего и нет (резистор последовательно только поставить), защитные ди0ды порежут лишнее. Так что вариант вполне для дна пойдет.


    1. aabzel Автор
      24.09.2024 16:26

      а почему не АЦП?

      Хороший вопрос.

      Да, в MCU AT32F435 Есть аж три 12-bit ADC частотой дискретизации Fs= от 124.9kHz до 5.3 MHz! В тандеме с DMA получился бы полноценный диктофон ультразвука.

      Однако так вышло, что на электронной плате все пины ADC оказались заняты другим. Остался только этот пресловутый PB5 с таймером. Не знаю почему схемотехники так сделали.


  1. Yuri0128
    24.09.2024 16:26
    +1

    Сразу несколько вопросов/проблем:

    уровень сигнала - напрямую с микрофона? Там миливольты а порог цифрового входа куда выше;

    наводки - поскольку вход высокомный а входная цепь может оказаться несколько длинной, то вполне вероятно что будет принимать все что угодно, включая мегагерцовый диапазон (рядом работающий передатчик). Выход - нагрузить линию и посадить фильтр (уже не просто);

    лучше-бы включить триггер Шмитта, чтобы не было излишних переключений и большего чем надобно потребления.

    Ну вот типа таких вот замечаний.


    1. kuzzdra
      24.09.2024 16:26
      +1

      уровень сигнала - напрямую с микрофона? Там миливольты

      Микрофон как правило с усилителем, амплитуда будет нормальная.


      1. Yuri0128
        24.09.2024 16:26
        +1

        В статье ни слова про усилитель. И ни слова что будет цифровой микрофон. Так что уровень будет не очень. Или вы думаете, что встроенный усилитель в электретном микрофоне выдаст больше 2В RMS? Так не выдаст и ему еще и питаниенадобно.


        1. kuzzdra
          24.09.2024 16:26
          +1

          В статье ни слова про усилитель.

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

          больше 2В RMS

          Не милливольты ;)

          питаниенадобно

          Ну, ожидается что питание в схеме подается и на микрофон и на контроллер.


  1. Sun-ami
    24.09.2024 16:26
    +2

    Без нормальных технических требований и схемотехники это даже оценить нельзя. Измерение непонятно чего непонятно для чего. А вообще для того, чтобы сделать детектор звука, кодек не нужен, и вычислительной мощности много не нужно - достаточно оцифровывать звук встроенным почти в любой микроконтроллер АЦП, причём скорее всего с низкой частотой дискретизации, порядка полутора-двух килогерц, и сделать небольшую цифровую обработку.


    1. Yuri0128
      24.09.2024 16:26
      +1

      Ну, просто фильтр + детектор, с него снимаем постоянку (которая как-то коррелирует с амплитудой). Все это можно подогнать по уровню к триггеру Шмитта = без вычислительных затрат, без занятого таймера (правда с аппаратным интегратором) и 1 вход. Ну и как-бы все.

      Просто небольшую цифровю обработку иногда и не на чем делать (нету ресурса просто свободного).


      1. Sun-ami
        24.09.2024 16:26
        +2

        Тут речь идёт о 32-разрядном микроконтроллере с вычислительной мощностью до 360 MISP, а задача требует не больше 0,2 MISP, или 0,055% потенциальной вычислительной мощности этого микроконтроллера, и при этом можно получить регулируемый порог срабатывания, автонастройку нулевого уровня, и какую-то селективность по виду сигнала, например реагировать только на слышимый сигнал. И ещё на обвязке микроконтроллера сэкономить.


        1. Yuri0128
          24.09.2024 16:26
          +1

          А вдруг ТС-а усе занято? И нету свободных 0.2 MIPS (ну ладно, не верю в это) или ADC забит чем-то (ну это вполне) или просто лень писать фильтр (ну, - наиболее вероятно)? А что тама сэкономишь? 1 таймер, так он унутри.


          1. Sun-ami
            24.09.2024 16:26
            +1

            Сэкономить можно по сравнению с аппаратной реализацией детектора, предложенной вами. А к реализации на таймере есть вопросы по контролируемости параметров и селективности, на которые не ответить без ТТ и схемы, которые автор раскрывать не хочет. И да, я тоже подозреваю, что просто лень писать фильтр. Может оно и будет работать, но смысл статьи непонятен.


            1. Yuri0128
              24.09.2024 16:26

              Мы же привязаны к реализации автора, - там этого нет. А так - мой вариант побоку ибо плата уже готова.


              1. kuzzdra
                24.09.2024 16:26
                +3

                плата уже готова

                Сначала сделали плату а потом уточнили ТЗ? Упсь.


                1. Yuri0128
                  24.09.2024 16:26
                  +1

                  Ага..... Ну вот, никогда не было и вот опять... :)...


    1. randomsimplenumber
      24.09.2024 16:26
      +1

      с неясным ТЗ результат хз :) программисту сказали сосчитать, он сосчитал


      1. Yuri0128
        24.09.2024 16:26
        +2

        Ну.... Результат будет полностью соответствовать ТЗ - по ТЗ непонятно-что и в результате - непонятно-что, что полностью по духу соответствует ТЗ.

        Были подобные "непонятно-что" в ТЗ, главное потом не ржать при клиенте, когда поэтапно показываешь, что выполнили буквально и дотошно все, что написали сотрудники клиента в ТЗ. Не ржать!! Думаю что такое у многих было... И скорее всего, наверное, у всех.


    1. NutsUnderline
      24.09.2024 16:26

      достаточно оцифровывать ....и сделать небольшую цифровую обработку.

      да чего там... разложить по Фурье спектр ... Слово "измерение" тут вообще лишнее и вся эта обработка излишня для задачи. Хотя можно .. замарочиться


      1. Sun-ami
        24.09.2024 16:26
        +1

        Измерение - это то, что делает таймер в статье - измеряет количество непонятно откуда взявшихся импульсов за какой-то период. Потому что наличие одного зарегистрированного таймером импульса вряд ли достаточно для такой задачи, значит нужно сравнение числа зарегистрированных импульсов с каким-то порогом. А цифровая обработка оцифрованного сигнала нужна как минимум, чтобы адекватно оценить громкость звука, и сравнить её с пороговой.


        1. NutsUnderline
          24.09.2024 16:26

          это да, причем в единицу времени, но суть что порог, диапазон - всего лишь 2 операции сравнения, а по большому счету выделяется некоторая полоса частот, размерностью в дискреты таймера (а не Герцы). Уровень громкости - порог 0/1, так или иначе задается схемотехникой. Получается очень дискретное преобразование, в очень абстрактных величинах, сравнение в эмпирическом диапазоне (258+-50), но без АЦП


  1. iliasam
    24.09.2024 16:26
    +5

    Заголовок - "Аппаратный Таймер в Качестве Микрофона".

    Статья: "У меня на микроконтроллере at32f435zm к GPIO PB5 проложен провод от дифференциальной пары, которая поступает от аналогово микрофона."

    Я-то уж думал, что будет история про "микрофонный эффект" какого-то узла...


    1. aabzel Автор
      24.09.2024 16:26

      Я-то уж думал, что будет история про "микрофонный эффект" какого-то узла...

      Как в фильме "Eagle Eye" (2008) СhatGPT по изображению концентрической ряби на воде в стакане через PTZ видеокамеру определил о чем говорят в комнате.

      https://youtu.be/b_wMF0rBA6I?si=2_QhMNF2F3Q_vXgS


    1. CitizenOfDreams
      24.09.2024 16:26

      Я-то уж думал, что будет история про "микрофонный эффект" какого-то узла...

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


      1. engine9
        24.09.2024 16:26

        Для этого нужно взять обычный советский... флажок


        1. kuzzdra
          24.09.2024 16:26
          +1

          Выпаять из старой советской платы - и в production!


  1. Indemsys
    24.09.2024 16:26
    +2

    Стандартная фишка. В Советском Союзе её знал любой АОН-щик. АОН-ы как раз работали с однобитовым сигналом. Спектр сигнала не сильно меняется если его квантовать в однобитовый.
    Если чувствительности цифрового входа маловато, то можно добавить на вход еще шум с другого выхода. Это будет дитеринг. Его тоже в АОН-ах применяли.
    Чуток фантазии и не за дорого можно ADPCM соорудить.

    А GPT подкинул еще один вариант:

    RC-цепь и измерение времени заряда: Создайте простую RC-цепь и используйте функцию измерения времени микроконтроллера для определения напряжения на конденсаторе. Это позволит получить цифровое представление аналогового сигнала без АЦП.

    Вот тут таймер более умно будет применен.


    1. Moog_Prodigy
      24.09.2024 16:26
      +1

      Ну этому решению сто лет в обед. Мало того, ЦАП на RC цепочке тоже можно сделать.

      Но как без внешней обвязки работать с микрофоном? Подозреваю, что там стоит ОУ. Или пара транзисторов. Не смогут микровольты переключить логический вход.

      Какая-то статья от школьника. "Словарь, ссылки" - все на это намекает, подражание серьезным работам. Домашнее задание по информатике?


      1. Indemsys
        24.09.2024 16:26
        +1

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


        1. Yuri0128
          24.09.2024 16:26
          +1

          А в тексте про усилитель ни слова.. Поэтому чукча немного фантаст. Просто иллюстрации подкачали.


    1. CitizenOfDreams
      24.09.2024 16:26
      +3

      Стандартная фишка. В Советском Союзе её знал любой АОН-щик.

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


      1. randomsimplenumber
        24.09.2024 16:26
        +2

        компаратор. Пусть даже импровизированный,

        Настоящий компаратор там был. Да и сигнал там совсем не микровольты.


  1. NutsUnderline
    24.09.2024 16:26
    +1

    собственно данная задача является вариацией на тему измерения частоты, а так же ширины импульсов при помощи таймеров о чем на хабре было несколько статей. частоту считать придется хотя бы косвенно, потому что если скажем в единицу времени идет 1 импульс то это помеха, а 65000 то скорее ВЧ наводка, так что частота выделяется хоть и косвенно.

    в "аппаратной" реализации такой задачи вызывает интерес завести выход встроенного компаратора микроконтроллера сразу на счетный вход счетчика за счет чисто внутренней конфигурации соединений.

    в некоторых новых контроллерах есть и pga, ну а если использовать cypress psoc то там вообще можно накоммутировать всякого, но это как бы не "китайские" контроллеры.


  1. sdy
    24.09.2024 16:26
    +2

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


  1. Sdima1357
    24.09.2024 16:26

    Меандр из другого канала того же таймера + пару резисторов и конденсатор , сумма пилы и микрофона и тот таймер на вход - получится ADC.


    1. aabzel Автор
      24.09.2024 16:26

      Что- то не совсем понятно. Есть ли возможность электрическую цепь изобразить?


  1. Xyzarcus
    24.09.2024 16:26
    +4

    С таким же успехом для такой задачи можно отлавливать смену логического уровня обычным уартом сохраняя "сэмпл" в буфер и считая количество ненулевых байт. Но нужно предварительно инвертировать сигнал. Даже получится некоторый фильтр так как каждый бит обычно дикретизируется 3 раза и отдельные иголки в сигнале будут отбрасываться


    1. NutsUnderline
      24.09.2024 16:26
      +1

      не знаю как на stm32, но на avr - 8 и 16 раз помниться сэмплируется uart

      но как видим здесь на структурной схеме в случае таймера в stm32 тоже есть некоторый фильтр на входе. а в xmega для такого случая фильтр настраивается от 1 до 8 выборок