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

Проекты : Автоматика: управление, контроль, световые эффекты, реклама

Простой аудио-плеер на PIC

Этот плеер позволяет проигрывать аудио файлы в формате WAV ( PCM ) с обычных карточек памяти типа SD , которые широко распространены и доступны по цене. Для сборки нужно минимум деталей (7 шт) и сама карточка памяти. Элементарную схему плеера можно рекомендовать для повторения на школьных факультативах или в радио-кружке (при условии соблюдения всех рекомендаций). Студенты, изучающие программирование, могли бы модифицировать этот проект в направлениях, которые я озвучу ниже (исходники имеются).

Схему плеера будем рассматривать по рисунку печатной платы.

Слева на плате расположен 5-контактный ICSP разъем, через который мы будем прошивать микроконтроллер (заливать прошивку). Через этот же разъем мы подключаем питание, где 3- Vss это минус питания, а 2- Vdd это плюс питания. Диапазон питающих напряжений от 2,7В до 3,6В; в принципе достаточно двух пальчиковых батареек. Линии питания зашунтированы электролитическим конденсатором 10,0 мкФ х 6,3В.

Используется микроконтроллер PIC 12 F 1840 в корпусе для монтажа в отверстия DIP -8 (хотя можно и в корпусе для поверхностного монтажа). Сделаю небольшую рекламу: в г. Саратове я его покупал в магазине «Интерес», ул. Московская, 91, тел. (8452) 27-70-25 (во дворе в подвальчике). Цена для 8-выводного корпуса DIP -8 не совсем приятная – 75 руб, можно было бы и подешевле. Там же покупается и всё остальное.

– штыревая вилка PLS (иголки) 9 шт для ICSP разъема, динамика и джампера PROG / WORK ;

– конденсатор электролитический 10,0 мкФ х 6,3В

– конденсатор керамический 1,0 мкФ

– какой-нибудь динамик на 4-8 Ом или наушники

– два полевых транзистора 1N7000

– джампер (перемычка) для переключения режима PROG / WORK (прошивание/работа)

– панелька под микросхему DIP- 8

Будем использовать карточку типа micro — SD , а в качестве–разъема держателя будем использовать переходник-адаптер с micro — SD на обычную SD карточку. Для записи файлов нам потребуется какой-нибудь картридер. Вместо картридера можно использовать шнурок USB и фотоаппарат или телефон при условии, если они позволяют работать на ПК с карточкой памяти напрямую (форматировать и записывать файлы). В общем, это не сложно.

Итак, сделали плату, припаяли детали, микроконтроллер вставили в панель.

Приступаем к прошиванию.

Нам потребуется программатор PicKit 2.

Можно самому собрать, но без опыта проще купить готовый:

Для расширения списка поддерживаемых микроконтроллеров из PicKit 2

полученный файл PK2DeviceFile.dat вставляем с заменой в C: Program Files Microchip PICkit 2 v2 .

Ок, программа-прошивальщик готова к работе.

Как работает программатор PIcKit 2 читаем здесь.

На плате нашего плеера снимаем джампер PROG / WORK .

Подключаем программатор к вилке ICSP (первая вилка должна быть вставлена в разъем PIcKit 2, отмеченный стрелкой-треугольником)

Запускаем программу PICkit 2 v2.61. В идеале микроконтроллер PIC 12 F 1840 сам определится в программе, либо вручную его выбираем.

Меню Programmer – Manual Device Select ( ставится галочка )

Меню Device Family – Midrange – 1.8V min

В основном окне в выпадающем меню выбираем PIC 12 F 1840

Через меню File — Import Hex открываем Player.hex; окно Program Memory заполнится данными .

Нажимаем в окне кнопку «Write»; происходит процесс программирования.

Если окно сообщения у вас стало с зеленым фоном, значит микроконтроллер успешно прошит.

Теперь подготовим карточку памяти.

Нужна карточка памяти до 4 Гб, для того чтобы можно было без препятствий отформатировать и получить разметку FAT 16 (в Windows XP называется просто FAT ). Форматирование FAT 12 и FAT 32 работать не будет. У меня карточка памяти на 128 Мб (по объему не память, а склероз), которая шла в комплекте с древним мобильным телефоном. Для тестирования подойдёт. Форматировал стандартными средствами Windows XP : Мой компьютер – выбираем нашу карточку – выбираем пункт «Форматировать» и наблюдаем примерно такую картинку:

Нажимаем кнопку «Начать». Довольно быстро происходит процесс форматирования.

Следует сказать, что моя карточка была успешно отформатирована, но не работала по непонятным причинам. Быстро нашлась программа SDFormatter 3.1 Rus RE.exe в которой были выбраны опции:

ТИП ФОРМАТА: ПОЛНОЕ перезапись

