- ШІМ-шпильки в мікроконтролері AVR Atmega16
- Що таке ШІМ-сигнал?
- Потрібні компоненти
- Кругова діаграма
- Програмування Atmega16 для ШІМ
Модуляція ширини імпульсу (ШІМ) - це потужна техніка, коли ширина імпульсу змінюється, підтримуючи постійну частоту. Ця методика сьогодні використовується в багатьох системах управління. Застосування ШІМ не обмежується, і воно використовується в широкому діапазоні застосувань, таких як регулювання швидкості обертання двигуна, вимірювання, управління потужністю та зв'язок тощо. У ШІМ-техніці можна легко генерувати аналоговий вихідний сигнал за допомогою цифрових сигналів. Цей посібник допоможе вам зрозуміти ШІМ, його термінологію та те, як ми можемо реалізувати це за допомогою мікроконтролера. У цьому уроці ми продемонструємо ШІМ за допомогою мікроконтролера AVR Atmega16, змінюючи інтенсивність світлодіода.
Щоб детально зрозуміти основи ШІМ, перейдіть до наших попередніх посібників з ШІМ з різними мікроконтролерами:
- Підручник з ШІМ ARM7-LPC2148: Керування яскравістю світлодіода
- Широтно-імпульсна модуляція (ШІМ) за допомогою MSP430G2: Керування яскравістю світлодіода
- Генерування ШІМ за допомогою мікроконтролера PIC з MPLAB та XC8
- Широтно-імпульсна модуляція (ШІМ) у STM32F103C8: регулювання швидкості вентилятора постійного струму
- Генерація ШІМ-сигналів на штифтах GPIO мікроконтролера PIC
- Підручник з ШІМ Raspberry Pi
ШІМ-шпильки в мікроконтролері AVR Atmega16
Atmega16 має чотири спеціальних ШІМ-висновки. Це шпильки PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Також Atmega16 має два 8-бітові таймери та один 16-бітний таймер. Таймер0 і Таймер2 є 8-бітними таймерами, тоді як Таймер1 - 16-бітовими таймерами. Для генерації ШІМ ми повинні мати огляд таймерів, оскільки таймери використовуються для генерації ШІМ. Як ми знаємо, частота - це кількість циклів в секунду, за яку працює таймер. Тож вища частота дасть нам швидший таймер. При генерації ШІМ, більш швидка ШІМ-частота дасть більш точний контроль над виходом, оскільки вона може швидше реагувати на нові робочі цикли ШІМ.
У цьому посібнику з ШІМ Atmega16 ми будемо використовувати Timer2. Ви можете вибрати будь-який робочий цикл. Якщо ви не знаєте, що таке робочий цикл в ШІМ, давайте обговоримо коротко.
Що таке ШІМ-сигнал?
Широтно-імпульсна модуляція (ШІМ) - це цифровий сигнал, який найчастіше використовується в схемі управління. Час, протягом якого сигнал залишається високим, називається “вчасно”, а час, протягом якого сигнал залишається низьким, називається “часом вимкнення”. Існує два важливі параметри ШІМ, про які йдеться нижче:
Робочий цикл ШІМ
Відсоток часу, протягом якого сигнал ШІМ залишається ВИСОКИМ (у часі), називається робочим циклом.
Як і в імпульсному сигналі 100 мс, якщо сигнал ВИСОКИЙ для 50 мс і НИЗЬКИЙ для 50 мс, це означає, що імпульс був наполовину ВИСОКИЙ і наполовину НИЗКИЙ. Тож можна сказати, що робочий цикл становить 50%. Подібним чином, якщо імпульс знаходиться у ВИСОКОМ стані 25 мс і 75 мс у НИЗЬКОМ стані з 100 мс, тоді робочий цикл буде 25%. Зверніть увагу, що ми обчислюємо лише тривалість ВИСОКОГО стану. Ви можете взяти посилання на малюнок нижче для візуального розуміння. Тоді формула робочого циклу:
Цикл роботи (%) = час включення / (час включення + час вимкнення)
Отже, змінивши робочий цикл, ми можемо змінити ширину ШІМ, що призведе до зміни яскравості світлодіодів. У нас буде демонстрація використання різного робочого циклу для управління яскравістю світлодіода. Перевірте демонстраційне відео в кінці цього підручника.
Після вибору робочого циклу наступним кроком буде вибір режиму ШІМ. Режим ШІМ визначає, як саме Ви бажаєте працювати ШІМ. В основному існує 3 типи режимів ШІМ. Вони такі:
- Швидкий ШІМ
- Фаза ШІМ правильна
- ШІМ із корекцією фази та частоти
Швидка ШІМ використовується там, де зміна фази не має значення. Використовуючи швидку ШІМ, ми можемо швидко виводити значення ШІМ. Швидку ШІМ не можна використовувати там, де зміна фази впливає на таку операцію, як управління двигуном, тому в такому застосуванні використовуються інші режими ШІМ. Оскільки ми будемо контролювати яскравість світлодіода, де зміна фази не буде сильно впливати, тому ми будемо використовувати швидкий ШІМ-режим.
Тепер, щоб сформувати ШІМ, ми будемо контролювати внутрішній таймер для відліку, а потім повертати до нуля при певному рахунку, тому таймер буде відраховувати, а потім знову і знову встановлювати назад до нуля. Це встановлює період. Тепер у нас є можливість керувати імпульсом, включаючи імпульс при певному відліку в таймері, коли він піднімається. Коли лічильник повернеться до 0, вимкніть імпульс. У цьому є велика гнучкість, оскільки ви завжди можете отримати доступ до підрахунку таймера і подати різні імпульси одним таймером. Це чудово, коли ви хочете керувати кількома світлодіодами одночасно. Тепер почнемо взаємодіяти один світлодіод з Atmega16 для ШІМ.
Перевірте всі проекти, пов’язані з ШІМ, тут.
Потрібні компоненти
- Мікроконтролер Atmega16 AVR мікросхема
- Кристалічний генератор 16 МГц
- Два конденсатори 100 нФ
- Два конденсатори 22pF
- Нажимна Кнопка
- Провід перемички
- Макет
- USBASP v2.0
- 2 світлодіодні (будь-який колір)
Кругова діаграма
Ми використовуємо OC2 для ШІМ, тобто Pin21 (PD7). Тож підключіть один світлодіод на штифті PD7 Atmega16.
Програмування Atmega16 для ШІМ
Повна програма подана нижче. Запишіть програму в Atmega16 за допомогою JTAG і Atmel studio і побачите ефект ШІМ на світлодіоді. Його яскравість буде повільно збільшуватися і зменшуватися через різний робочий цикл ШІМ. Перевірте відео, подане в кінці.
Почніть програмувати Atmega16 з налаштування реєстру Timer2. Регістрові біти Timer2 є такими, і ми можемо встановити або скинути біти відповідно.
Тепер ми обговоримо всі біти Timer2, щоб ми могли отримати бажану ШІМ за допомогою письмової програми.
В реєстрі Timer2 в основному є чотири частини:
FOC2 (Порівняння вихідних даних для таймера2): Біт FOC2 встановлюється, коли біти WGM вказують режим, який не є ШІМ.
WGM2 (Режим генерації хвилі для таймера2): Ці біти контролюють послідовність підрахунку лічильника, джерело максимального (TOP) значення лічильника та тип генерації сигналу, який буде використовуватися.
COM2 (Порівняти вихідний режим для таймера2): Ці біти керують поведінкою виводу. Повний опис біта пояснюється нижче.
TCCR2 - = (1 <
Встановіть біти WGM20 та WGM21 як ВИСОКІ, щоб активувати Швидкий режим ШІМ. Стенди WGM для режиму генерації сигналу. Біти виділення наведені нижче.
WGM00 |
WGM01 |
Режим роботи таймера2 |
0 |
0 |
Нормальний режим |
0 |
1 |
CTC (Clear Timer On Compare Match) |
1 |
0 |
ШІМ, фаза коректна |
1 |
1 |
Швидкий ШІМ-режим |
Щоб отримати докладнішу інформацію про режим генерації хвильових форм, ви можете ознайомитися з офіційним паспортом Atmega16.
TCCR2 - = (1 <
Крім того, ми не використовували жодного попереднього масштабування, тому ми встановили регістр джерела годинника як '001'.
Біти вибору годинника наступні:
CS22 |
CS21 |
CS20 |
Опис |
0 |
0 |
0 |
Немає джерела годинника (таймер / лічильник зупинено) |
0 |
0 |
1 |
CLK T2S / (Ні Попереднє поділ) |
0 |
1 |
0 |
Clk T2S / 8 (від прескалера) |
0 |
1 |
1 |
Clk T2S / 32 (від прескалера) |
1 |
0 |
0 |
Clk T2S / 64 (від прескалера) |
1 |
0 |
1 |
Clk T2S / 128 (від прескалера) |
1 |
1 |
0 |
Clk T2S / 256 (від прескалера) |
1 |
1 |
1 |
Clk T2S / 1024 (від прескалера) |
Також OC2 очищається при порівнянні порівняння, встановлюючи біт COM21 як '1' і COM20 як '0'.
Параметри вибору режиму виведення (COM) для швидкого ШІМ-режиму наведені нижче:
COM21 |
COM21 |
Опис |
0 |
0 |
Нормальна робота порту, OC2 відключений. |
0 |
1 |
Зарезервований |
1 |
0 |
Зніміть OC2 у порівнянні матчу, встановіть OC2 вгорі |
1 |
1 |
Встановіть OC2 для порівняння, очистіть OC2 вгорі |
Збільште робочий цикл з 0% до 100%, щоб яскравість з часом збільшувалася. Візьміть значення від 0-255 і надішліть його на контакт OCR2.
for (мито = 0; мито <255; мито ++) // 0 до макс. робочого циклу { OCR2 = мито; // повільно збільшуємо яскравість світлодіода _delay_ms (10); }
Подібним чином зменшіть робочий цикл зі 100% до 0%, щоб поступово зменшувати яскравість світлодіода.
для (мито = 0; мито> 255; мито--) // макс. до 0 робочого циклу { OCR2 = мито; // повільно зменшуємо яскравість світлодіода _delay_ms (10); }
На цьому наш підручник з використання ШІМ в Atmega16 / 32 закінчується.