Проект tinyAVR 4. Случайный генератор цвета и звука

December 1, 2014 by admin Комментировать »

Мы успешно использовали LFSR-генератор псевдослучайных чисел устройства Tiny в проекте 2, но начальное значение LFSR было фиксированным. Это означает, что при каждом включении схемы она генерирует одну и ту же последовательность. Теперь покажем, как можно встроить 16-разрядный LFSR в такое небольшое устройство, как ATtinyl3 (при этом канал АЦП будет задавать начальное значение). Это дает разные начальные значения для LFSR при каждом включении цепи, поэтому последовательности окажутся "более случайными". 16-разрядный LFSR может успешно генерировать случайные числа (за исключением 0) с периодичностью 65 535, однако для этого отводы должны быть в определенных позициях. Ν-разрядный регистр с периодом 2"-1 называется максимальным LFSR, именно он применен в этом проекте. Рандомизация выхода LFSR хорошо заметна по разным цветам RGB-светодиода и звукам из динамика.

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

Цель — реализовать LFSR на устройстве Tiny и продемонстрировать его случайную работу с помощью RGB-светодиода и динамика. Схема должна работать при напряжении в 3 В. Управление интенсивностью свечения светодиодов (для генерирования случайных цветов) осуществляется опять-таки при помощи широтноимпульсной модуляции (как в проекте 3). Случайный звук генерируется подачей в динамик сигнала звукового диапазона. Блок-схема устройства приведена на рис. 2.30.

Рис. 2.30. Блок-схема генератора случайных цветов и звуков

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

На рис. 2.31 показана принципиальная схема устройства. МАХ756 — это повышающий преобразователь постоянного напряжения, который в данном случае выдает напряжение 5 В от источника питания 3 В. Если входное напряжение превысит 5 В, то выходное напряжение повысится в соответствии со входным. Это может привести к повреждению других частей схемы (включая и сам МАХ756), поэтому нужно, чтобы входное напряжение никогда не превышало 5 В. Диод D1 и катушка L1 требуются для работы МАХ756. Контроллер ATtinyl3 имеет все функции, необходимые для нашего проекта. Используемый светодиод— это RGB-светодиод с общим анодом (в корпусе SMD), подключенным к источнику питания. R5, R6 и R7 работают как ограничивающие ток резистор>ы для красного, синего и зеленого светодиодов (соответственно) и имеют сопротивление по 100 Ом каждый. Элемент Т1 (2SD789) — это и-р-и-транзистор, который дает сигнал на динамик. Он необходим, потому что контакты ввода/вывода устройства AYR могут дать только 40 мА, а этого для динамика недостаточно. Динамик, использованный нами, имеет мощность 0,5 Вт и сопротивление 8 Ом. Чтобы рассеиваемая динамиком мощность находилась в допустимых пределах, последовательно с ним нужно включить резистор 10 Ом. Вывод РВ4 контроллера работает как "плавающий" канал АЦП, чтобы получить начальное значение для LFSR.

Псевдослучайные числа формируются при помощи 16-разрядного LFSR- генератора Фибоначчи. Эти числа служат для изменения цвета RGB-светодиода и тона в динамике каждые полсекунды. Цвета создаются при помощи программно генерируемого ШИМ-сигнала с 10 уровнями (в отличие от 256 уровней, использованных в проекте 2). Это означает, что светодиод сможет выдавать максимум 10x10x10 цветов (но отображаться будут только 16 из них). Тон в динамике генерируется при помощи меандра переменной частоты. Было выбрано девять разных частот звука.

Рис. 2.31. Принципиальная схема генератора случайных цветов и звуков (динамик 80 м/0,5 Вт включен последовательно с резистором 10 Ом)

Конструкция

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

Печатная плата односторонняя (на стороне компонентов есть всего несколько перемычек). Размещение компонентов показано на рис. 2.32, а сторона пайки — на рис. 2.33. На распаянной плате RGB-светодиод смонтирован на стороне компонентов.

Рис. 2.32. Плата генератора случайных цветов и звуков (сторона компонентов)

Рис. 2.33. Плата генератора случайных цветов и звуков (сторона печатных проводников)

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

Откомпилированный исходный код (вместе с файлом MAKEFILE) можно скачать по ссылке: www.avrgenius.com/tinyavrl.

Тактовая частота равна 9,6 МГц. Контроллер запрограммирован при помощи STK500 в режиме программирования ISP. Поясним самые важные фрагменты кода.

while(1)

{

//Ожидание начального значения от АЦП if (i==4)

{

//Это программный код для LFSR

bit = (reg & 0x0001) ”((reg & 0x0004) » 2)

”((reg & 0x0008) » 3)Л((гед & 0x0020) » 5) ; reg = (reg » 1)     | (bit « 15);

//Генерирующий звук код PORTB |= 1«3 ; delay(t) ;

PORTB 8с= ~ (1«3 ) ; delay(t) ;

}

}

Листинг 2.4 — это основной бесконечный цикл программы. Он начинает выполняться только тогда, когда значение i равно 4, т. е. в качестве начального значения берется четвертое значение АЦП. Прерывание АЦП происходит четыре раза и при этом значение i каждый раз увеличивается на единицу. Когда значение i достигает четырех, значение плавающего канала АЦП присваивается переменной гед и прерывание АЦП отключается. Переменная гед — это 16-разрядное целое число, которое и реализует LFSR. Отводами для LFSR выбраны биты 16, 14, 13 и 11 (если считать от самого младшего бита). Код, генерирующий звук, просто формирует прямоугольный сигнал выбранной частоты.

//Процедура обработки прерывания по переполнению Timer0 ISR (TIM0_OVF_vec t)

{

//for color if(e==9)

{ е=0;

//Начало нового цикла

PORTB = PORTB| (1«2) | (1«1) | (1«0) ;

}

abc () ;

//Время изменения – примерно полсекунды

j++;

if(j==128)

{

а = reg%9;//получить новое значение для звука t = pgm_read_word(d+a);

а = гед%16;// получить новое значение для цвета

blue = pgm_read_byte(k+a);

red = pgm_read_byte(1+a);

green = pgm_read_byte(m+a);

j=0;

}

}

Листинг 2.5 — это процедура обработки прерывания по переполнению TimerO. Она выполняет две основные функции. Во-первых, она реализует программную широтно-импульсную модуляцию (как в проекте 2), а во-вторых, после каждых 128 переполнений она выбирает новое значение цвета и тона звука (при помощи операции остатка от целочисленного деления переменной reg). В массиве d хранится девять звуков (в виде временных задержек для прямоугольного сигнала), поэтому взяв modulo9 от переменной reg, мы присвоим переменной а случайное значение от О до 8. Затем соответствующая переменная массива d сохраняется в t, которая используется как переменная задержки в главном бесконечном цикле. Точно так же имеется 16 цветов, и операция moduioi6 от переменной reg задает переменной а случайное значение от 0 до 15. Соответствующие уровни интенсивности каждого цвета (из массивов k, 1 и т) сохраняются в соответствующих переменных blue, red и green. TimerO имеет предварительный делитель, чтобы 128 прерываний происходили примерно за 0,5 с. Функции pgm_read_byte (для 8-битовых переменных) и pgm_read_word (для 16-битовых переменных) выбирают константы из памяти программ. Чтобы сэкономить память данных, нужно хранить неизменяемые значения в памяти программ (указав атрибут progmem при их объявлении). Остальные подробности вы можете увидеть в полном исходном коде.

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

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

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