Проект tinyAVR 28. Тональный генератор

January 18, 2015 by admin Комментировать »

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

Спецификация проекта

Цель проекта— создать схему на основе микроконтроллера TinyAVR, которая будет играть какую-нибудь мелодию (хранящуюся в памяти программ микроконтроллера). Мелодия определяется последовательностью пар значений "звук- продолжительность". Микроконтроллер читает пары и выдает указанный звук необходимой продолжительности. Из-за простоты схемы подобное устройство не может одновременно воспроизводить несколько звуков (как это необходимо для сложного музыкального произведения). Аппаратная часть проекта — схема на основе микроконтроллера Tiny45 и небольшой динамик. К микроконтроллеру подключен усилитель типа Н-мост, поэтому звук очень громкий. Наличие фоторезистора позволяет использовать устройство как тональный генератор и как усовершенствованную сигнализацию для холодильника. Блок-схема системы приведена на рис. 6.5.

Рис. 6.5. Блок-схема тонального генератора

Описание устройства

На рис. 6.6 изображена принципиальная схема тонального генератора и усовершенствованной сигнализации для холодильника. Четыре транзистора слева — это Н-мост. На него поступают два выходных сигнала с микроконтроллера Tiny45 (РВО и РВ1), на которые подается ШИМ-сигнал. Причина выбора этих сигналов для возбуждения Н-моста состоит в том, что когда схема не должна выдавать никаких звуков — эти два выхода отключаются (устанавливаются либо в 0, либо в 1), Н-мост не потребляет тока. На выходе Н-моста установлен LC-фильтр (катушки L1 и L2 и конденсаторы СЗ и С4). Небольшой динамик (8 Ом) подключен к выходу фильтров через разъем SL1.

Рис. 6.6. Принципиальная схема тонального генератора (или сигнализации для холодильника)

Контакты микроконтроллера РВ2 и РВЗ коммутируются при помощи перемычек JP1 и JP2. Для тонального генератора кнопка S1 подключается к РВЗ, a DIP- переключатель S2-1 — к РВ2. В проекте модифицированной сигнализации для холодильника фоторезистор (LDR) подключается к РВЗ, а светодиод (LED1) — кРВ2.

При работе устройства как тональный генератор микроконтроллер ждет нажатия кнопки S1 и затем считывает состояние контактов РВ2 и РВ4. Они подключены к двум контактам DIP-переключателя, что позволяет пользователю указать на один из четырех (хранящихся в памяти программ) массивов данных. Каждый массив содержит информацию для описания звуков и их продолжительности (которые составляют какую-либо мелодию). Микроконтроллер генерирует звук на контакте РВО или РВ1 (который подключен к Н-мосту), формируя таким образом нужный звук. После того как весь массив воспроизведен, контроллер опять ждет нажатия кнопки. Чтобы выбрать другую мелодию, нужно (до нажатия кнопки S1) изменить положение DIP-переключателя.

Схема питается от внешнего источника постоянного напряжения (от 3 до 6 В). Две или три щелочные батарейки будут вполне подходящим источником питания. Диод D1 защищает схему от повреждения при неправильной полярности подключения источника питания.

Конструкция

Компоновку платы в программе EAGLE (а также ее принципиальную схему) можно скачать по ссылке: www.avrgenius.com/tinyavrl.

Печатная плата односторонняя (на стороне компонентов есть всего несколько перемычек). Обе стороны платы показаны на рис. 6.7 и 6.8.

Программирование

Самые важные фрагменты кода приведены в листингах 6.1-6.4. Звук определяется тоном и продолжительностью. Тон— это определенная частота, которую нужно подавать на динамик в течение определенного промежутка времени. Звуки в нашей программе записаны при помощи структуры, состоящей из элементов duration и frequency (тип данных — целое без знака).

Листинг 6.1

struct _Note

{

unsigned int duratioriMS; unsigned int frequency;

};

Мелодии записаны во Flash-памяти микроконтроллера. Информация о мелодии хранится в макросе progmem (листинг 6.2).

