Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

MMC/SD WAV стерео плеер на ATmega32 с ПДУ

Это мой первый и самый успешный проект на микроконтроллерах AVR. Несколько месяцев назад я попытался сделать WAV плеер на PIC16F877A. Он работал, но качество звука было не очень хорошим, потому что у него не было достаточного объема оперативной памяти, и я не смог сделать достаточный буфер данных. Когда я купил микроконтроллер ATmega32, первое, что пришло мне в голову - сделать хороший WAV плеер. Я закончил свою работу и качество звука действительно хорошее. Я могу сказать, что мой WAV плеер способен воспроизводить 8-битное моно /стерео с максимальным битрейтом 1300kbps для моно и 1600kbps для стерео. Т.е. можно играть 8-битное WAV моно с частотой дискретизации до 160 кГц и стерео до 96 кГц без шума!

Примечание: Полный спектр человеческого слуха составляет от 20 Гц до 20 кГц. Минимально достаточная частота дискретизации 40 кГц. Именно для этого частота дискретизации 44,1 кГц была выбрана для компакт-диска.

Я считаю, что это идеальный 8-битный WAV- стерео плеер. Я не нашел отличий между качеством звука с компьютера и этим плеером. Видео снималось мобильным телефоном, поэтому возможны потери качества звука. Поскольку ШИМ имеет некоторые ограничения, я пытался использовать R-2R ЦАП, но не заметил существенных улучшений.
Еще одной интересной особенностью плеера является то, что он может управляться с пульта от ТВ Philips (протокол RC5). Пультом можно переключатся между следующей и предыдущей песней, включать воспроизведение, ставить на паузу, включать некоторые забавные эффекты, такие как увеличение или уменьшение скорости воспроизведения. Программа для работы с MMC картой памяти не писалась с нуля, а была взята готовая.

Плеер на макетной плате

Возможности:

  • Дистанционное управление
  • Высокое качество на выходе
  • Максимальная скорость передачи данных - 144 Кб / сек.
  • Поддержка стерео
  • Автоматический возврат в начало после окончания всех песен
  • Дополнительная регулировка битрейта с пульта
  • Установка задержки перед воспроизведением

Краткое описание работы:

Инициализация MMC карты и работа с ней была описана ранее тут.

Я использую дисплей 16x2 для отображения многих вещей. Сначала он при необходимости отображает сообщение об ошибке при попытке инициализации MMC. Когда инициализация проходит успешно, он показывает сообщение об этом.

Потом проверяется загрузочный сектор карты MMC (сектор 0), чтобы проверить файловую систему карты. Для этого нам нужно прочитать сектор 0 карты MMC и копировать его в буфер (для  этого задействовано 512б буфера). Мой код предназначен только для файловой системы FAT16, если на карте другая файловая система, он выдает сообщение об ошибке на дисплей. Если всё в порядке, то он читает данных из буфера и вычисляет номер сектора с началом данных, начало FAT и начало корневого каталога. Кроме того, он обнаруживает секторы кластеров. Каждый сектор это 512 байт. Эти данные необходимы для дальнейшей работы MMC / SD карт, хранятся как глобальные переменные.

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

Теперь мы можем прочитать первый кластер (группу секторов, размер зависит от размера памяти MMC / SD). Теперь, после чтения и воспроизведения всех секторов, в первой группе (проигрывание будет описано далее), то мы должны найти следующий номер кластера того же файла. Файл не может быть распределен в памяти как один раздел. Вместо этого, он может быть разделен на части, чтобы использовать свободную память эффективно (На самом деле это происходит только тогда, когда есть свободное место от удаленных файлов и добавлены новые). Таким образом, мы не можем сказать, что следующий кластер файла будет ближайшим. Но для чтения каждого файла есть список кластеров FAT (File Allocation Table), в котором каждый номер кластера имеет уникальную позицию. Мы уже вычислили начальный адрес FAT. С FAT мы можем получить следующий номер кластера в файле.

У нас есть номер первого кластера, и мы рассчитали начальный адрес сектора с определенным числом кластеров. Теперь мы читаем данные из первого сектора файла и оттуда мы получаем битрейт, частоту дискретизации, количество каналов и многое другое. Возьмем битрейт, и использовать его, чтобы установить частоту прерывания таймера. Теперь таймер генерирует прерывания в зависимости от битрейта и количества канала. Теперь на каждом прерывании таймера, 8 бит данных вводится в регистр OCR модуль таймера ШИМ. Соответственно, генерация ШИМ сигнала идет в фоновом режиме без затрат каких-либо ресурсов процессора. Этот сигнал ШИМ может быть легко демодулирован при помощи RC фильтра. Если значение конденсатора или резистора увеличивается или уменьшается , это повлияет на качество звука, т.е. он может не отфильтровать некоторые высокие частоты и можно услышать сигнал AM радио.

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