ФОРМАТ, НАСТРОЙКА РАЗМЕРА: Вкл

Процесс форматирования был чуть медленным и более визуальным. В итоге у карточки стала разметка RAW (типа неопознанная). Делать нечего, принимаем предложение Windows отформатировать в FAT , что и было сделано. После этого карточка начала работать в плеере. Видимо что-то не так было с файловой системой (разметкой), которая досталась по наследству от мобильного телефона, хотя и писалось, что она FAT .

Теперь подготовим файлы для воспроизведения.

Программ для конвертации из MP 3 в WAV формат придумано много, но здесь мы рассмотрим TotalAudioConverter 2.1.exe (где найти и как подлечить – обращаемся в интернет).

Итак, при конвертации указываем следующие параметры:

8 bit (16 bit не работает)

44100 Hz (можно и другие частоты, но скорость воспроизведения изменится)

Mono ( Stereo на мой взгляд лучше играет, но и файл в 2 раза больше)

Жмём кнопку «Начать». Процесс конвертации быстрый. Полученные файлы переименовываем в формате 8+3, где 8 символов это имя файла (на английском без пробелов и спецсимволов) (допустимо менее 8 символов), 3 символа после точки это расширение файла WAV или маленькими буквами wav . Имя файла и расширение разделяются точкой.

Как включить отображение расширения файла?

Мой компьютер – меню Сервис – Свойства папки… – вкладка Вид – снимаем галочку «Скрывать расширения с зарегистрированных типов файлов»

Для примера я включаю отображение расширений файлов и конвертирую пару треков

Файлы с расширением wav переименовываем, например, как triumph . wav и fz . wav . Эти файлы записываем на карточку. На карточке не нужно создавать папок и подпапок. В общем нам нужны только WAV файлы c именами 8+3 на английском языке.

Всё готово для прослушивания файлов. Карточка вставлена в плеер, динамик/наушники подключены. Подаем питание (нормальное питание 3,3 В). Если питание завышено/занижено, раздается писк. При завышении напряжения 10 сигналов, при занижении 9 сигналов. Если файлы на карточке не найдены (или иной формат файлов) выдается 3 сигнала. Описание сигналов по другим ошибкам см в исходнике.

Честно говоря, я не ожидал, что звук будет такой громкий. Вы спрашиваете меня про качество звука. Отвечаю – звук потрясающий. Прозрачный верх и насыщенный низ с хорошо проработанной передней картиной и оттенками теплого лампового звука :))

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

1) Кнопки управления; как минимум пауза/воспроизведение, следующий трек, предыдущий трек – рассмотреть возможность подключения к выводу 5 или 6 микроконтроллера ( AN 2, AN 1) кнопок с весовыми резисторами см «Самарин Александр. Интерфейсы с клавиатурой. Цифровая техника».

2) Сделать режим работы «квартирный звонок»: плеер всю дорогу под питанием, звонковая кнопка замыкается/размыкается, начинает играть трек и доигрывает до конца, не смотря на состояние кнопки.

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

Здесь может быть
ваша реклама

Понравилась конструкция,
но не можете собрать?

Обращайтесь, мы удовлетворим
ваши запросы и пожелания!
Напишите нам письмо.

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

Самодельный MP3 модуль на PIC

Этот встраиваемый MP3 модуль представляет из себя универсальную и компактную (37 mm x 27 mm) для воспроизведения MP3 файлов. MP3 может быть использован во встраиваемых системах.
MP3 файлы (до 65 536 шт) хранятся на карте microSD.
Управление модулем осуществляется как кнопками и цифровыми сигналами, так и через последовательный ТТЛ интерфейс.

MP3 модуль построен на MP3 конвертере VS1011 и контроллере PIC24 и может воспроизводить до 65536 песен или голосовых сообщений с карты microSD. Каждый файл может быть выбран по последовательному интерфейсу либо использованием 9 кнопок или переключателей (64 mp3 файла с помощью dip-переключателя). Для управления по последовательной шине Вам понадобится микроконтроллер, при использовании 9 цифровых линий вы можете управлять модулем логическими сигналами от различных устройств. Модуль может быть использован в различных автоматах, телефонных системах, в машине в качестве голосового информатора, в системах охраны и сигнализации, и тд. Модуль поддерживает карты micro SD до 16 GB и питается напряжением 3.3 или 5 вольт (устанавливается перемычкой). Модуль имеет однорядный разъем, установленный на краю платы, что позволяет удобно разместить модуль в вашем устройстве.

Читайте также  Инновационный усилитель tda7802 с идеальными звуковыми характеристиками от stmicroelectronics

Блок-схема MP3 модуля

Назначение выводов и способы управления

