Меню

Ардуино генератор звуковой частоты

Digitrode

цифровая электроника вычислительная техника встраиваемые системы

Генератор звуковых тонов на Arduino своими руками

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

Интенсивность тона изменяется с помощью ШИМ (широтно-импульсная модуляция). Пример ШИМ показан на графике ниже.

В ШИМ частота сигнала или период времени сигнала (Ton + Toff) всегда постоянны. Изменяется только соотношение времени включенного состояния и выключенного состояния. Например, на втором графике на рисунке выше время включения составляет 80%, а время выключения составляет 20% от полной продолжительности. На третьем графике время включения составляет 50%, и время выключения составляет 50% от полной продолжительности. Можно сказать, что во втором графике коэффициент заполнения составляет 80%, а в четвертом – коэффициент заполнения 20%. С этим изменением коэффициента заполнения мы имеем изменение среднеквадратичного значения напряжения (Vrms), когда это напряжение подается на зуммер, он издает шум, который меняется при изменении коэффициента заполнения.

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

Для отфильтровывания шума напряжения питания на клеммах размещаются конденсаторы, как показано на рисунке. ШИМ в Arduino Uno может быть доступен на любом из выводов, обозначенных на плате как «

».В Arduino Uno шесть каналов ШИМ. Однако сейчас мы не можем использовать выводы ШИМ, установленные на выводах 0-7, так как они предпочтительнее для подключения кнопок. Существует причина для выбора выводов 0-7 в качестве источников приема входных данных, поскольку выводы 0-7 представляют собой PORTD микроконтроллера. Таким образом, в последнем случае мы можем взять полный байт PORTD.

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

Значение ШИМ для Arduino Uno можно изменять от 0 до 255. Значение «0» — самое низкое, а «255» — самое высокое. С коэффициентом заполнения 255 мы получим 5V на выводе 9. Если коэффициент заполнения равен 125, мы получим 2,5 В. Мы собираемся разделить коэффициент заполнения 0-250 между 8 кнопками, подключенными к порту D. Здесь мы примем 25 приращений для каждой кнопки, но вы можете взять другое значение. В итоге у нас будет сигнал ШИМ, коэффициент заполнения которого меняется с каждой кнопкой. Подведя сигнал ШИМ к зуммеру, мы получим генератор тона. Код программы тонального генератора на основе Arduino приводится далее.

Источник

Очень простой генератор из ардуины.

ТехнарьКто

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

Генератор частоты от 1 Гц до 8 000 000 Гц. Вырабатывает однополярный меандр со скважность 2. По русски это значит длительность импульса и длительность паузы между импульсами равны, а сигнал имеет прямоугольную форму.

Читайте также:  Ремонт тракторного генератора 700 ватт

Вопрос: Что такое генератор?
Ответ: Это устройство которое преобразует энергию источника питания в энергию выходных электрических импульсов заданной частоты и формы.

Вопрос: А мне то это зачем?
Ответ: Очень хороший вопрос, ответ на который Вы вряд ли найдете в интернете. Вы сможете проверить работоспособность усилителя. Проверить диапазон воспроизводимых усилителем частот. Проверить целостность динамика, даже без усилителя с помощью только этого генератора. Найти обрыв силового провода в проводке, обрыв телефонного провода, обрыв в электропроводке автомобиля. Правда кроме генератора нужен будет еще и детектор сигнала. Для поиска обрыва проводки генератор присоединяют к исследуемой линии, а частота генератора лежит в пределах килогерца. Поиск производится детектором. По резкому уменьшения громкости звука, определяется место разрыва. Генератор позволит проверить работу микропроцессора ардуины или PIC контроллера при использовании его как тактового. Можно сделать звуковую сирену с тональностью сигнала который Вам нравиться. Сделать передатчик с использованием генератора в качестве задающего несущую частоту. Настроить фильтр низкой частоты, настроить фильтр высокой частоты, настроить режекторный фильтр. Фильтры используют в цветомузыке, в каскадах радиоприемников, в импульсной технике для защиты от помех, для очистки информационного сигнала от сопутствующих работе помех. Подать сигнал низкой частоты на устройства работающие на шине I2C и посмотреть обмен информации хоть с помощью вольтметра. С помощью генератора можно измерять индуктивность и емкость с очень высокой точностью. Да и вообще сейчас трудно назвать современное электронное устройство в котором нет генератора и для быстрой проверки работы устройства не требовался бы внешний генератор, хотя бы такой. Кроме этого при использовании генератора показывающего все знаки неизменно возникнет вопрос, почему во всех генераторах частота немного отличается. Поэтому этот генератор позволит заинтересоваться вопросом точности и что же такое ppm, ppb зачем и когда это нужно.