Для декодирования сигнала телевизионного пульта мы используем прерывания таймера, проверяя входящей сигнал каждые 1778мс. При включении питания происходит задержка 400мс перед началом считывания сигнала с пульта. Возможно, плеер будет реагировать на сигнал с пульта со второго раза. Чтобы этого надо декодировать RC5 вне atmega32 и отправить значения через последовательный интерфейс для лучшей производительности.

Схема плеера

Кварц я использовал на 16.450 МГц, т.к. под рукой не оказалось 16 МГц. Это никак не повлияло на работу микроконтроллера.

Фото работы:

Плеер в работе

Плеер в работе

Fuse: LFUSE = 0b11101111

Скачать ПО можно здесь

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
МК AVR 8-бит
ATmega32
1 Поиск в магазине ОтронВ блокнот
ИК-приемникTSOP17381 Поиск в магазине ОтронВ блокнот
Конденсатор0.01 мкФ3 Поиск в магазине ОтронВ блокнот
Конденсатор0.1 мкФ2 Поиск в магазине ОтронВ блокнот
Электролитический конденсатор47 мкФ1 Поиск в магазине ОтронВ блокнот
Электролитический конденсатор220 мкФ1 Поиск в магазине ОтронВ блокнот
RV1 Подстроечный резистор1 Поиск в магазине ОтронВ блокнот
Резистор
100 Ом
1 Поиск в магазине ОтронВ блокнот
Резистор
470 Ом
1 Поиск в магазине ОтронВ блокнот
Резистор
2.2 кОм
3 Поиск в магазине ОтронВ блокнот
Резистор
3.3 кОм
3 Поиск в магазине ОтронВ блокнот
Резистор
4.7 кОм
4 Поиск в магазине ОтронВ блокнот
Кварцевый резонатор16.450 МГц1 Поиск в магазине ОтронВ блокнот
Светодиод1 Поиск в магазине ОтронВ блокнот
LCD-дисплей16х2 LCD1 Поиск в магазине ОтронВ блокнот
Тактовая кнопка2 Поиск в магазине ОтронВ блокнот
Слот для карты памяти ММС1 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Оригинал статьи

Прикрепленные файлы:

Теги:

none Опубликована: 2012 г. 0 1
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (13) | Я собрал (0) | Подписаться

0
sanya0605 #
А можно использовать AtMega32L-8AU?
Ответить
0
Адвансед #
Конечно можно, с одной стороны это плюс - т.к. можно будет запитать от 2х батареек по 1.5 вольт
Ответить
0
sanya0605 #
Если какие то различия между atmega32A-8AU или atmega32L-8AU (в моем городе продается только atmega32A-8AU)?
Ответить
0
Адвансед #
Советую ознакомиться с этой статьей, отпадут многие вопросы, буква L означает, что МК работает от более низкого напряжения, чем МК без буквы L, обычно это 2.7В.
Ответить
0
Sfdag #
Есть, но не большая
L - это означает, что у неё пониженное питание 3 вольта вместо 5, хотя на сколько я помню, на пониженное питание надо ставить галочку в ФУЗАХ и частота работы контроллера немного будет меньше
Ответить
0
Александр #
Чем прошить atmega 32?
Ответить
0
Адвансед #
Например вот этим
Ответить
0
mihmig #
А ардуинка на 168-й меге не сможет 8бит*44кгц проигрывать?
Ответить
0
revlerik #
Подскажите фьюзы в пони прог.
Ответить
+1
Ярослав #
А какие фьюзы выставлять при прошивки мк?
Ответить
-1
petro #
А какие фьюзы выставить после прошивки подскажите на любой программе (PROGISP Ver 1.720
Ответить
0
Vik #
Мне одному показалось странным то, что кварц стоит на 16.450 МHz при тех условиях, что мега32 максимум 16 МHz (и то при +5v) и при том, что в файле main.c макроопределение F_CPU 12000000, т.е. на 12 МHz ?
Ответить
0
1 #
И самое смешное, что 32ю мегу удалось запустить без ошибок на 32МГц
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется сила тока?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Программатор Pickit3
Программатор Pickit3
Сатфайндер Радиореле 220В
вверх