В режиме «Pin-to-Pin» предполагается наличие трех кнопок (PLAY / STOP, VOL UP and VOL DOWN) ​и 6-позиционного DIP переключателя (схема слева), в режиме «Serial» управление осуществляется по последовательному интерфейсу TTL уровнями (схема справа). Модуль также может использоваться в «Смешаном» ре жиме, что позволяет совместить режимы управления.

В режиме «Pin-to-Pin» (режим 1) чтобы воспроизвести песню вы должны выбрать номер трека DIP-переключателем в двоичной системе, а затем запустить воспроизведение подачей короткого логического 0 на вывод PLAY. Подачей логического 0 на выводы VOL_UP and VOL_DOWN Вы можете, соответственно, увеличивать или уменьшать громкость.
В последовательном режиме (режим 0) команды очень похожи на режим 1, исключая выбор mp3 afqkf, который должен происходить в несколько шагов в пределах времени, зафиксированного в файле конфигурации. Специальная команда # позволяет задать имя файла , а вторая специальная команда * — ввести задержку.
Для примера, чтобы проиграть файл 65.mp3, нужно выполнить следующие шаги:
• Шаг 1 (режим track name) = #;
• Шаг 2 (первый байт имени файла) = 6;
• Шаг 3 (второй байт имени файла) = 5;
• Шаг 4 (режим locking of track name, опционально — задержка) *;
• Шаг 5 (Play) = P;
• Шаг 6 (Stop) = S.

Смешаный режим (режим 2) позволяет давать команды как по последовательному интерфейсу, так и логическими сигналами. В этом случае используются только 4 входа управления, что дает только 16 адресуемых файлов.
Имена MP3 файлов должны быть числом от 0 до 65535 с расширением .mp3 (0.mp3, 1.mp3, 2.mp3, 3.mp3 16.mp3 . . 65535.mp3).

Конфигурирование модуля сделано с помощью файла (config.txt), расположенного на карте памяти. ПО MP3 плейера может распознавать новую карту памти и создавать на ней конфигурационный файл с параметрами по умолчанию,это также происходит, если конфигурационный файл частично поврежден. Файл создается в корневой папке карты памяти. Параметры конфигурации следующие:
Mode: позволяет выбрать режим работы.
Возможные значения:
0 — последовательный режим;
1 (по умолчанию) — режим Pin-to-Pin
2 — смешаный режим.

Параметры для последовательного и смешаного режима:
Baud rate: Скорость обмена по последовательному интерфейсу (1,200, 2,400, 9,600 (default), 19,200 и 115,200 bps).
Echo Command: Отображение поступающих команд 0 (выкл) и1(вкл, по умолчанию).
Extended echo Com: Отображение поступающих команд с их описанием (вкл по умолчанию).
Play: если стоит 0, то если перед посылкой команды «P» или «p» не был выбран файл, то команда игнорируется. Если выбрано 1 (по умолчанию), то воспроизводится последняя песня, котора воспроизводилась ранее.
Timeout: Задержка в мс перед воспроизведением. Варьируется от 1 до 10 000 мс (по умолчанию 3000, т.е. 3 сек).

Параметры для режима Pin-to-Pin и смешаного режима:
Time Wait Play и Time Wait Vol: задержка перед распознаванием изменения состояния и громкость, от 1 до 5 000 ms (по умолчанию 100).
Play: Если установлено в 0 , то изменение состояния входа Play (при воспроизведении) выполняет функцию паузы, если номер файла не изменялся, если изменялся, то выполняется функция Стоп. Если установлено в 1, то при воспроизведении всегда выполняется функция Стоп.

Параметры для смешаного режима (включение или выключение управляющих входов):
0: Не выполнять действия
1: (По умолчанию) Выполнять действия.

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

JLCPCB, всего $2 за прототип печатной платы! Цвет — любой!

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/cwc

Как уже правильно заметили, это — частота ШИМ, и то, при 8-битном разрешении и тактовой частоте 20MHz.
Частота дискретизации будет равна той, с которой Вы будете менять данные. Удобно это делать, используя прерывание от TMR2, установив необходимое значение посткалера.
Например, в своём речевом информаторе, я использовал тактовую частоту 16MHz. Соответственно, частота ШИМ получилась 62,5kHz. Установив посткалер равным 8, получилась частота сэмплирования 7812,5Hz. Поскольку стояла задача использовать дешёвые м/сх памяти I2C, то проблематично получить большую. В крайнем случае, удастся её поднять в два раза.
Во вложении — пример использования с массажным креслом (черновой вариант).
P.S.: К сожалению, презентацию форум не принимает. Кому интересно, кидайте мыло.

_________________
ICQ нет, и, в ближайшее время, не будет.

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

#include
#use delay(clock=20000000)
#fuses HS,NOWDT

