Воспроизведение звука на pic

Работа с SD картой. Воспроизведение wav файла. Ч3

Низкоуровневые функции для работы с SD картой

Чтобы использовать библиотеку Petit FatFs с SD картой, нужно реализовать три низкоуровневые функции для работы с ней – это функция инициализации, чтения и записи.

Если вы читали предыдущий материал, в котором была описана библиотека Petit FatFs, то должны помнить, что “пустышки” этих функций находятся в файле diskio.

cНа сайте Elm Chan`a есть примеры использования библиотеки с SD картами, поэтому можно взять уже готовые функции из этих проектов, что я и сделал. Я позаимствовал из одного примера файл mmc.c и заменил им файл diskio.c , однако файл mmc.c тоже потребовал небольшого “допиливания”.

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

#define SELECT() – формирует низкий уровень на CS выводе карты

#define DESELECT() – формирует высокий уровень на СS выводе карты
#define MMC_SEL – возвращает единицу, если на выводе CS низкий уровень
#define init_spi() – инициализирует SPI модуль
#define dly_100us() – формирует задержку на 100 микросекунд
#define xmit_spi(d) – передает байт данных по SPI
#define rcv_spi() – принимает байт данных по SPI
#define FORWARD(d) – перенаправляет поток данных, этот макрос можно оставить пустым

Все эти макросы легко реализовать, если прочитать материал про SPI модуль AVR микроконтроллера. Я как раз взял оттуда spi драйвер и “прицепил” его к файлу mmc.c.

Короче, получается такая последовательность. Мы берем библиотеку Petit FatFs добавляем к ней файл mmc.c из примеров Elm Chan`a, описываем макросы реализующие spi и после этого можем работать с SD картой.

Немного заморочено, но если один раз разобрался, то все становится понятно.

Итак, я все это проделал и теперь могу использовать SD карту.

И чтобы показать, что это действительно работает, я написал проект, в котором микроконтроллер читает с SD карты wav файл и воспроизводит.

Воспроизведение звука микроконтроллером

Поскольку проект исключительно демонстрационный, я не гнался за качеством звука, а постарался сделать код как можно более простым. В качестве файла для воспроизведения я взял произвольный mp3 трек (мне попалась песня группы Prodigy) и перекодировал его в wav файл с такими параметрами: 8 бит, 22 кГц, моно.

Для конвертирования файла я использовал видео редактор Sony Vegas, но можно найти программу и попроще. Например, такая функция есть во многих аудио редакторах вроде Sound Forge, WaveLab, Cool Edit и т.д. “8 бит” – это разрядность одной выборки аналогового сигнала.

Звук хорошего качества обычно имеет разрядность 16 (CD качество) или 24 бита (студийная запись), но для микроконтроллерной “говорилки” 8-и разрядов хватит за глаза. “22 кГц” – это частота дискретизации. То есть частота, с которой из аналогового сигнала “брались” выборки.

С этой же частотой мы должны преобразовывать цифровые выборки сигнала в аналоговые напряжения. Цифровой звук хорошего качества обычно имеет частоту дискретизации 44.1 кГц (CD качество), 96 кГц ( студийная запись) и т.д. “моно” – означает одну звуковую дорожку, которая будет воспроизводиться как в правом, так и в левом аудио каналах.

Итак, для воспроизведения wav файла с параметрами 8 бит, 22 кГц, моно, нам понадобится одноканальный 8-и разрядный ЦАП, способный формировать на выходе аналоговые напряжения с частотой 22 кГц.

Поскольку у большинства AVR`ок нет встроенного цифро-аналогового преобразователя, мы можем использовать следующие варианты:- аппаратный ШИМ,- программный ШИМ, – внешний интегральный ЦАП,- внешняя схема ЦАП`a .Реализация программного ШИМ`a требует от микроконтроллера большого быстродействия, поэтому я не захотел с ним связываться.

Внешний ЦАП обычно использует SPI, который нужен для SD карты. Внешняя схема ЦАП`а, например схема R-2R, неплохой вариант, но под нее нужно отдать целый порт микроконтроллера. Исходя из этого, я остановил свой выбор на аппаратном 8-и разрядном ШИМ`е. Во первых, эта функция есть во всех микроконтроллерах AVR, а во-вторых, для реализации ЦАП`а требуется всего один вывод микроконтроллера.

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

С какой частотой можно формировать аналоговые напряжения с помощью ШИМ? Это зависит от трех параметров: тактовой частоты микроконтроллера, делителя таймера и его разрядности. Например, для 8-и разрядного ШИМ сигнала при тактовой частоте микроконтроллера 16 МГц можно получить следующие частоты.

