Как генерировать тоны разной амплитуды с помощью Arduino

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

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

Генерация импульсов и использование транзистора или усилителя на ИС для управления спакером не составит труда.

--> Вопрос: как модулировать амплитуду звука динамика?

Мое ограничение заключается в том, что при подаче сигнала тревоги Arduino по-прежнему должен заниматься другими делами, поэтому я не могу остановить его в сложной процедуре для генерации тонов, например, с помощью какой-то причудливой ШИМ, которая затем фильтруется для доставки сигнала с разными амплитудами. .

Я мог бы использовать один контакт для генерации сигнала базовой частоты и иметь 3 контакта для управления некоторой внешней схемой для изменения амплитуды, например:введите описание изображения здесь

Ребята, у вас есть идеи, которыми вы можете поделиться?

Спасибо!

ДОПОЛНЕНИЕ: Это решение, которое я уже опробовал, но уровни громкости не повторяются от одного устройства к другому, поэтому я хотел бы избежать добавления триммера. D13 генерирует прямоугольную волну со звуковым тоном. Другие выходы направляют этот тон через резисторную лестницу через логические элементы И.

введите описание изображения здесь

Ответы (2)

В вашем вопросе показан блок ШИМ, за которым следует регулируемый каскад усиления. Это не очень очевидная форма для использования, но она может сработать.

Традиционно вы можете использовать несколько блоков ШИМ с разной мощностью выходного сигнала (используя резисторы), фактически создавая ЦАП.

То, что вы построили, должно работать, если вы объедините ШИМ (для переключения) с программируемым источником тока (для амплитуды). Для источника тока вы можете использовать 3 параллельные схемы зеркала тока, переключаемые 3 регуляторами амплитуды. Обычно вы можете выбрать логарифмическую шкалу для каждого шага переключения.

Вы можете использовать выход PWM, чтобы потреблять ток, 3 ступени текущего зеркала, источник тока (и контролировать амплитуду).

Привет, Шон, я уже построил простое решение с резисторной лестницей, но уровни громкости не повторяются от одного устройства к другому. Я добавил схему в текст выше.

Arduino на самом деле не говорит, какой конкретно микроконтроллер, но я думаю, что все Arduino, о которых я знаю, имеют программируемый блок ШИМ, так что вам вообще не нужно тратить ЦП на генерацию сигнала.

Подробнее о различных способах использования блока ШИМ см. в этом ответе , но суть такова:

Вы можете запрограммировать период вашего ШИМ, то есть частоту выходного сигнала.

Чтобы отрегулировать напряжение, которое вы подаете на динамик, вы можете пойти разными путями:

  1. используйте второй блок PWM + фильтр нижних частот с отсечкой нижних частот для создания регулируемого постоянного напряжения, с помощью которого вы управляете транзистором, который вы используете для усиления сигнала, прежде чем он попадет в динамик.
  2. вместо использования ШИМ звуковой частоты используйте ШИМ, который намного быстрее, и включайте и выключайте его на желаемой частоте тона. Добавьте фильтрацию, чтобы быстрая ШИМ уменьшалась до смещения, но звуковые частоты не обрезались.

Другой, и, вероятно, самый простой способ — вообще не связывать микроконтроллер с генерацией аналогового сигнала, а использовать для этого аудио ЦАП. Эти устройства принимают последовательные данные, обычно через SPI/I2S, и часто даже имеют встроенные усилители.

Например, платы ST Discovery используют для этой работы микросхему CS43L22 . Вы просто отправляете цифровые аудиоданные, и они генерируют звук. На самом деле, у него даже есть блок генерации звукового сигнала, если вам лень писать сигнал звукового сигнала через интерфейс I2S!

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

Привет Маркус, ЦАП звучит как хорошая идея. CS43L22 — это излишество. Я посмотрю, если я могу найти что-то более простое. Ведь мне нужно всего лишь сформировать импульсы разной амплитуды и усилить одним транзистором.