#byte PORTB = 0x06
//Адрес регистра порта В

#byte INTCON = 0x0B
//Адрес регистра прерываний

#byte CCP1CON = 0x17
//Адрес управляющего регистра модуля CCP1

#byte CCPR1L = 0x15
//Адрес младшего байта CCP1

#byte CCPR1H = 0x16
//Адрес старшего байта CCP1

#byte T2CON = 0x12
//Адрес настройки регистра TMR2

#byte PR2 = 0x92
//Адрес регистра периода TMR2

#byte TRISB = 0x86
//Адрес регистра направления вводавывода порта В

#byte PIR1 = 0x0C
//Адрес регистра флагов прерывний

#byte PIE1 = 0x8C
//Адрес регистра разрешения перифирийных прерываний

#byte TMR2 = 0x11

#bit DC1B0 = CCP1CON.4
#bit DC1B1 = CCP1CON.5
//Адрес младших битов длительности импульса

#bit GIE = INTCON.7
//Адрес бита глобального разрешения прерываний

#bit TMR2ON = T2CON.2
//Адрес бита включения TMR2

#bit T2CKPS0 = T2CON.0
#bit T2CKPS1 = T2CON.1
//Адрес битов коэффициента предделителя TMR2

#bit CCP1M2 = CCP1CON.2
#bit CCP1M3 = CCP1CON.3

#bit TMR2IF = PIR1.1
//Адрес флага прерывания по переполнению таймера2

#bit TMR2IE = PIE1.1

#bit PEIE = INTCON.6
//Адрес бита разрешения прерываний от периферийных устройств

int i=0;
//Переменная — счётчик

const char number[]=
<
255,127,10,30,40,37,100,50,127,255,255,255,255,90
>;

#int_timer2
//Прерывание по переполнению TMR2
void timer2_isr()
<
TMR2IF=0;
CCPR1L=number[i];
i++;
hold=sizeof(number);
if (i==hold)
<
i=0;
PEIE=0;
TMR2IE=0;
GIE=0;
TMR2ON=0;
//PORTB=0b00000001;
>
>

TRISB=0;
//Порт В работает на выход

T2CKPS1=0;
T2CKPS0=0;
//Коэффициент предделителя TMR2=1

PR2=63;
//Частота дискретизации ШИМ — сигналов равна 78КГц
//Разрядность ШИМ = 8

GIE=1;
//Глобальное прерывание разрешено

PEIE=1;
//Прерывание разрешено от внешних прерываний

TMR2IE=1;
//Прерывания разрешены при совпадении TMR2 с PR2

CCP1M3=1;
CCP1M2=1;
//Модуль ССР включён в режиме ШИМ

TMR2ON=1;
//TMR2 включён

_________________
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи — мистификация.

Лорд Кельвин, физик, 1899 г.

При замене в современном автомобиле электромеханических реле на интеллектуальные силовые ключи PROFET производства Infineon необходимо учитывать особенности их коммутации по сравнению с «сухими контактами» реле, а также особенности управления с их помощью различными типами нагрузок.

ну я ццс не знаю и собственно, не стремлюсь, но !

1. Вы забираете 8 битное значение в CCPR1L, забывая, что младшие 2 разряда нужно занести
CCP1CON
2. На 628 соорудить что-то терпимо говорящее невозможно.

Я это сам пробовал и почувствовал разницу между ним и 8 мегой, например.

Ну.. воспользуйтесь 18, 24 серией, в самом деле, не 37 год.

Вебинар посвящен проектированию и интеграции встроенных и внешних антенн Quectel для сотовых модемов, устройств навигации и передачи данных 2,4 ГГц. На вебинаре вы познакомитесь с продуктовой линейкой и способами решения проблем проектирования. В программе: выбор типа антенны; ключевые проблемы, влияющие на эффективность работы антенны; требования к сертификации ОТА; практическое измерение параметров антенн.

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

Да, забыл про младшие и старшие биты)

void timer2_isr()
<
TMR2IF=0;

databits_order=number[i];
CCPR1L=databits_order>>2;
//Старшие 6 бит

bit0=databits_order & 0x01;
if (bit0==0x01)
<
DC1B0=1;
>
else
DC1B0=0;
bit1=databits_order & 0x10;
if (bit1==0x10)
<
DC1B1=1;
>
else
DC1B1=0;
//Младшие 2 бита

_________________
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи — мистификация.

Читайте также  Светодиодный диммер с токовым управлением

Лорд Кельвин, физик, 1899 г.

_________________
ICQ нет, и, в ближайшее время, не будет.

Да это был не вопрос, а утверждение (я прекрасно помню этот топик).

