Views: 847
При проектировании простых устройств автоматики, часто необходимо иметь механизм звукового оповещения. Самый верхний уровень, это формирование голосовых сообщений, но об этом, как то по позже… В самом примитивном варианте можно использовать буззер со встроенным генератором. В таком варианте различные состояния звуковых сообщений можно формировать длительностью сигнала. Более продвинутый уровень, это одноголосный генератор, для формирования сигналов разных частот.
Такой способ позволят, не только формировать сигналы по длительности, но и разделять их по частоте. В этом варианте можно формировать даже простые мелодии. Для этого нам потребуется так называемые пассивные buzzer, динамик. Можно применять как механические (они более дешевые), так и пьезоэлектрические.
Внешний вид буззеров выпускаемых фирмой MURATA:
Piezoelectric Sounders / Buzzers 

Но чаще нам предстоит иметь дело с китайским производителем, так как цена и качество у них более приемлемы.
Механическими буззерами проще всего управлять, схема подключения, может иметь следующий вид:
Резистор R14 предназначен для удержания транзистора в закрытом состоянии при включении устройства. R13 вместе емкостью затвора, создают фильтр низких частот, что позволяет в некоторой степени избавиться от гармоник, которые формирует меандр и придать формируемому звуку сигналу, более приятное звучание. Резистор R10 и конденсатор C9 уменьшают влияние на шину питания, работу звукового преобразователя. Для своих устройств я предпочитаю использовать пассивные буззеры типа HYG8503A или HY09.
Теперь перейдет к программной реализации. В PIC24 для создания генератора удобно использовать модули OCx. Один из вариантов настройки рассмотрим в нашем варианте с использованием MCC.
В начале все просто добавляем в проект модуль (любой который свободен) например, в моем варианте это был OC4. Выполним конфигурацию:
Тут очень просто, не нужен нам какой то режим, оставим OFF. Выберем источник FOSC/2. Настройки режима синхронизации, выберем сам модуль, т.е. при запуске модуля он будет сам себя потом запускать и будет нам, генерировать заданную нами частоту.
Для формирования звука нам потребуется создать функцию и описать частоты нот для формирования звуков. Частоты нот, можно легко найти при поиске в инете. Для себя я составил следующие определения констант для нот:
// константы для OC модуля для формирования частот #define Do 23888 // До #define Do_d 22548 // До-диез #define Re 21283 // Ре #define Re_d 20088 // Ре-диез #define Mi 18960 // Ми #define Fa 17896 // Фа #define Fa_d 16892 // Фа-диез #define Sol 15943 // Соль #define So_d 15049 // Соль-диез #define Ly 14204 // Ля #define Ly_d 13407 // Ля-диез #define Si 12654 // Си // коэффициенты для переключения октав #define okt_bol 32 // Большая октава #define okt_mal 16 // Малая октава #define okt_1 8 // 1 октава #define okt_2 4 // 2 октава #define okt_3 2 // 3 октава #define okt_4 1 // 4 октава
Для “извлечения звуков” создадим простую функцию:
//------------------------------------------------------------------------------
void beep_n (uint32_t nota, uint8_t oktav, uint8_t dlit) // формирование сигнала
{
uint16_t dlitel; // вспомог. переменная
uint32_t frequency = (uint32_t)(nota*oktav*(FCY/2000000));
ClrWdt(); // сброс сторожевого таймера
if(!dlit) dlit=1;
dlitel=500/dlit; //
OCxRS = frequency/16; // задаем период
OCxR = OCxRS/2; // половина периода
OCxTMR = 0; //
OCxCON1_OCM = 6; // включить модуль
OCxCON2_TRIGSTAT = 1;
ClrWdt(); // сброс сторожевого таймера
__delay_ms(dlitel); //
OCxCON1_OCM = 0; // выключить модуль
__delay_ms(10); //
}
//------------------------------------------------------------------------------
Функция beep_n формирует звуковой сигнал частотой nota, которая расположена в октаве oktav и длительностью dlit.
Частота которая будут загружаться в регистры модуля OCx предварительно вычисляется при инициализации переменной
uint32_t frequency = (uint32_t)(nota*oktav*(FCY/2000000));
Принцип прост, в регистр который отвечает за период работы OCx, загружаем частоту
OCxRS = frequency/16; // задаем период
А в регистр длительности импульса значение равное половине, чтобы формировать меандр
OCxR = OCxRS/2; // половина периода
Значение регистров в функции описаны как:
//------------------------------------------------------------------------------ // конфигурирование библиотеке на основании выбранного модуля OCx #define OCxRS OC4RS #define OCxR OC4R #define OCxTMR OC4TMR #define OCxCON1_OCM OC4CON1bits.OCM #define OCxCON2_TRIGSTAT OC4CON2bits.TRIGSTAT //------------------------------------------------------------------------------
Тут вы видите, что выполнено настройка под модуль OC4, если вы будете использовать другой модуль, циферку “4” надо заменить на циферку используемого модуля ;)
Библиотека для XC16 v1.35
MCC PIC24 - модуль OUTPUT COMPARE - режиме генератора звуковых сигналов 1.93 KB 6 downloads
При проектировании простых устройств автоматики,...Это может быть интересно
Проект с использованием MCC часть 13Views: 1257 Так как используя MCC мы можем его использовать со своими библиотеками, поэтому настало время и свое создать. Для начала откроем наш заголовочный файл в нем очень много букв: По …
Светодиоды со встроенным драйвером WS2812BViews: 1082 Производитель http://www.world-semi.com Краткое описание продукции фирмы Каталог продукции” catcatcat_ws_19 catcatcat_ws_15 catcatcat_ws_11 catcatcat_ws_07 catcatcat_ws_03 catcatcat_ws_18 catcatcat_ws_14 catcatcat_ws_10 catcatcat_ws_06 catcatcat_ws_02 catcatcat_ws_05 catcatcat_ws_09 catcatcat_ws_13 catcatcat_ws_17 catcatcat_ws_16 catcatcat_ws_12 catcatcat_ws_08 catcatcat_ws_04 catcatcat_ws_01 This jQuery …
Flight controller for FPV drone.Views: 55 Reverse engineering of a flight controller (SpeedyBee F405 V4 55A 30×30 Stack). Мене зацікавила конструкція основних компонентів FPV-дрона. Першим варіантом, який я розглянув, був контролер польоту від китайської …
Development Boards PIC18F47Q84Views: 8467 Microchip тішить новими мікроконтролерами. Особливістю цього MCU – це багата інтелектуальна периферія, що дозволяє вирішувати такі завдання на 8 бітних MCU, які неможливо реалізувати на деяких навіть 32 …
Цифровой спидометр для автомобиляViews: 10319 Универсальность печатной платы ch-c0030pcb позволяет создавать на её основе разнообразные устройства. Одним из таких устройств является электронный спидометр для автомобиля, в котором можно задать два компаратора скорости, например, для …
Мультизоновый индикатор-терморегулятор ch-c3010Views: 1388 Часто возникает необходимость получить информацию по температуре с множества точек контроля. Вам необходимо знать температуру в комнате, в коридоре, температуру на улице, а в погребе (или на балконе) …
Проект с использованием MCC часть 05Views: 2230 Эту часть назовем так как избавься от delay, там где а это реально не надо. Для это нам потребуется научиться использовать прерывания и работать с таймерами. Что такое …
Индикатор температурыViews: 2851 Проект для начинающих, на демо плате BB-2T3D-01. Простой индикатор температуры. Проект никак не задумывался, просто на витрину магазин Ворон нужна была демонстрационная модель на макетной плате, чего нибудь работающего. Остановились на индикаторе …
Проект с использованием MCC часть 11Views: 1031 Можно несколько облагородить программу вынести наши процедуры обработки нажатия кнопок в отдельные функции. Но вы должны понимать, что это хоть и не значительно, но будет тормозить общую скорость …
Temperature measurement with NTC thermistor.Views: 738 Проекты в которых присутствовало измерение температуры начинал с цифровых датчиков, т.к. в них все просто и не надо ничего преобразовывать и вычислять. При использовании цифровых датчиков ты получаешь …


