Програмна шим (pwm)

ШІМ - Широтно імпульсна модуляція
PWM - Pulse Width Modulation (тобто те ж саме, що і ШІМ)

Що таке ШІМ і навіщо він потрібен?

Навіщо потрібен програмний ШІМ?

Потім, що на самому AVR (Atmega) каналів шим 1-2, що часто не вистачає для того, що треба.







Нехай у нас є 3 (три) світлодіода і яскравістю кожного з них ми хочемо управляти індивідуально. Вбудованих ШІМ каналів таймера не вистачить. І, взагалі, може ми ще якийсь особливий контроль хочемо здійснювати над кожним з них. Тому садимо їх на звичайні ноги (в прикладі PORTC ноги 3,4,5) і керований програмно.

Розрахунок резистора для світлодіода:

Харчування: 5В. Падіння напруги на світлодіоді можна вважати 1.5В. Струму на світлодіоді повинен бути не більше 20 мА (деякі посперечаються, що треба 15мА, але мені подобається яскравішою).
Згідно із законом Ома: I = U / R, R = U / I = (5-1.5) /0.02=175 Ом. Я поставив резистори R1, R2 і R2 - 220 Ом.

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

По-перше треба визначити з двома речами: з якою частотою будуть моргати світлодіоди, щоб не було видно цього моргання і, друге, скільки рівнів яскравості може мати світлодіод.

За рівнями яскравості нехай буде 256. 0 - вимкнено повністю, 255 - включений повністю (тобто ШІМ канал знаходиться в логічній одиниці весь час, тобто duty cycle = 100%.

Однак, зараз я мальок заплутаю вас.

Суть в тому, що у нас ПЛЮС діода на схемі тицьнути на пряму на харчування, а мінус йде через резистор до ноги (де резистор - не важливо, важливо що до ноги МК). Тому світлодіод світиться, коли на нозі МК низький рівень, тобто нуль, тобто нога всередині МК прокинути на GND, тобто на землю. Це означає, що насправді 0 і 1 в ШІМ повинні бути інвертовані. Тобто чим довше в сигналі буде 0 по відношенню до 1, тим яскравіше буде діод.

І так, рівнів яскравості 256.

Про який моргання йдеться? Суть в тому, що якщо ми повинні подати ШІМ сигнал на багато багато діодів і робимо це послідовно на кожен, то після виведення сигналу на перший діод треба повернутися до висновку сигналу на нього ж за такий час, щоб:







  1. встигнути сформувати повноцінний ШІМ сигнал,
  2. не минуло більше 1/25 секунди, інакше буде помітне мигання світлодіода,
  3. між відрізками сигналу ШІМ не було помітних пауз в генерації шим, тобто щоб ШІМ сигнал убезпечення.

Ось приклад спотворення ШІМ сигналу:

Ми це все будемо мати на увазі, але насправді нам тут це не важливо, тому що у нас буде дуже проста плавна мигалка і вона буде тільки змінювати яскравість, тобто часу буде достатньо, а завдання настільки проста, що не від'їдатися час від генерації ШІМ сигналу.

І так, ось вихідний код (для AVR studio, тобто gcc):

Принцип роботи програми

Є лічильник відрізків часу - scancount. Максимальне значення цього лічильника - це кількість рівнів яскравості мінус 1. Кожен оборот циклу він збільшується на одиницю, потім перевалює за 255 і знову стає 0. У кожному оберті циклу відбувається установка сигналу для кожного світлодіода. Якщо лічильник менше більше або дорівнює рівню яскравості, то вимикаємо діод. Якщо лічильник менше рівня яскравості заданого для діода - то включаємо це діод. І як кожен цикл. Наприклад, якщо рівень яскравості дорівнює 0, то лічильник завжди буде дорівнює або більше нуля і діод завжди буде вимкнений. Якщо рівень яскравості 255, то лічильник буде менше цього значення 254 з 255 оборотів лічильника і буде горіти практично в повну силу. Якщо яскравість встановлена ​​в 50, то 50 перших оборотом циклу діод буде включений, а 206 залишилися оборотів - вимкнений, тобто на нього буде подана 50/256 струму від максимуму.

Нижче в програмі йде управління рівнем яскравості діодом, щоб була якась демонстрація. При кожному переповненні лічильника до яскравості всіх діодів додається 1, але якщо яскравість стає більш 128, то вона скидається в 0. Взагалі, якби не було цієї перевірки, то після досягнення рівня яскравості в 255 вона сама б скинулася в нуль, але досвід показав , що після яскравості в 128 вона наростає так непомітно, що можна вважати що при значенні в 128 вона вже практично максимум. І щоб отриманий ефект був більш динамічний і була введена це перевірка.

Треба також знати, що залежність яскравості від струму у світлодіодів НЕ ЛІНІЙНА. Тобто 128 не в два рази тьмяніше, ніж 255 і не в 2 рази яскравіше, ніж 64.

За скільки провертається весь цикл з усіма діодами, нас тут мало цікавить, так як зрозуміло, що на чистоті 1Мгц (саме на ній у мене працює МК), це буде досить швидко, щоб око не бачило ніяких мерехтінь.

Фото збірки:

Програмна шим (pwm)

натисніть на фото, щоб збільшити

Ціна домена: 1 500 000 руб.







Схожі статті