Если ты про «музыкальную шкатулку», таки оригинальное решение по поводу самого сэмпла (хотя и не уверен, что его личное). Я там пару других мелодий составил, но, как ты понимаешь, детально с работой не разбирался (компилировали другие люди).

_________________
ICQ нет, и, в ближайшее время, не будет.

_________________
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи — мистификация.

Лорд Кельвин, физик, 1899 г.

Вот тут не понял.
Описанная проблема может вызвать только «заикания» звука. Каким образом она влияет на качество?

_________________
ICQ нет, и, в ближайшее время, не будет.

Вложения:
prog_na_C.rar [4.13 KiB]
Скачиваний: 204

_________________
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи — мистификация.

#include
#use delay(clock=1000000)
#fuses HS,NOWDT
#use i2c(master,sda=PIN_A1,scl=PIN_A0,FORCE_HW)
#byte TRISA = 0x05
#byte PORTB = 0x06
#byte TRISB = 0x86

while(1)
<
i2c_start();
//Инициализация передачи
i2c_write(0xA0);
//Адрес Slave с запросом на запись
i2c_write(c1);
//Передача
i2c_start();
i2c_write(0xA1);
//Адрес Slave с запросом на чтение
c2=i2c_read();
//Чтение
i2c_stop();
//Конец

_________________
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи — мистификация.

Лорд Кельвин, физик, 1899 г.

while(1)
<
i2c_start();
//Инициализация передачи
i2c_write(0xA0);
//Адрес Slave с запросом на запись
i2c_write(c1);
//Передача
i2c_stop();
//Конец

i2c_start();
i2c_write(0xA0);
//Адрес Slave с запросом на запись
i2c_start();
i2c_write(0xA1);
//Адрес Slave с запросом на чтение
c2=i2c_read();
//Чтение
i2c_stop();
//Конец

_________________
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи — мистификация.

Лорд Кельвин, физик, 1899 г.

При всей моей нелюбви к ццс.

Трис а0, а1 в «1».
Чтение перед стоп делать без ожидания бита подтверждения c2=i2c_read(0);

(С)Я уже столько знаю о прокладках, что сам могу их носить.

_________________
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи — мистификация.

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

Итак например микросхема:AT24C512-10PU-2.7 dip8 (EEPROM serial I2C 64Kx8) получается, что в ней 64Кбайта, не КБита?

Дальше, у меня в микроконтроллере PIC 16F877 PWM уже используется для генерации сигнала с частотой 36 КГц (для подачи ИК сигнала). Соответственно код:

Могу ли я использовать 2 канал PWM в данном МК, и как?

Читая справку на команду HPWM вычитал следующее: HPWM Channel,Dutycycle,Frequency

200?’200px’:»+(this.scrollHeight+5)+’px’);»> q VAR byte ‘Адрес в памяти
My_Byte VAR byte ‘Байт звука
cont CON %10100000 ‘Константа для связи с микросхемой памяти

FOR q=1 to 20
I2CREAD PORTA.0,PORTA.1,cont,$A0+q,[My_Byte] ‘Считываю последовательно с ячейки A0 20 байтов
HPWM 2,My_Byte,8000 ‘Генерирую PWM сигнал на втором канале PWM с частотой 8 КГц
next q

Чувствую, что что-то не то, но проверить не могу, т.к. память еще не заказал, думаю какую. Вот и мучаюсь — сможет ли один МК генерировать 2 частоты, или для музыки ставить отдельный? В хелпе написано: Параметр Frequency — желательная частота сигнала PWM. На микроконтроллерах с 2 каналами, частоты в обоих каналах должны быть
одинаковыми

Еще вопрос, а как правильно рассчитать RC — цепочку

Почитал инет, нашел программу для расчета timer0, вот, что получилось на мой взгляд:

200?’200px’:»+(this.scrollHeight+5)+’px’);»>
‘Настройка pwn МК
TRISC.2 = 0 ‘ CCP1 (PortC.2 = Output)
PR2 = 137 ‘ Set PWM gпериод 36КГц
CCPR1L = 69
CCP1CON = %00001100 ‘ Select PWM Mode
T2CON = %00000100 ‘ Timer2 = ON + 1:1 prescale

‘Настройка Timer0 МК примерно 8,06452 КГц
INTCON = %00100000 ‘ Enable TMR0 interrupts
OPTION_REG = %00000001 ‘ Initialise the prescale 1:4
TMR0 = 101‘ Load TMR0 register
ON INTERRUPT GOTO ISR

DISABLE ‘ Disable further interrupts
ISR:

считываю
отправляю на ШИМ

INTCON.2 = 0 ‘ Re-enable TMR0 interrupts
RESUME ‘ Return to main program
ENABLE ‘ Enable interrupts

Как отправить правильно на ШИМ