Тактовая частота микроконтроллера Fcpu = 16000000 ГцТактовая частота таймера Т0 Ftim = Fcpu/k , где k – 1, 8, 64, 256, 1024.

Частота ШИМ сигнала Fpwm = (Fcpu/k)/2^8 = Fcpu/(k*256) при k = 1 Fpwm = 62500при k = 8 Fpwm = 7812при k = 64 Fpwm = 976при k = 256 Fpwmn = 244при k = 1024 Fpwm = 61Ближайшая частота к требуемым 22 килогерцам – это 7812, но такая частота не подойдет. Файл, воспроизводимый с такой частотой, будет уж слишком замедленным.

Надо подобрать такую тактовую частоту микроконтроллера, при которой можно получить требуемую частоту формирования аналоговых напряжений. Неплохой результат получается при 6 МГц и k = 1Fcpu = 6000000 ГцFan = 6000000/(2^8 * 1) = 23437 Гц Звуковой файл будет немного ускоренно воспроизводиться, но на слух это почти незаметно.

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

Тут понадобится буфер, условно состоящий из двух одинаковых половинок. Пока одна часть буфера заполняется данными с SD карты, из другой части буфера данные передаются в ЦАП (в нашем случае таймеру). Нужно только выбрать такой размер буфера, при котором эти два процесса не будет “наезжать”друг на друга. Я подбирал размер буфера следующим образом.