Подначка: Да я программу генератора на компьютере запущу. Че мне заморачиватся.
Ответ: Программы генераторов на компьютере для звуковых карт ограничены звуковой частотой. Мне будет очень любопытно узнать, как вы с генерируете сигнал хотя бы в мегагерц 1 000 000 Гц с помощью звуковой карты. С помощью этого генератора — легко.

Теперь Вы знаете зачем нужен генератор. Практические примеры использования выходят за рамки данного сообщения. Здесь только про создание самого генератора.

Итак схема.

Я же обещал очень простой генератор

На выход сигнала можно смело цеплять динамик для проверки его работоспособности. Без конденсатора можно сразу подавать сигнал на микроконтроллеры и электронные схемы у которых 5V питание.

Из терминала послать требуемую частоту в герцах. Только цифру. В ответ в терминал будет выведена частота в герцах, а на выходе генератора появиться сигнал с частотой как в терминале.
Пример для частоты 200 кГц. В терминале набирал 200000

Пример для частоты 8 мегагерц. В терминале набирал 8000000

Меандр кривой из за малого частотного диапазона осциллографа. Но это совершенно другой вопрос.

Надо понимать, что выводимая в терминале частота будет отличаться от реальной. Выводимая в терминале частота была бы при идеальном кварце работающем точно на частоте 16 000 000 Гц. У ардуин такого не бывает. Если кому интересно, то могу написать о кварцевых резонаторах. Для понимания, почему в ардуино не бывает точных кварцев.

PS Поскольку в целом я далек от программирования но весьма не плохой электроник, вынужденный современностью разбираться в коде разных программ, то по большей части использую приборы которые кто то уже делал. Зачастую модифицирую, иногда и очень сильно, под свои потребности и использую. При этом считаю, что соблюдение авторства все равно должно быть. Код обычно беру из общедоступных источников, когда авторы сами выложили для использования другими. Поскольку найти конструкции бывает затруднительно, а при повторении конструкций бывают малопонятные особенности, о которых Вы можете и не найти информации, то считаю, что выложить и подробно описать для чего это надо и как заставить работать ту или иную конструкцию — это нормально.

Читайте также:  Повышенное напряжение генератора ваз 2106

Источник

Генерирование и чтение сигналов

Начнём с самого простого: генерация импульса заданной длины, такое часто бывает нужно. Проще всего сделать это на delay() и delayMicroseconds() :

Нужно помнить, что digitalWrite() сам по себе выполняется в районе 3.6 мкс (58 тактов процессора). Для ускорения можно использовать например библиотеку directIO или прямую работу с регистрами портов.

Генерирование квадратного сигнала

Программное

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

Если заменить 1000 например на 10 , то получится квадратный сигнал с частотой 50 Гц. Этот способ называется программной генерацией сигнала, то есть микроконтроллер своими силами считает время и сам вручную дёргает ногой. Это как мешает работе остального кода, так и остальной код может сбивать частоту. Такую генерацию можно сделать более мене асинхронной на миллисе:

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

Функция tone()

В ядре Arduino есть встроенная функция для полуаппаратной генерации квадратного сигнала – tone(pin, frequency, duration) :

  • pin – цифровой пин, с которого будет генерироваться сигнал.
  • frequency – частота в Герцах. Диапазон 31.. 8’000’000 Гц, целые числа. С увеличением частоты растёт шаг изменения реальной частоты.
  • duration – продолжительность сигнала в миллисекундах. Опциональный параметр, если не указывать – сигнал будет генерироваться всё время.

Для ручной остановки генерации сигнала можно вызвать noTone() . Также у генерации при помощи tone() есть особенности:

  • Генерация является полуаппаратной: пин дёргается МК “вручную” по прерыванию таймера, что на высокой частоте может чуть тормозить код.
  • Генерация использует Timer 2, перенастройка или использование его для других целей (включая ШИМ на пинах D3 и D11 у Nano) отключит активную генерацию или изменит её частоту.
    • При вызове tone() таймер перенастраивается на генерацию, то есть можно использовать таймер в своих целях между вызовами tone() .
  • Генерация работает только на одном пине в один момент времени, причём для включения генерации на другом пине нужно сначала отключить текущую генерацию, то есть вызвать noTone() .

