Порадовать глаз различными миганием светодиодов мы уже умеем, а почему бы нам еще и не порадовать слух. В данном уроке мы рассмотрим как сгенерировать звук при помощи таймера AVR, вывести ее на динамик, и в конце концов сделаем некоторое подобие midi плеера. Чтож за дело…
Итак для сборки понадобится Atmega8, стандартная обвязка (кварц на 8МГц, 2 конденсатора на 22пФ) и пьезоизлучатель без внутреннего генератора, например HC0903A.
Можно, конечно, взять какой нибудь динамик 8Ом, но к нему придется городить усилитель. Нам же для образовательных целей достаточно будет простейшей схемы, которая без обвязки будет выглядеть так:
Достаточно просто, поэтому сразу переходим к теории. Чтобы создать звук нам нужно заставить колебаться мембрану динамика с определенной частотой. Каждой ноте соответствует своя частота, например ноте До 1 октавы, соответствует частота 261Гц. Т.е. дрыгая ногой микроконтроллера, подключенной к динамику, со скоростью 261 раз в секунду мы будем слышать звучание этой ноты. Для тех кто не силен в музыкальной теории, звук ближе от 1кГц и выше будет более писклявый, ниже 300Гц будет басить.
Перейдем к реализации. Как заставить ногу дрыгаться с такой скоростью? В этом нам поможет таймер, работу которого мы изучили в предыдущих уроках. В данном случае, нам пригодится timer1. Принцип формирования частоты таков: таймер тикает, до тех пор пока его значение не совпадет OCR1A. В в момент совпадения OCR1A, с текущим значением таймера происходит прерывание (выполняется функция) в котором текущее состояние PORTB.3 инвертируется (включается/отключается), таким образом мы получаем «пульсирующий» сигнал(мендр). Регулируя OCR1A мы изменяем частоту. Все, никаких сложностей.
Код исполняемый в прерывании:
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
PORTB.3=!PORTB.3;
}
Теперь, нужно соотнести каждой ноте частоты и по очереди их воспроизводить, т.е. создать массив со значениями, которые по очереди будем подставлять в OCR1A. Прошивка далеко не идеальна, но вполне работоспособна. Доступна тут.
На последок видео, подобрал первое что в голову пришло: марио и танчики)))
Добрый день. Я хотел сгенерировать звук с частотой 500 герц. Создавая проект в CV, настраиваю таймер: в clock value ставлю 8000000khz. Ставлю галочку в compare a match. И перевожу 500 в 1F4. Генерю. Пишу код PORTB.3=!PORTB.3;.А в итоге получается щелк с большой задержкой. Что делать? Больше кодов не писал.
Можете мне скинуть пример генерации одного звука?
Почитайте 5 урок, там все написано. Вам только и нужно настроить прерывание по совпадению. Не забывайте про фьюзы, если камень с завода не перепрошивался, то на нем будет 1МГц.
Дело в том что это все стимулировалось в протеусе. Я делаю все как в 5 уроке. Но результат такой и был «щелк с длинной задержкой». И нужно ли таймер нужно запускать в коде и останавливать?
про протеус можете забыть, он считает не в реальном времени, поэтому и результат соответствующий
Звук заработал но не той частоты. Почему?