Задал максимальную частоту SPI модуля микроконтроллера atmega16 и посмотрел сколько времени затрачивается на чтение данных с SD карты. То есть сколько времени выполняется функция pf_read(..). При тактовый частоте Fcpu = 6 МГц эта функция выполнялась ~2.5 мс, но иногда попадались циклы по 5 мс (наверное из-за чтения на границе секторов ..

напишите в комментариях, если знаете). Причем это время не зависело от количества данных – и 32, и 64, и 128 байт читались за одно и то же время. Затем я посчитал сколько данных будет передано в ЦАП за время 5 мс. Частота нашего псевдо ЦАП`a = 23437 Гц, соответственно период = 42.6 мкс. Делим 5 мс на 42.6 и получаем искомую цифру.n = 0.

005/(1/23437) = 117 То есть за 5 мс микроконтроллер выдаст 117 выборок сигнала, при этом за это же время успеет прочитать с карты 128 выборок. Получается, что если взять буфер размером 256 байт микроконтроллер будет успевать выполнять обе задачи и даже остается небольшой запас времени. Он, кстати, необходим, потому что в процесс чтения данных с SD карты, будут вклиниваться прерывания таймера Т0.

Так я и сделал. Выбрал размер буфера равным 256 байт.

Схема для проекта

Схема питается от двух стабилизаторов – 3.3 В и 5 В. Как вариант можно запитать все схему от 3-х вольтового источника (тогда даже не понадобятся преобразователи уровней) или понизить 5-и вольтовое напряжение с помощью трех последовательно включенных диодов и запитать таким образом SD карту.

Микроконтроллер тактируется от внешнего кварцевого резонатора с частотой 6 МГц. SD карта подключена к микроконтроллеру по одной из приведенных ранее схем.

Для преобразования ШИМ сигнала в постоянное напряжение используется низкочастотный RC фильтр из двух каскадов. Частота среза фильтра около 10 кГц, что соответствует полосе воспроизводимого цифрового сигнала.

Для индикации состояния устройства используется светодиод LED1. Если карта не считывается в момент включения устройства, светодиод начинает моргать.

Код проекта

Все основное действо заключено в файле main.c. При старте программы происходит инициализация переменных и настройка выводов – настраивается ШИМ выход и выход для светодиода. Затем монтируется SD карта, открывается файл под названием 1.wav и из него (в буфер) читаются 256 байт. Далее проверяется результат выполнения операций с картой.

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

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

Оно сделано предельно коротким. В микроконтроллер загружает в регистр сравнения OCR0 содержимое ячейки буфера, на которую указывает индексная переменная, а затем инкрементирует ее. Поскольку размер буфера равен 256 байт, индексную переменную не приходится проверять на граничное значение.

Автомат, заполняющий буфер данными, проверяет индексную переменную. И по ее значению “понимает” в какую часть буфера можно писать данные.

Неиспользуемые функции библиотеки Petit FatFs я отключил в файле pff.h.

Из недостатков проекта можно отметить два момента:- при воспроизведении не пропускается заголовок wav файла- когда wav файл заканчивается таймер выключается, не “доигрывая” оставшееся содержимое буфера.

//****************************************//// Author(s)…: Pashgan//// Target(s)…: Mega16//// Compiler….: GCC //// Description.: Воспроизведение wav файла с SD карты////****************************************#include “compilers_4.h”#include “diskio.h”#include “pff.h”/* выводы микроконтроллера */#define LED_PORT PORTD#define LED_DIR DDRD#define LED_PIN 4#define PWM_PORT PORTB#define PWM_DIR DDRB#define PWM_PIN 3/* буфер */#define BUF_SIZE 256UL#define HALF_BUF ((BUF_SIZE)/2)uint8_t buf[BUF_SIZE];/*переменные для доступа к SD*/FATFS fs;WORD s1;FRESULT res;/*остальные переменные*/typedef enum{ST_LOW_BUF, ST_HI_BUF, ST_STOP}state_t;static state_t st;static volatile uint8_t i;static char f[] = “1.wav”;int main( void ){ st = 0; i = 0; /*настройка шим выхода*/ PWM_DIR |= (1

Источник: http://chipenable.ru/index.php/programming-avr/item/212

Проигрываем звук при наведении курсора мыши на элемент

Если сделать запрос поисковым серверам на тему проигрывания звука с помощью CSS, то вы найдете:

  1. Ссылки на материалы о Counter Strike: Source.
  2. Что-нибудь о play-during и cue-before и подобных многообещающих моментах, но ничего конкретного о том, как издать писк при наведении курсора мыши на пункт меню.

Звук является частью дизайна и способность проигрывать/запускать звуковые ролики должна присутствовать в CSS, но увы… ее пока нет. Чтобы проиграть звук при прохождении курсором мыши определённой области нам придется полагаться на HTML5 или Flash.

Но кто в наше время захочет связываться с Flash?  Поэтому обратимся к HTML5, который может проигрывать звук с помощью своего элемента  (Firefox 3.5+, Chrome 3+, Opera 10.5+, Safari 4+, IE 9+).

Чтобы обеспечить поддержку данной функции как можно большим числом браузеров будем использовать и MP3 источники (WebKit и IE) и OGG (Firefox и Opera).

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

Если вы вставите выше приведенный код на страницу, то ничего не увидите и не услышите. Для вывода небольшого проигрывателя нужно использовать атрибут controls (). Если нужно только проигрывать звук без каких-либо видимых элементов управления, то надо использовать атрибут autoplay (). Или можно использовать оба атрибута вместе …

Нашей целью является проигрывание звука, когда курсор мыши оказывается над определённым элементом. К сожалению,  мы не можем управлять элементом из CSS, поэтому потребуется использовать JavaScript:

var audio = document.getElementsByTagName(“audio”)[0]; audio.play(); // или с использованием ID var audio = document.getElementById(“mySoundClip”); audio.play();

Будем использовать jQuery, потому что он существенно облегчает выбор и работу с элементами.

var audio = $(“#mySoundClip”)[0]; audio.play();

Вот так выглядит код, который проигрывает звук, когда курсор мыши проходит над определенным элементом:

var audio = $(“#mySoundClip”)[0]; $(“nav a”).mouseenter(function() { audio.play(); });

Пример из реальной жизни

На сайте Goodfoot используется подобная технология для проигрывания разных звуков, когда курсор мыши проходит над ртом снежного человека (работает в браузерах Webkit). Данный эффект выполнен встраиванием нового элемента audio в структуру DOM каждый раз, когда курсор мыши проходит над ртом снежного человека:

$(“#speak”).mouseenter(function(){ $(“”).attr({ 'src':'audio/'+Math.ceil(Math.random() * 5)+'.mp3', 'volume':0.4, 'autoplay':'autoplay' }).appendTo(“body”); });

Метод можно немного улучшить, добавив поддержку файла OGG:

function addSource(elem, path) { $('').attr('src', path).appendTo(elem); } $(“#speak”).mouseenter(function(){ var audio = $('', { autoPlay : 'autoplay' }); addSource(audio, 'audio/'+Math.ceil(Math.random() * 5)+'.mp3'); addSource(audio, 'audio/'+Math.ceil(Math.random() * 5)+'.ogg'); audio.appendTo('body'); });

Другой способ добиться подобного эффекта – нужно разместить несколько элементов audio на странице сразу:

… источник … … источник … … источник …

И случайным образом выбирать один для проигрывания:

$(“#speak”).mouseenter(function() { $(“#sound-” + Math.ceil(Math.random() * 3))[0].play(); });

Пробы и проблемы: наложение звуков

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

play() будет производиться до того, как закончится предыдущее звучание. Один элемент audio не может воспроизводить звук с перекрытием. Новый запрос на проигрывание из функции .

play() просто игнорируется, пока не закончится запущенное звучание.

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

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

$(“nav a”) // цикл по всем пунктам меню .each(function(i) { if (i != 0) { // Клонирование нужно только в случае более одного пункта $(“#beep”) .clone() .attr(“id”, “beep-” + i) .appendTo($(this).parent()); } $(this).data(“beeper”, i); // сохраняем ссылку }) .mouseenter(function() { $(“#beep-” + $(this).data(“beeper”))[0].play(); }); $(“#beep”).attr(“id”, “beep-0”); // изменяем первый элемент в соответствии с условиями именования

Источник: https://ruseller.com/lessons.php?id=1041&rub=29

:: САМОДЕЛЬНЫЙ ПЛЕЕР НА МИКРОКОНТРОЛЛЕРЕ ::

Источник: http://samodelnie.ru/publ/samodelnye_pribory/samodelnyj_pleer_na_mikrokontrollere/5-1-0-50

Делаем внешнюю USB звуковую карту. Часть 1. Stereo Audio USB CODEC PCM2902

Этот цикл статей будет посвящен сборке в домашних условия внешней USB звуковой карты для ПК.
Итак, думаю не я один использую персональный компутер как источник аудио сигнала.

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

В самодельной звуковой карте хотелось так же, чтобы были аналоговые входы — мож чего записать захочется. Выбор свой я все таки остановил на микросхеме PCM2902 — 16-ти битном дельта — сигма АЦП-ЦАП. Вот даташит на этого «зверька» — PCM2902.

Итак, рассмотрим что же можно получить от этой микросхемы! Как оказалось, довольно много!

Приступим!

Основные технические характеристики Характеристики при VBUS= 4.84 V, VCCCI = 3.5 V:

ЦАП

Частота дискретизации — 32, 44.1, 48 KHz Потребляемый ток — 90 мA Номинальное выходное напряжение — (0 dB) 1,1В RMS Верхний предел диапазона — (-3 dB) 22.7 kHz (fs = 48 kHz) Частота среза пост-фильтра — 28 kHz Выходное сопротивление – 100 Ом Отношение сигнал/шум > 95 dBA КНИ + шум — (1 kHz) 0.005% (B = 22 kHz) Разделение каналов > 99 dB (1 kHz), при > 76 dB (20 kHz)

АЦП

Частота дискретизации — 8, 11.025, 16, 22.05, 32, 44.1, 48 kHz Уровень входного сигнала — 2,1В Входное сопротивление — 10 кОм КНИ + шум — (1 kHz, -0,5 dBFS) 0.01% (B = 22 kHz) Разделение каналов > 73 dB (1 kHz), при > 47 dB (20 kHz) Да, параметры довольно неплохи. Этот кодек кроме аналогового входа и выхода имеет на борту так же цифровой S/PDIF вход-выход.

Полная поддержка USB 1.1 спецификации. Работает в полно — дуплексном режиме. Вот блок-схема PCM2902:Вот основная схема включения из даташита.Вот назначение выводов:Дальше был поиск в сети информации о применении данной микросхемы. Пересмотрев кучу забугорных сайтов, начитавшись форумов, была немного модернизирована схема включения, а именно: 1.

Сразу было решено избавиться от питания по USB. Так как если питать устройство от USB порта, то можно натянуть много «цифрового мусора», который гуляет по шинам питания ПК. Для обеспечения наилучшего качества аналого-цифрового конвертирования рекомендуется питать пин VCCCI от отдельного стабилизатора с выходным напряжением 3,3В. 2.

В земляную цепь этого стабилизатора необходимо включить диод, который поднимает напряжение на выходе стабилизатора до 3,5В, что минимизирует искажения АЦП. 3. Необходимо разделить цифровую и аналоговую «землю» — это тоже уменьшает количество помех, попадающих от ПК. 4. Отказался от S/PDIF входа-выхода — они мне просто не нужны. 5.

PCM2902 имеет интересный собственный контроль за уровнем громкости HID (Human Interface Device), кнопками, которые подключены к входам HID0, HID1, HID2 можно, соответственно, управлять режимами ТИХО, ГРОМКОСТЬ + и ГРОМКОСТЬ –, что исключает необходимость двигать ползунки в микшере на ПК.

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

Вывод 28 микросхемы является индикатором состояния, в котором находится микросхема — высокий уровень — рабочее состояние, низкий уровень — отключенное состояние. Тут можно использовать этот вывод за контролем над состоянием кодека. В итоге, родилась вот такая схема:
Крупнее Немного пояснений к схеме: 1. Светодиод LED1 сигнализирует о подключении устройства к USB порту ПК. 2.

Конденсаторы C3, С4, через которые входной сигнал поступает на кодек, желательно брать пленочные качественные. 3. Обязательно разделить аналоговую и цифровую «землю», на схеме это сделано при помощи FB1 — безвитковый дроссель, который представляют собой ферритовое кольцо на токоведущем проводе. Их иногда называют «ферритовыми бусинами». Вот как выглядит такая штука
4.

Питание аналоговой части микросхемы PCM2902 производится при помощи стабилизатора IRU1117-33 В минусовой вывод стабилизатора включен кремневый диод 1N4148, благодаря ему на выходе стабилизатора имеем 3,5 вольт. 5. К выводу 28 микросхемы подключен транзисторный ключ, нагруженный светодиодом LED2.

Когда микросхема подключена к порту USB и работает в штатном режиме, то этот светодиод не светится, если нарушилась связь с портом или микросхема «зависла» — загорается светодиод. 5. Сигнал, снимаемый с аналоговых выходов микросхемы проходит через пассивный LPF фильтр с частотой среза около 28кГц.

Это сделано для того, чтобы в выходном сигнале избавится от «огрехов» цифрового квантования. В дальнейшем планируется добавить активный фильтр на ОУ. 6. Кнопки S1-S3 «на любителя». Мне например не нравится громкость кнопками на панели регулировать. В дальнейшем буду делать регулировку громкости резистором и с помощью ИК пульта. Теперь по поводу источника питания.

Так как у меня валяется много 9-ти вольтовых импульсных бп от сетевых концентраторов, то решил применить их.Снимаемое с них напряжение 9 вольт поступает на два независимых стабилизатора 5 вольт. Стабилизаторы выполнены на микросхемах LM317, включенных по своей стандартной схеме включения. Подстроечными резисторами R2, R4 выставляется напряжение на выходе, равное 5 вольтам.

Вот собственно схема:Так, со схемой разобрались, теперь приступаем к монтажу. Устройство было собрано на двух платах — собственно сама микросхема с обвязкой и плата стабилизаторов напряжения. Микросхема PCM2902 изготавливается только в корпусе SSOP-2Так, что паять ее на плату нужно очень аккуратно. Была разработана печатная плата и все на нее смонтировано.

Сперва запаял все SMD компоненты. Немного намудрил со стабилизатором на 3,3 вольта. Неправильно развел вход и выход. Пришлось резать дорожки и соединять проводниками.

Немного фото запаянной микросхемы
Для сравненияДалее смонтировал все выводные компонентыНа электролите — это немного флюса из шприца попало, он новый, не вспухший))) Вот фото платы стабилизаторов напряженияВот LM317 в корпусе ТО-252, были только такие.

После монтажа микросхемы PCM2902, если применяли флюс, обязательно тщательно его вымыть растворителем, иначе потом будут жестокие «зависания». До запайки микросхемы желательно собрать на плате стабилизатор на 3,3 вольта, и подобрать диод VD1 до получения на выходе 3,5 вольта. После того как собрал все это дело в «кучу» пришел черед проверки.

Подаем питания на плату, проверяем питание на ногах микросхемы. Теперь подключаем USB провод к ПК. Драйвера для этой микросхемы уже есть в Windows, за что большое спасибо дядькам из Microsoft)))) На моем ПК стоит Windows 7. Значит так, подключил я собранную плату к USB порту. Windows тут же крякнул о подключении нового устройства и нашел и установил на него драйвера.

PCM2902 определяется как USB Audio codec.Чтоб удостоверится, что все определилось заходим в Диспетчер устройств и видим следущее:Все отлично, все определилось! Теперь надо немного все настроить! Заходим в панель управления — оборудование и звук — звук. И видим там следущее:Наш USB Audio codec должен быть устройством по умолчанию, если нет, то делаем его таковым.

Встроенную звуковую карту можно отключить там же. Теперь нажимаем на кнопочку Свойства. Появляется меню Свойства. Заходим на вкладку дополнительно и в поле Формат по умолчанию выставляем 2 канала 16bit, 48000Гц.Теперь переходим на вкладку Запись. Выбираем микрофон USB Audio codec по умолчанию и нажимаем кнопку свойства. Выбираем вкладку Прослушать и ставим все как на картинке.

Теперь заходим в вкладку Дополнительнои в поле Формат по умолчанию выставляем 2 канала 16bit, 48000Гц.Ну вот, собственно, настройка и закончена. Можно подключить к аналоговому выходу усилитель и послушать музыку.

Правда тут в выходном сигнале будет слышаться легкий свист, так как у нас стоит пассивный пост-фильтр нижних частот, чтоб полностью от этого избавится потом будет собран активный фильтр. Но, несмотря на это звук вполне достойный, намного лучше чем встроенная звуковуха выдавала. Теперь потестим все это хозяйство программой RightMark Audio Analyzer 6.2.3. Для этого вход каждого канала соединяем с его выходом. Запускаем программуВыставляем 16bit, 48kHz. Нажимаем кнопку Режимы. Тут программа выдаст все режимы, в которых может работать наша самодельная звуковая карта.Потом нажимаем на кнопку Пинг. программа проверит возможность записи и воспроизведения устройства.Далее в блоке, где написано Начать тесты нажимаем на красную кнопку с символом динамика внутри Воспроизведениезапись. Появятся вот такие окна, с помощью микшера Windows необходимо выставить оптимальный уровень сигнала. В это время программа генерирует тестовый сигнал.После прохождения теста программа генерирует отчет. Вот что получилось.

USB Audio CODEC Тест программы RightMark Audio Analyzer Тестируемая цепь: External loopback (line-out — line-in) Режим работы: 16-bit, 48 kHz

По тесту программы параметры тоже не плохи, да и субъективная оценка «на слух» прошла очень успешно! Звук нравится, такой плотный, не резкий, словами не передать, надо слушать!

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

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.

Источник: http://electronics-lab.ru/blog/audio/122.html

Воспроизведение однотональных мелодий с помощью AVR

Дата публикации: 15 мая 2011.

Рейтинг:  4 / 5

где N – коэффициент пересчета предварительного делителя, вместо OCR1A в нашем случае ICR1.

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

Коды таких мелодий еще можно найти в интернете и в дальнейшем поменять в исходном тексте. Также важно понятие как длительность тона – это время звучания одной ноты, она выражается долями от целой.

В общем за проигрывание ноты у нас отвечает функция Play_LE.

Кроме нот любая мелодия содержит паузы, это промежуток времени когда ни один звук не звучит. за паузы отвечает функция Set_temp, она попросту в нужное время отключает таймер/счетчик.

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

/*** Воспроизведение однотональных мелодий ***/ #include #define A2 9008 // Ля (2 октава) #define Ais2 8580 // Ля диез #define B2 8098 // Си #define C3 7644 // До (3 октава) #define Cis3 7214 // До диез #define D3 6810 // Ре #define Dis3 6427 // Ре диез #define E3 6066 // Ми #define F3 5726 // Фа #define Fis3 5404 // Фа диез #define G3 5101 // Соль #define Gis3 4815 // Соль диез #define A3 4544 // Ля #define Ais3 4289 // Ля диез #define B3 4049 // Си #define C4 3821 // До (4 октава) #define Cis4 3607 // До диез #define D4 3404 // Ре #define Dis4 3213 // Ре диез #define E4 3033 // Ми #define F4 2862 // Фа #define Fis4 2702 // Фа диез #define G4 2550 // Соль #define Gis4 2407 // Соль диез #define A4 2272 // Ля #define Ais4 2144 // Ля диез #define B4 2024 // Си #define C5 1910 // До (5 октава) #define Cis5 1803 // До диез #define D5 1702 // Ре #define Dis5 1606 // Ре диез #define E5 1516 // Ми #define F5 1431 // Фа #define Fis5 1350 // Фа диез #define G5 1275 // Соль #define Gis5 1203 // Соль диез #define A5 1135 // Ля #define Ais5 1072 // Ля диез #define B5 1011 // Си #define C6 955 // До (6 октава) #define Cis6 901 // До диез #define D6 850 // Ре #define Dis6 803 // Ре диез #define E6 757 // Ми #define LE32 1*3 // 1/32 Длительность тона #define LE16 2*3 // 1/16 #define LE16D 3*3 #define LE16T 2*2 #define LE8 4*3 // 1/8 #define LE8D 6*3 #define LE8T 4*2 #define LE4 8*3 // 1/4 #define LE4D 12*3 #define LE4T 8*2 #define LE2 16*3 // 1/2 #define LE2D 24*3 #define LE1 32*3 // 1 void Delay_us(unsigned char time_us) // функция задержки в us { register unsigned char i; for(i = 0; i < time_us; i++) // 4 цикла { asm (" PUSH R0 "); // 2 цикла asm (" POP R0 "); // 2 цикла // 8 циклов = 1 us для 8MHz } } void Delay_ms(unsigned int time_ms) // функция задержки в ms { register unsigned int i; for(i = 0; i < time_ms; i++) { Delay_us(250); Delay_us(250); Delay_us(250); Delay_us(250); } } unsigned char temp; void Set_temp(unsigned char number) // функция установки темпа и паузы { temp = number; // установка темпа TCCR1A = (1

Источник: https://radioparty.ru/all-files/finish/4/284

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

�?нтересное и необходимое направление, которое я считаю нужным осветить — это, конечно же, запись, хранение и воспроизведение звука.

Цифровые диктофоны, автоответчики, голосовые меню, устройства оповещения, дверные звонки, игрушки — вот далеко не полный перечень устройств, где необходимо решать проблему записи, хранения и воспроизведения звука. Для решения такого вопроса воспользуемся существующими наработками ATMEL, а именно AVR335.

Для тех, кто не дружит с английским имеется перевод на сайте gaw.ru. Скажу вам стоит распечатать этот документ — получится хороший годный учебник в виде брошюры. Вот такой как у меня:

Вообще, коллеги, у меня масса подобных самодельных брошюр и даже книг. Брошюрами я сшиваю разделы даташитов на АРМ-ы (для АВР имеется книга Евстифеева А.В.), мануалы и аппноуты на некоторые комплектующие. Книгами оформил Ю. Ревича,  Д. Трампета и некоторые другие.

В документе AVR335 понятным языком подробно расписаны процессы записи, хранения и воспроизведения звука, при использовании любого микроконтроллера AVR с АЦП, памяти AT45DB161 DataFlash и нескольких внешних компонентов.

Это руководство подробно описывает использование: АЦП для записи звука, последовательного интерфейса (SPI) для доступа к внешней памяти DataFlash и широтно-импульсной модуляции (Ш�?М) для воспроизведения. В нём также доходчиво определены технические термины по теме.

В AVR335 используется уже устаревший контроллер AT90S8535. Без изменений кода схему можно реализовать на ATmega8535, но у меня имеется прекрасный модуль ATmega128kit, на котором уже установлена память, все кнопки, светодиоды и прочее.

Поэтому я переписал исходный код для микроконтроллера ATmega128 в привычном мне WinAVR. Память, установленная на борту кита, — это AT45D321D. Её объём в два раза больше (32 мегабита) чем у использованной в аппноуте, т.е. можно записать не 4 1/4 минут, а 8 с половиной, что вполне достаточно для большинства конструкций.

Для преобразования выходного Ш�?М-а в звук я собрал фильтр Чебышева, предложенный в аппноуте. В состав этой платы также входит микрофонный усилитель собранный на первом ОУ из четырёх составляющих LM324. Вот её вид со стороны элементов:

А здесь со стороны печати:

Собирался этот фильтр из деталей, которые были под рукой, поэтому наблюдаем и выводные элементы, и смд-шные. Кроме того, чтобы выводить звук на динамик,а не на наушники, я собрал простейший УНЧ на микросхеме LM386 согласно типовой схеме.

Потом всё это добро слепил в макет:

Динамик и микрофон китайские из подножного корма

Источник: http://www.embed.com.ua/mikrokontrollernyiy-konstruktor/zapis-i-vosproizvedenie-zvuka-mikrokontrollerom-avr-application-note-avr335/

Вопросы выбора микроконтроллера для аудио приложений

Журнал РАДИОЛОЦМАН, июль 2012

Lee H. Goldberg, Electronic Products

Digi-Key

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

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

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

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

Характеристики звуковых сигналов

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

Хотя фактический размер выборки, используемой конкретным приложением, может составлять от 8 до 24 бит, мы ограничим рассмотрение диапазоном 12 … 16 бит.

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

   Хочу предложить вашему вниманию простейший способ изготовления самодельного WAV – плеера.

Данный аудиоплеер собран на микроконтроллере AVR ATtiny85 но можно использовать также применить ATtiny25/45/85. У микроконтроллеров этой серии всего восемь ножек и два ШИМ (Fast PWM) с несущей 250kHz.

Для управления картой памяти достаточно припаять 6 проводов – два для подачи питания и четыре сигнальные. 

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

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

   Тип используемой карты памяти – MicroSD. Конечно можно подключить стандартную SD карту или MiniSD предварительно посмотрев их распиновки или же можно использовать переходники. Динамики напрямую подключены к выходам ШИМ. Громкость динамиков конечно невелика, но для подключения к активным колонкам этого вполне достаточно.

Выход контролера можно подключить к активным колонкам (колонки с усилителем мощности), таким образом можно получить более громкий звук. При считывании файлов с карты памяти используется файловая система FAT. В данном проекте использовался Petit-FatFs – урезанный FatFs. Petit-FatFs был разработан для микропроцессоров с очень малым объёмом оперативной памяти, меньше пол килобайта.

Он великолепно подходит для микроконтроллеров серии tiny из семейства AVR.

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

При переключении fuse-бита RSTDISBL, прошивку нужно производить в режиме HVSP (High Voltage Serial Programming), ее поддерживают не все программаторы.

С помощью ISP возможно прошить микроконтроллер, но только раз: после установки fuse-бита RSTDISBL программирование ISP запрещено! (для стерео варианта). В схеме с монофоническим воспроизведением переключать fuse-бит RSTDISBL не нужно. 

   Данный проигрыватель поддерживает исключительно WAV файлы формата PCM 8/16 бит, стерео или моно с частотой дискретизации максимум до 48kHz .

Воспроизведение аудио фалов из корневой директории плеера начинается при подаче питания или при подключении карты памяти. При нажатии на кнопку воспроизводится следующий файл.

Как видно из схемы – проще некуда, дополнив плеер маленькими колонками мы получаем высококачественный проигрыватель формата WAV, а при желании проигрыватель можно дополнить усилителем низкой частоты.

Поделитесь полезными схемами

   Хочу предложить для повторения схему дистанционного управления персональным компьютером. Эта схема проста в сборке и не требует больших усилий в настройке.
   Самодельный шумомер выполнен в виде игрушечного домика для паука и может использоваться для контроля за соблюдением тишины в классе, в котором отсутствует учитель (например, во время урока). Учитель, выходя из класса, настраивает прибор на определенный уровень шума. Для того чтобы не «разбудить» паука, дети должны сидеть тихо и не шуметь. Если паук спокойно «спит» в своем домике, значит, дети сидели спокойно, и их можно похвалить. Если же в отсутствие учителя дети в классе начинают разговаривать, ходить по классу, уровень шума повышается и из домика вылезает паук с горящими глазами.
     Двоично-десятичный дешифратор. Данное устройство иллюстрирует перевод чисел из двоичной системы в десятичную, что необходимо при получении конечного результата вычислений. В дешифраторе применены 4 тумблера, символизирующие разряды двоичных чисел, индикаторная лампа высвечивает числа от 1 до 10 десятичной системы счисления.  
    В последнее время пользователи обращаются с просьбой помочь со схемой преобразователем для Гаусс пуки. На сегодня, единственная схема, которая соответствует всем требованиям – это знаменитая схема Вальдемара.
   Небольшая радиолюбительская мини дрель сделанная своими руками, специально для сверления отверстий в печатных платах из фольгированного стеклотекстолита.

Таблица 1. Особенности обычных источников звука.

Источник звука

Частоты

Типичная частота дискретизации

Тональный сигнал, зуммер

Обычно, синусоидальный сигнал с частотой
в диапазоне 3 кГц

В 2 или 4 раза выше частоты тонального сигнала с наибольшей

частотой.

DTMF сигналы

Сумма двух синусоидальных сигналов со
стандартной частотой от 500 Гц до 3 кГц

7.2 кГц или выше

Сигнализация

Обычно, сигнал с частотой, изменяющейся во
времени в определенном диапазоне

В два раза больше самой высокой
частоты сигнала

Человеческая речь

Можно рассматривать как взвешенную сумму сигналов с частотой от 300 Гц до 3.3 кГц. Человеческий голос способен воспроизводить

эти частоты

8 кГц; 11.02 кГц; 16 кГц

Музыка, музыкальные
инструменты

Можно рассматривать как взвешенную сумму сигналов в диапазоне частот от 20 Гц до 20 кГц. Человеческое ухо способно воспринимать эти

частоты

32 кГц (достаточно для большинства музыкальных инструментов); 44 кГц (качество CD диска);

48 кГц (звуковая плата ПК)

Источник: https://www.rlocman.ru/review/article.html?di=134035

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}