ШИМ сигнал

Аппаратный таймер позволяет генерировать квадратный сигнал аппаратно и полностью асинхронно работе остального кода, не тратя ни такта процессорного времени: время считается самим таймером, и сам же таймер управляет состоянием ноги МК. Для генерации ШИМ сигнала в среде Arduino есть функция analogWrite(pin, duty) , подробнее мы говорили в ней в уроке про ШИМ. Чтобы сделать ШИМ квадратным, нужно запустить его с duty , равной 128 . Что касается частоты полученного сигнала, то Ардуино настраивает таймеры так, что частота в зависимости от таймера может быть 490 или 980 Гц. Частоту можно изменить с довольно большим шагом, об этом мы говорили в уроке про увеличение частоты ШИМ.

Аппаратный таймер

Можно вручную настроить аппаратный таймер на генерацию квадратного сигнала. Тонкости настройки регистров таймера мы в рамках этих уроков не разбираем, но это можно сделать и при помощи библиотеки, например GyverTimers. Работу библиотеки мы разбирали в уроке о прерываниях таймера. Данная библиотека позволяет настроить генерацию квадратного сигнала с максимально возможной точностью и частотой, а также поднять на одном таймере генерацию двух или трёх (Arduino MEGA) меандров со смещением по фазе. Пример:

Читайте также:  Генератор лучших ходов в шахматах

ШИМ сигнал

Аппаратный

Для генерации ШИМ сигнала с заданным заполнением есть стандартная функция analogWrite(pin, duty) , подробнее обсуждали в уроке про ШИМ сигнал, а частоту можно изменить перенастройкой таймера, как в уроке об увеличении частоты ШИМ. На самом деле таймеры позволяют настроить ШИМ сигнал с более точной или более высокой частотой и другими диапазонами заполнения (до 10 бит), но в ядре Arduino это не предусмотрено. Если такое будет нужно, можно воспользоваться библиотекой GyverPWM. Пример:

Программный

Программная генерация ШИМ сигнала может пригодиться, если не хватает лишнего таймера или частота ШИМ низкая и не повлияет на остальной код, а он на неё. Шим сигнал на миллисе можно организовать вот таким образом:

Полуаппаратный ШИМ

Можно снизить нагрузку на процессор, отдав счёт времени аппаратному таймеру. Примеры на базе GyverTimers:

Если не хватает количества стандартных ШИМ-выходов, можно поднять полуаппаратный ШИМ на таймере на несколько пинов сразу:

Библиотека Servo

Как известно, RC сервоприводы управляются при помощи ШИМ сигнала с частотой

50 Гц и длительностью импульса от

2500 микросекунд. В стандартной библиотеке Servo.h реализована генерация полуаппаратного ШИМ сигнала, причём количество пинов можно менять во время работы. Библиотеку можно использовать как генерацию ШИМ, если его параметры подходят для использования.

Чтение сигналов

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

Функция pulseIn()

В ядре Ардуино есть готовые функции для измерения импульсов:

    pulseIn(pin, value, timeout) – для импульсов от 10 мкс до

3 минут, работает на счёте тактов процессора, лучше работает при отключенных прерываниях, более точно измеряет короткие импульсы.
pulseInLong(pin, value, timeout) – для импульсов от 10 мкс до

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

Измеренная мной точность на коротких импульсах: 0.5 мкс

Обе функции возвращают длину импульса в микросекундах. Возвращают 0, если импульса не было и был достигнут тайм-аут. Обе функции блокирующие, то есть останавливают выполнение кода, пока не поймают импульс или не завершатся по тайм-ауту. Аргументы:

  • pin – цифровой пин (GPIO), на котором ожидается импульс.
  • value – направление импульса, HIGH или LOW .
  • timeout – тайм-аут ожидания импульса в микросекундах. Необязательный параметр, по умолчанию равен 1’000’000 мкс (1 секунда).

Как это работает: пусть мы настроили импульс на HIGH , функция будет ожидать изменение значения с LOW на HIGH . Если скачок с LOW на HIGH не произошёл за время, установленное тайм-аутом, функция завершит выполнение и вернёт 0.

Для превращения длины импульса (мкс) в частоту (Гц) достаточно поделить на него секунду (точнее, 1’000’000 мкс).

Измеряем сигналы вручную

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

Библиотека тахометра

Также предлагаю использовать класс тахометра, оформленный в виде библиотеки. Скачать можно с гитхаб. Также прикладываю здесь:

Источник

Adblock
detector