А вот этот кусок ,я так понимаю, нужен только при работе с ШИМом напрямую через регистры:
TRISC.2 = 0 ‘ CCP1 (PortC.2 = Output)
PR2 = 137 ‘ Set PWM gпериод 36КГц
CCPR1L = 69
CCP1CON = %00001100 ‘ Select PWM Mode
T2CON = %00000100 ‘ Timer2 = ON + 1:1 prescale

т.е. команда HPWM на эти строки не смотрит и конфигурирует ШИМ по своему.
Если 36 кГц критично, то, получается, HPWM вам вообще не подходит, а записывать байты в ШИМ2
надо через регистр CCPR2L, предварительно сконфигурировав этот ШИМ вручную.

Вот эти строки не нужны, они вообще не для этого процессора:
DEFINE CCP2_REG PORTC ‘ Определяем порт для второго канала Hpwm
DEFINE CCP2_BIT 1 ‘ Определяем вывод для второго канала Hpwm
DEFINE HPWM2_TIMER 1

Ага, и насчет прерывания по таймеру, первым делом в ISR надо опять присвоить TMR0 = 101,
чтобы счетчик начал отсчет следующего периода с минимальным опозданием. А то у вас там вообще ему ничего не присваивается, т.е. он начнет считать с нуля и частота вызова прерываний будет совсем не 8 кГц

200?’200px’:»+(this.scrollHeight+5)+’px’);»>
‘общие настройки PWM************************************************************
PR2 = 138 ‘Значение равное частоте 35 971,22302Hz примерно 36КГц
T2CON = %00000100 ‘Timer2 = ON + 1:1 prescale

‘настройка PWM канала 1
TRISC.2 = 0 ‘Выход PWM канала 1
CCP1CON = %00001100 ‘Select PWM Mode
CCPR1L = 69 ‘Set PWM Duty-Cycle to 50%

‘настройка PWM канала 2
TRISC.1 = 0 ‘Выход PWM канала 2
CCP2CON = %00001100 ‘Select PWM Mode

‘Настройка Timer0 МК примерно 8,06452 КГц ***************************************
INTCON = %00100000 ‘Enable TMR0 interrupts
OPTION_REG = %00000001 ‘Initialise the prescale 1:4
TMR0 = 101 ‘Load TMR0 register
ON INTERRUPT GOTO Time_UP ‘Если произошло прерывание то переходим на метку

‘объявление переменных **********************************************************
PWM2 VAR CCPR2L ‘создаем ссылку на регистры 2 канала PWM
MUSIC_START VAR byte[1] ‘массив начальных адресов мелодий
MUSIC_END VAR byte[1] ‘массив конечных адресов мелодий
Play VAR bit ‘если 0 — не играть, если 1 то играть мелодию
Music_N VAR byte ‘номер проигрываемой мелодии
Addr VAR byte ‘счетчик адресов памяти
My_Byte VAR byte ‘Байт звука
cont CON %10100000 ‘Константа для связи с микросхемой памяти
I var byte ‘переменная цикла

‘запись начальных значений переменных *******************************************
‘начальные и конечные адреса мелодий в памяти ЕЕПРОМ
MUSIC_START[0]=$01
MUSIC_END[0] =$3FF

MUSIC_START[1]=$401
MUSIC_END[1] =$10FF

‘Определения I/O протов МК ******************************************************
TRISB=1 ‘ Установить все выводы PORTB на вход
TRISA=1 ‘ Установить все выводы PORTA на вход
ADCON1 = %00000110 ‘ Установим все выводы PORTA как цифровые.

if PORTA.0=0 then ‘если была нажата кнопка на А0 то
Music_N=0 ‘номер мелодии — 0
Addr=MUSIC_START[0]-1; ‘начинаем проигрывать с ячейки $00
play=1 ‘разрешаем проигрывание мелодий
for i=1 to 200
PAUSEUS 1 ‘противодребезгоавя пауза 200 мкс
next I
Endif

if PORTA.1=0 then ‘если была нажата кнопка на А1 то
Music_N=1 ‘номер мелодии — 1
Addr=MUSIC_START[1]-1; ‘начинаем проигрывать с ячейки $400
play=1 ‘разрешаем проигрывание мелодий
for i=1 to 200
PAUSEUS 1 ‘противодребезгоавя пауза 200 мкс
next I
Endif

‘*********************************************************************************
DISABLE ‘Disable further interrupts
Time_UP: ‘Метка обработчика прерывания
TMR0 = 101
IF Play=1 then ‘если проигрывать разрешено, то:
Addr=Addr+1; ‘увеличиваем на 1 переменную адреса в памяти
IF Addr=MUSIC_END[Music_N] then ‘следим, если подошел конечный адрес, то проигрывание заканчиваем
play=0
goto End_Play
Endif