struct _Note songl[] PROGMEM = {

//День рождения

{ 360, 784},{ 120, 784}/{ 480, 440},

{ 480, 784},{ 480, 1048},{ 960, 494},

{ 360, 784},{ 120, 784},{ 480, 440},

{ 480, 784},{ 480, 1176},{ 960, 1048},

{ 360, 784},{ 120, 784},{ 480, 1568},

{ 480, 1320},{ 480, 1048},{ 480, 494},

{ 480, 440},{ 240,1396}, { 480, 0},

{ 120, 1396}, { 480, 1320}, { 480, 1048}, { 480, 1176},{ 960,1048 },{0,0}

};

Функция piay_tone_p () принимает в качестве аргумента указатель *р, который перебирает массив мелодии _Note (выдавая тем самым значения продолжительности и частоты). Теперь нам нужен специальный макрос pgm_read__word для чтения Flash-памяти (листинг 6.3). Длина слова микропроцессора AVR равна двум байтам, как и у целых чисел.

к 1НГ t

duration = pgm_read_word(p) ;

Р++;

note = pgm_read_word(p) ;

P++;

top = (int)(31250/note);

После получения частоты и длительности звука пришло время создать меандр, соответствующий этим параметрам. Это делается при помощи двух таймеров. TimerO функционирует в нормальном режиме определения длительности, a Timerl работает в режиме ШИМ для формирования меандра нужной частоты (путем установки значения тор регистра output compare register). Регистр ocric хранит верхнее значение, определяющее частоту. Если значение частоты равно нулю, то это пауза. Продолжительность паузы определяется соответствующей переменной. ocria — это регистр для установки среднего значения, которое постоянно равно 0,5.

DDRB |= ( (1«РВ0) | (1«РВ1) ) ;

TCCROB |= ( (1«CS02) | (1«CS00) ) ; //Предварительный делитель 1024 TCCR0B &= ~(1«WGM02); //Режим Normal TCCR0A &= ~((1«WGM00) |    (1«WGM01) ) ;

//Воспроизведение звука if(note)

{

TCCR1 |= ( (1«PWM1A) I (1«COM1AO)     |      (1«CS13)     | (1«CS10);

//предварительный делитель 256, режим ШИМ включен OCRIC = top; //Верхнее значение OCRIA = (OCRIC» 1) ; //Среднее значение TCNTO = 0; for (;;)

{

if ( ! (PINB& (1«PB4) ) )

{

flagl = 1; return; λ

if(TCNTO >= 78)

{

duration = duration – 10;

TCNTO = 0;

}

if(duration <= 0) break;

}

TCCROB = 0x00;

}

else

{

TCNTO = 0; for (;;)

{

if ( ! (PINB& (1«PB4) ) )

{

flagl = 1; return;

}

if(TCNTO >= 78)

{

duration = duration – 10; TCNTO = 0;

}

if(duration <= 0) break;

}

TCCROB = 0x00; }

Работа устройства

Для пользования схемой необходимо подать внешнее напряжение питания. Убедитесь в том, что перемычки JP1 и JP2 выставлены правильно. Установив переключатели DIP, выберите нужную вам мелодию, а затем нажмите кнопку S1. Схема начнет воспроизводить песню. По окончании воспроизведения схема опять будет ждать нажатия S1. Устройство можно совместить с проектом светодиодных свечей (подключив контакт РА1 схемы со свечами к контакту 1 перемычки JP1 и соединив шину заземления обеих схем). Измененная программа проекта светодиодных свечей (ее код есть на нашем Web-сайте) запустит воспроизведение выбранной вами песни после задувания всех свечей. Схему соединения двух устройств вы можете увидеть по ссылке: www.avrgenius.coin/tinyavrl.

Источник: Гадре, Д., Занимательные проекты на базе микроконтроллеров tinyAVR / Дхананья Гадре, Нигул Мэлхотра: Пер. с англ. — СПб.: БХВ-Петербург, 2012. — 352 с.: ил. — (Электроника)

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты