PIC16F1503. Тачка на прокачку - 1. Звук

Думаю, у кожного з батьків буває такий момент, коли він в магазині на касі виявляє дитини щось, і дитина стверджує що саме це щось дуже важливо для всього миру на землі і для нього зокрема. От і в мене таке сталося в черговий раз. З ходу оцінивши вартість цього нечта, батьківська жаба махнула рукою і вирішила, що один раз живемо і все одно всіх грошей не заробити. Розум ж оцінив швидкість вмирання цього нечта і теж дав добро.

В результаті дитячий автопарк поповнився ось таким ось дивом китайської інженерії. Джип, з «люстрою» і лебідкою!



Диво вміло блимати «люстрою» і «фарами» і голосно проводити три записаних звуку. Згідно всім канонам, машинка досить швидко «померла» і була принесена в ремонт. Я ж машину в ремонт брати відмовлявся, мотивуючи відмову невимитими руками і недоеденным вечерею. Плюс китайці якось змогли вичавити з цієї машинки пару зайвих децибел на частоті, резонуючій з моїм черепом (аж зуби занили), тому мені зовсім не посміхалося повторно випробувати ті ж самі відчуття.

В результаті довгих переговорів було вирішено, що проста зміна батарей — це вже не модно. Адже всі справжні водії тюнят свої машини в спеціальних студіях, після чого їздять на машинах, яких ні в кого немає. Ось і я взяв машину в студію «Все Моє» для тюнінгу…

Що насамперед необхідно зробити? Правильно, оцінити, який обсяг робіт звалився на нас. Розбираємо машину.


Усередині три світлодіода (синіх, яскравих, дешевих), пищалка і невідомий безкорпусный мікроконтролер класу «китайська сопля». Все це живиться від 3х батарейок LR4 (ємність в районі 20мАч), тому не дивно, що машина так швидко померла. Все це пишність запускається кнопкою, яка в кращих традиціях китайського автопрому заїдає і закушує.

Загалом, тут треба міняти все. Ну або майже все. На що?

Звичайно, я був би не проти застромити всередину машинки STM32F4, але оціночна плата всередину не залізе, а розводити під друковану плату відверто лінь. Порившись в ящиках, виявив демоплату на PIC16F1503. До 16 мегагерц, 3 кілобайта флеша і аж 128 байт пам'яті. Саме воно для машинки!

Якщо ви побажаєте повторити мої вправи, то шукати треба за словами PIC-H1503 (це сам мікроконтролер) і PIC-KIT3 (це програматор) від Olimex. Так же буде необхідно скачати і встановити MPLAB Ide X і XC8 з сайту microlab. На відміну ВІД, підтримуються Windows, Linux і OS X.

З чого необхідно почати тюнінг? Правильно, почнемо як усі, з звуку. Голосніше нам не треба, нам треба що б пілікало «поліцейськи» і не голосно.

Дістаємо з машинки «пищалку» і намагаємося зрозуміти, що це таке. Не знайшовши жодних розпізнавальних знаків, чіпляємо до омметру. Омметр показує 15Ом. Значить, мікродинамік: якби омметр показав «обрив», то це пьезопищалка.

Підключати динамік безпосередньо до ніжці мікропроцесора безглуздо (15 ом на 3 вольтах дадуть струм в 200мА, що явно не сподобається мікроконтролеру, якому 20 за очі), тому робимо просту схему на першому-ліпшому NPN транзистор.



Номінали практично не важливі. Плюс-мінус від схеми не принесе практично ніяких змін. Навіщо конденсатор на схемі, я поясню пізніше (його в принципі можна увіткнути і паралельно транзистору). Вхід підключаємо до 9ї ніжці мікроконтролера.

Тепер залишилося зрозуміти, як нам витягти звук. Зі шкільного курсу фізики ми знаємо, що звук — це коливання повітря. А динамік переводить коливання електрики в коливання повітря. Значить нам треба похитнути динамік. Але динамік у нас підключений безпосередньо до мікроконтролера, а той вміє видавати тільки «1» (є на ніжці) та «0» (нічого немає). Так, навіть (навіть? та це рідкість) у цього мікроконтролера є аж 5-ти бітний ЦАП (аудіофіли тащаться від однобитных, якщо що. смаїл), але це не спортивно.

Рятує нас знову фізика: навіть якщо подати «1» на динамік, магніт не миттєво підтягне дифузор, як і після «0» він його не відпустить миттєво.

Найпростіше це написати код на зразок такого
while(1)
{
dinamikON();
pause(1);
dinamikOFF();
pause(1);
}


Якщо паузи вважаються в мілісекундах, то в динаміці ми отримаємо «писк» у 500Гц. І змінюючи тривалість пауз можна отримати цілком собі пристойний звук. В чому проблема? Проблема в тому, що нам потрібно буде постійно відволікатися на «ножкодрыганье».

Але в будь-якому пристойному мікроконтролері є така штука, як PWM, він же ШІМ (що це? легко шукається в тій же вікіпедії, з картинками і довгими поясненнями). Є вона і в піке. Відкриваємо MPLAB, створюємо новий проект і з допомогою Code Configurator (Менюшка Tools-Embedded. Може знадобитися спочатку поставити в Plugins) додаємо новий PWM.



Я взяв PWM4 виключно із-за зручності ніжки. Так як PWM в піке не може без таймера, подивимося і на його.



Так як поки нічого не зрозуміло, просто натиснемо «Створити Code» і спробуємо запустити отримане. Як зазвичай, нічого не повинно статися — програми немає. Якщо у вас вилізла помилка про VDD, то треба в Run-Project Configuration-PICKit3-Power поставити галочку навпроти Power target Cirсuit. Просто можна програмувати плати «в роботі», а струму від програматора не завжди вистачить для живлення схеми.

Набираємо перший код. Все робиться в main.c, там я блоки розділив коментарями.

uint16_t count;
for(count=0; count<1024; count++)
{
PWM4_LoadDutyValue(count);
__delay_ms(10);
}


Закачуємо і підключаємо осцилограф одним входом до виходу мікроконтролера (синя лінія) і іншим до динаміку (червона).



Отже, що ж ми бачимо? Синя лінія — це результат роботи ШИМа. Заповнення від 0 до 100% і стрибком знову на нуль. А ось червона лінія десь на середині заповнення віддалено схожа на синусоїду. Скажу чесно, це віддаленість отримана шляхом причеплення конденсатора в 0,47 мкФ паралельно транзистору, для красивої гифки. Реальну картину можна побачити нижче.

Приберемо конденсатор.

Бачите піки на червоному? Це динамік на «зворотному ходу» працює як генератор і легко накидає цілий вольт при живленні від 3х. В принципі при дотриманні деяких умов легко можна спалити схему. Але у нас ці піки нікому не заважають, тому ставити кондер чи ні — ваша справа. Я поставив заради краси.

Знову поставимо. Воно вже було, але ця картина в статиці.

Змінимо на 0,1 мкф. Просто для порівняння та відображення впливу ємності на звук :)


В принципі ми вже отримали писк в 15 кілогерц, але кому він потрібен, крім комарів? Значить треба крутити частоту. Частота у ШИМа залежить від таймера, а як часто буде «тікати» таймер, залежить від лічильника, який встановлюється при кожному запуску таймера.

Тобто алгоритм роботи таймера виглядає приблизно так:
— Запускаємо таймер.
— Таймер тикнул і зменшив лічильник.
— Лічильник в нулі? Якщо ні, то знову тикаем. Якщо так — генеруємо переривання.

Обробник переривання:
— ОЙ! Таймер тикнул!
— Скинути таймер заново


І ось запуск ШИМа як раз у нас підчеплений до переривання таймера. А ми можемо крутити як частоту «входу цокання» (prescaler в налаштуваннях), так і величину лічильника.

Міняємо код (воно ж stage2)

uint8_t count;

for(count=0;count<256;count++)
{
PWM4_LoadDutyValue(count*2);
TMR2_LoadPeriodRegister(count);
__delay_ms(100);
}



Дивимося на гарну червону лінію і бачимо, що виходить щось віддалене на синусоїду, причому змінюється по частоті. Та й вухо підтверджує. Те, що нам треба!

Навіщо я міняю заповнення ШИМа, пропоную подумати самостійно. Але в принципі якщо подумки продовжити графік і загальмувати зміна одного параметра, то все стає ясно. Особливо просунуті можуть побачити аналогічну картинку в якому-небудь емуляторі, наприклад proteus

Тепер Давайте визначимо, який частотний діапазон ми отримали

Прибиваємо count 255

А тепер ставимо в 10


Зверніть увагу на правий верхній кут, де вказується крок сітки. У мене «на око» вийшов діапазон приблизно 300-5000Гц. Цілком. І по черепу «їздити» не буде.Перфекціоністи можуть скористатися частотоміром, або підрахувати реальне значення тактової частоти і прескалеров.

А от далі у мене виникли проблеми. Будь-якого розуміння, як повинно вона звучати у мене немає. Грубо кажучи, в музиці чукча читач, але ніяк не письменник.

Насилу навпіл знайшов, які частоти яких відповідають нотам, знайшов якусь нотний запис «у лісі народилася ялинка»…

Підрахував затримки, написав

#define do 243 //523Hz
#define re 239 //587
#define mi 236 //659
#define fa 231 //739
#define sol 229 //783
#define la 224 //880
#define si 218 //987
// and again +523Hz

const uint8_t elka[29]={do,la,la,sol,la,fa,do,do,do,la,la,si,sol,do,do,re,re,si,si,si,la,sol,fa,do,la,la,sol,la,fa};

void play(uint8_t p)
{
// 255 - 3ms period - 300 герц
// 10 - 0,2 ms - 5000Hz
PWM4_LoadDutyValue(p*2);
TMR2_LoadPeriodRegister(p);
}
....
uint8_t count;

for (count = 0; count < 29; count++) {
play(elka[count]);
__delay_ms(300);
PWM4_LoadDutyValue(0);
TMR2_LoadPeriodRegister(0);
__delay_ms(50);
}


Скомпілював, запустив. Ні, мелодія вгадується без проблем, але все не так. Шляхом підбору резисторів і конденсаторів домігся «майже синусоїди-пили» на виході, але вухо чує різницю.

У результаті поки зупинився на звичайному двухтональном сигналі: «високий-низький». Класичний поліцейський «вау-вау», відомий всім по голлівудських фільмах, в мене не вийшов. І гугл у відповідь на «police sirene tones code programm example» видає що завгодно, тільки не те що треба.

Допоможіть, пліз? У якій послідовності там цигикання йде?

В принципі, ми вже підійшли до того, що наступним кроком взяти і відтворити звичайний wav. Тобто не мучитися з тонами і іншим. Просто записати звук, перевести його в пристойну форму і програти. Як робили в свій час різні ScreamTracker'и.

Проблема тільки одна: півсекунди звуку у форматі PCM, моно, з дискретизацією 8КГц займає близько кілобайта. А у мене всього три з половиною кілобайта. Не піде. Але ознайомитися з принципами і прикладами можна просто ввівши гуглу «pic pcm sound». І прямо з першої посилання і вихідні коди і самі програми.

Тому втішаємося тим, що у нас буде справжній, «теплий ламповий звук з тих часів», для якого не потрібно увагу програміста: сказав яку частоту пілікати і пішов займатися своїми справами, а там залізяки самі все зроблять.

Але звук — це половина справи. Хороший світло — теж ознака справжнього тюнінгу :) Але це трохи пізніше.

Як правило, готові проект для MPLAB з усіма штуками можна забрати тут

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.