I2CREAD PORTB.0,PORTB.1,cont,Addr,[My_Byte] ‘чтение байта из памяти ЕЕПРОМ
PWM2=My_Byte ‘присваиваем значение байта из памяти регистру второго канала PWM
endif

End_play:
INTCON.2 = 0 ‘Re-enable TMR0 interrupts
RESUME ‘ Return to main program
ENABLE ‘ Enable interrupts

Канал PWM номер 1 я использую для передачи сообщений через ИК (36 КГЦ)
Т.е. переключаю его на выход на несколько мкс, потом на вход и опять пауза и так далее, таким образом передаю единицы и нолики.

Поправьте пожалуйста в коде если что не правильно. Память куплю только в пятницу. Пока эксперименты теоретические.

И последний вопрос — а можно в данный тип памяти писать непосредственно с компа, или обязательно посредник -МК.

Запись звука

На AVR’ках можно неплохо работать со звуком. Сделать, например, какой-нибудь диктофончик или плеер.

Читайте также  Инфракрасный датчик препятствия на компараторе lm393

В этом посте — только про захват звука. Впрочем, если кому-нибудь окажется интересно, можно написать ещё)

Для записи звука удобно юзать электретный микрофон. Это вот такая шняжка.

Такие микрофоны попадаются в куче китайских девайсов, в наушниках с микрофоном, etc.

Электретный микрофон — активная деталька (внутри стоит полевой транзистор), поэтому для него требуется питание. Одна ножка микрофона (правая на картинке) соединина с корпусом микрофона, её садим на землю. На другую ножку подаём питание через резистор на 1к, с неё же снимаем сигнал.

Также попадаются вот такие совковые электретные микрофоны.

В них резистор встроен и наружу выходят 3 проводка. Их назначение определяется по цвету. Красный (или коричневый) — земля, синий (чёрный, зелёный) — плюс питания, белый (жёлтый, оранжевый) — выход.

Сигнал с микрофона нужно усилить. Вот, например, самый простой усилитель на операционнике.

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

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

Выход операционного усилителя подцепляем к микроконтроллеру. Камрад kvm подсказывает, что между выходом усилителя и входом АЦП есть смысл поставить ФНЧ.

Для экспериментов я взял свою, с позволения сказать, демоплату с Мегой32 и SD-карточкой. Вот так выглядит этот колхоз.

Примерная схема того, что получилось.

Фильтр на цепи AVCC на платке у меня не разведён, поэтому помехи от карточки при записи с радостью лезли на вход усилителя через резистор питания микрофона. Пришлось собрать фильтр на весу. Помехи карточка создаёт с удовольствием, так что, в принципе, можно и на неё тоже поставить фильтрик.

Перейдём к коду. Для захвата сигнала нам понадобиться ADC.

Про работу с ADC, кстати, можно почитать у Ди.

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

Теперь при конвертации очередного сэмпла, мы будем получать прерывание. Ловим прерывание и кидаем сэмплы в буфер. Размер буфера должен быть достаточен, чтобы не потерять сэмплы, получаемые во время записи на диск и других тяжёлых операций.

От считанного сэмпла сохраняем мы только старшие 8 бит. Просто ради экономии памяти.

Доставать сэмплы из буфера можно такой штукой.

Данные будем записывать в wav-файл. Формат такого файла разработан M$ и называется RIFF (resource interchange file format). В начале файла записывается сигнатура ‘RIFF’ (4 байта), полный размер файла (4 байта) и тип файла (4 байта) — ‘WAVE’, ‘AVI ‘, etc.

После заголовка следуют чанки. Каждая чанка (чанк, блок, etc.) состоит из сигнатуры (4 байта), размера поля данных (4 байта) и, собственно, данных.

Wav-файл должен содержать как минимум 2 чанки — формат потока и сам поток. Формат потока записывается в виде структуры WAVEFORMATEX, про которую можно почитать в MSDN. Получается вот такая вещь.

8-битные сэмплы записываются в в wav-файле виде числа от 0 до 255 (как раз, как идут с ADC), 16-битные — в виде числа от -32768 до 32767. Так что если захотим записывать 16-битные сэмплы, нужно будет отнимать от них 32768, но нам хватит и 8-битных сэмплов)

Теперь можно написать код для записи wav-файла.

Урок 17. Подключение Mini MP3 плеера к Arduino

Наверное, часто в ваших проектах возникала необходимость воспроизводить определенный звук или мелодию. Например, по завершению какого-нибудь процесса, или просто звуковое сопровождение. В этом нам поможет Mini MP3 Проигрыватель, который обладает очень большим потенциалом.

В данный модуль вставляется microSD карточка, на которую предварительно мы можем записать Mp3 композиции, которые, в дальнейшем, сможем воспроизводить с помощью Mini MP3 Проигрывателя.

