Запись и воспроизведение звука микроконтроллером AVR. Application Note AVR335.

Интересное и необходимое направление, которое я считаю нужным осветить — это, конечно же, запись, хранение и воспроизведение звука. Цифровые диктофоны, автоответчики, голосовые меню, устройства оповещения, дверные звонки, игрушки — вот далеко не полный перечень устройств, где необходимо решать проблему записи, хранения и воспроизведения звука. Для решения такого вопроса воспользуемся существующими наработками ATMEL, а именно AVR335. Для тех, кто не дружит с английским имеется перевод на сайте gaw.ru. Скажу вам стоит распечатать этот документ — получится хороший годный учебник в виде брошюры.
Вот такой как у меня:
AVR335_bookВообще, коллеги, у меня масса подобных самодельных брошюр и даже книг. Брошюрами я сшиваю разделы даташитов на АРМ-ы (для АВР имеется книга Евстифеева А.В.), мануалы и аппноуты на некоторые комплектующие. Книгами оформил Ю. Ревича,  Д. Трампета и некоторые другие.

В документе AVR335 понятным языком подробно расписаны процессы записи, хранения и воспроизведения звука, при использовании любого микроконтроллера AVR с АЦП, памяти AT45DB161 DataFlash и нескольких внешних компонентов. Это руководство подробно описывает использование: АЦП для записи звука, последовательного интерфейса (SPI) для доступа к внешней памяти DataFlash и широтно-импульсной модуляции (ШИМ) для воспроизведения. В нём также доходчиво определены технические термины по теме.
В AVR335 используется уже устаревший контроллер AT90S8535. Без изменений кода схему можно реализовать на ATmega8535, но у меня имеется прекрасный модуль ATmega128kit, на котором уже установлена память, все кнопки, светодиоды и прочее. Поэтому я переписал исходный код для микроконтроллера ATmega128 в привычном мне WinAVR. Память, установленная на борту кита, — это AT45D321D. Её объём в два раза больше (32 мегабита) чем у использованной в аппноуте, т.е. можно записать не 4 1/4 минут, а 8 с половиной, что вполне достаточно для большинства конструкций. Для преобразования выходного ШИМ-а в звук я собрал фильтр Чебышева, предложенный в аппноуте. В состав этой платы также входит микрофонный усилитель собранный на первом ОУ из четырёх составляющих LM324. Вот её вид со стороны элементов:
LM324_LPF_topА здесь со стороны печати:
LM324_LPF_bottomСобирался этот фильтр из деталей, которые были под рукой, поэтому наблюдаем и выводные элементы, и смд-шные.
Кроме того, чтобы выводить звук на динамик,а не на наушники, я собрал простейший УНЧ на микросхеме LM386 согласно типовой схеме.
LM386_Ampl_topLM386_Ampl_bottomПотом всё это добро слепил в макет:
Sound_128_maketДинамик и микрофон китайские из подножного корма 🙂 В аппноуте предлагается тактировать микроконтроллер кварцем 8МГц, но на ATmega128kit у меня установлен 14,7456 МГц (для целых скоростей UART-а). Поэтому я включил внутренний RC-генератор на 8 МГц. Конечно это немного повлияло на качество звука, но не столь существенно. Да и целью я определял не законченную конструкцию, а отработку упражнения по записи, хранению и сохранению звука.
Исходный код на Си хорошо прокомментирован — на каждой строке имеется пояснение действий. Коды команд для AT45D321D совершенно одинаковы с предложенным AT45DB161 , поэтому в файле «dataflash.h» не пришлось ничего менять. Знаю, что народ попросит схему макета. Даю 🙂
Shema_define

Схема платы ATmega128kit  в соответствующей статье. В архиве выкладываю исходные коды, платы фильтра Чебышева-микрофонного усилителя и УНЧ LM386 в формате SL. Интересно, что прошивка занимает меньше 1 килобайта, а значит можно использовать практически любую ATtiny с АЦП на борту и необходимым количеством ног!
И напоследок ещё раз повторюсь — прочитайте внимательно упомянутую мною статью на gaw.ru! Там работа всего устройства, алгоритмы, методы обработки, хранения, воспроизведения расписаны очень понятно! Успехов, коллеги!

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

4 комментария: Запись и воспроизведение звука микроконтроллером AVR. Application Note AVR335.

  1. ARV говорит:

    Здравствуйте. Пытаюсь реализовать данный проект на atmega8, сделал платку распаял начал переделывать программу, и возник ряд вопросов. Не могу понять зачем в проекте активируется аналоговый компаратор, но не используется? И так понимаю в процессе записи и стирания вывод флэша RDY/BUSY должен быть в низком состоянии (но у меня он почему то в низком только в процессе стирания). Заранее спасибо.

  2. s_black говорит:

    1. Читаем внимательно комментарии к исходнику:
    ACSR |= (1<<ACD);//вЫключаем компаратор
    2. При любом действии с флешем указанный вывод анализируется, т.е. используется (а значит изменяется).

  3. ARV говорит:

    По поводу компаратора я не правильно выразился, в функции стирания используем регистр компаратора:
    (ACSR |= 0x02; // установка флага, показывающего, что следующим этапом должна быть запись данных )
    — это я так понимаю для обозначения что память стерта? А потом в функции записи
    (if((ACSR & 0x02)) // если флаг установлен, то новые данные должны быть установлены
    {
    buffer_counter = 0;
    page_counter = 0; // сброс счётчика если должны быть записаны новые данные
    ACSR &= 0xFD; // очистка флага сигнала
    }) — это проверяем «начать запись заново» или «продолжить» ?
    И ещё вопрос по поводу ШИМ, я использовал вывод не OCR1B для него, а OCR1A, это же не принципиально?

  4. s_black говорит:

    Цитата из моей статьи: «… И напоследок ещё раз повторюсь — прочитайте внимательно упомянутую мною статью на gaw.ru! Там работа всего устройства, алгоритмы, методы обработки, хранения, воспроизведения расписаны очень понятно! …»
    Цитата из упомянутой на гав.ру статьи: «…В этом примере приведены два способа применения флага состояния.
    Первый способ – использование глобальной переменной (т.е. переменная «wait» используется в подпрограмме «playback»). Второй способ – использование незадействованного бита в регистре. В подпрограмме «стирания», используется бит ACIS1 (регистра управления и состояния аналогового компаратора (ACSR))для отображения того, что следующими этапом должно быть сохранение новых данных. …»
    По поводу ШИМ — вывод не принципиален.
    Удачи, коллега!

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

Ваш e-mail не будет опубликован.