Нам понадобится:

Для реализации проекта нам необходимо установить библиотеки:

Демонстрация:

Подготавливаем microSD карточку:

Mini MP3 Проигрыватель может распознавать карты объемом до 32G и файловой системой FAT16 , FAT32 .

  1. Для начала нам необходимо подключить карту через катридер к компьютеру и отформатировать карточку.
  2. Теперь нам нужно создать папку с названием «mp3«.
  3. Записать ваши mp3 композиции в данную папку и дать им имена «0001.mp3» , «0002.mp3«, «0003.mp3» и тд. Так же файл можно называть «0001alla-tratata.mp3» главное, указать в самом начале номер трека в четырех символьном формате.

Описание контактов:

Pin Number Pin Description Description Note
1 VCC Питание Питание постоянного тока от 3 до 5 Вольт
2 RX UART serial input
3 TX UART serial output
4 DAC_R Audio output right channel Выход на усилитель, правый канал
5 DAC_L Audio output left channel Выход на динамик, со встроенного усилителя до 3W
9 IO1 Trigger port 1 Короткое нажатие ||◄ (длительное нажатие — уменьшение громкости)
10 GND Ground Выход на динамик, со встроенного усилителя до 3W
11 IO2 Trigger port 2 Короткое нажатие ►|| (длительное нажатие — увеличение громкости)
12 ADKEY1 AD port 1 Trigger play first segment
13 ADKEY2 AD port 2 Trigger play fifth segment
14 USB USB DP USB Port
15 USB- USB- DM USB Port
16 Busy Playing Status Low means playingHigh means no

Модуль имеет сразу два вида выходного сигнала: первый — со встроенным усилителем, а второй вариант — через внешний усилитель например УНЧ модуль 2*3 Вт класса D PAM8403. В наших примерах будет рассматриваться вариант со встроенным усилителем.

  • Подключение к усилителю c помощью выходов DAC_R и DAC_L
  • Подключение к динамику напрямую. динамик подключается одним контактом IO1 , а вторым к IO2

Пример 1. Управление с помощью Arduino

Схема подключения:

Данный Mini MP3 Проигрыватель может быть подключен как обычному Serial порту, так и к виртуальному Serial порту. Это дает возможность arduino подключиться к компьютеру и к mp3 проигрывателю.

Подключать удобнее всего с помощью Breadboard mini и проводков папа-папа. Так же не забудьте подключать Mp3 плеер к Serial порту с через резисторы на 1 кОм.

В результате у вас должна получиться примерно следующая картина:

Не забудьте установить библиотеку Mini mp3 Arduino Library V2.0.

Скетч №1:

Данный пример запустит проигрывание треков и каждые 10 секунд будет переключать на следующий трек.

Между двумя командами необходимо делать задержку delay (100); 100 миллисекунд, в противном случае некоторые команды могут работать не стабильно.

Скетч №2:

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

Скетч №3:

Для запуска определенной мелодии нужно обязательно задать правильные именна mp3 файлам, которые находятся на флешке как указано в пункте «Подготавливаем microSD карточку» . Вы так же можете записывать файлы в любые папки и с любыми названиями, но их вы не сможете запустить выборочно по команде.

Полный список функций:

  • mp3_play (); // Запуск воспроизведения
  • mp3_play (5); // Воспроизвести файл «mp3/0005.mp3»
  • mp3_next (); // Следующий трек
  • mp3_prev (); // Предыдущий трек
  • mp3_set_volume (uint16_t volume); // Уровень громкости 0

30
mp3_set_EQ (); // Эквалайзер 0

5 (0 — Normal, 1 — Pop, 2 — Rock, 3 — Jazz, 4 — Classic, 5 — Bass)

  • mp3_pause (); // пауза
  • mp3_stop (); // остановить воспроизведение
  • mp3_random_play (); // Воспроизвести в случайнВоспроизвести в случайном порядке.
  • void mp3_get_state (); //send get state command
  • void mp3_get_volume ();
  • void mp3_get_u_sum ();
  • void mp3_get_tf_sum ();
  • void mp3_get_flash_sum ();
  • void mp3_get_tf_current ();
  • void mp3_get_u_current ();
  • void mp3_get_flash_current ();
  • void mp3_single_loop (boolean state); //set single loop
  • void mp3_DAC (boolean state);
  • Пример 2. Автономное управление без Arduino, с помощью подключенных кнопок.

    Данный модуль может работать как под управлением микроконтроллера Arduino, так и автономно, как самостоятельный проигрыватель mp3.

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

    Есть несколько вариантов подключения:

    Простой способ (Минимум функций):

    Расширенный способ (Максимальный функционал):