- ШІМ (модуляція ширини імпульсу)
- ШІМ-шпильки в ARM7-LPC2148
- ШІМ-реєстри в ARM7-LPC2148
- Потрібні компоненти
- Схема та з'єднання
- Програмування ARM7-LPC2148 для ШІМ
- Етапи програмування LPC2148 для ШІМ та АЦП
Як ми знаємо, мікроконтролери приймають аналоговий вхід від аналогових датчиків і використовують АЦП (аналого-цифровий перетворювач) для обробки цих сигналів. Але що, якщо мікроконтролер хоче виробляти аналоговий сигнал для управління аналоговими пристроями, такими як серводвигун, двигун постійного струму тощо? Мікроконтролери не виробляють вихідну напругу, як 1 В, 5 В, замість цього вони використовують техніку, яка називається ШІМ для роботи аналогових пристроїв. Прикладом ШІМ є вентилятор охолодження нашого ноутбука (двигун постійного струму), який потрібно регулювати швидкістю відповідно до температури, і те саме реалізовано за допомогою техніки імпульсної модуляції ширини (ШІМ) на материнських платах.
У цьому підручнику ми будемо контролювати яскравість світлодіода за допомогою ШІМ у мікроконтролері ARM7-LPC2148.
ШІМ (модуляція ширини імпульсу)
ШІМ - це хороший спосіб керувати аналоговими пристроями за допомогою цифрових значень, таких як контроль швидкості двигуна, яскравості світлодіода тощо. Хоча ШІМ не забезпечує чистого аналогового виходу, але він генерує гідні аналогові імпульси для управління аналоговими пристроями. ШІМ фактично модулює ширину прямокутної імпульсної хвилі, щоб отримати варіацію середнього значення результуючої хвилі.
Робочий цикл ШІМ
Відсоток часу, протягом якого сигнал ШІМ залишається ВИСОКИМ (у часі), називається робочим циклом. Якщо сигнал завжди ввімкнений, він знаходиться у 100% робочому циклі, а якщо він завжди вимкнений, це 0% робочого циклу.
Цикл роботи = час включення / (час включення + час вимкнення)
ШІМ-шпильки в ARM7-LPC2148
На зображенні нижче вказані вихідні штифти ШІМ ARM7-LPC2148. Всього шість штифтів для ШІМ.
ШІМ-канал |
LPC2148 Шпильки портів |
ШІМ1 |
P0.0 |
ШІМ2 |
P0.7 |
ШІМ3 |
P0.1 |
ШІМ4 |
P0.8 |
ШІМ5 |
P0.21 |
ШІМ6 |
P0.9 |
ШІМ-реєстри в ARM7-LPC2148
Перш ніж потрапляти в наш проект, нам потрібно знати про ШІМ-регістри в LPC2148.
Ось список регістрів, що використовуються в LPC2148 для ШІМ
1. PWMPR: ШІМ-попередньо визначений реєстр
Використання: Це 32-розрядний регістр. Він містить кількість разів (мінус 1), коли PCLK повинен циклізувати перед збільшенням лічильника таймера ШІМ (він фактично містить максимальне значення лічильника попереднього масштабу).
2. PWMPC: лічильник попереднього розподілу ШІМ
Використання: Це 32-розрядний регістр . Він містить значення лічильника, що збільшується. Коли це значення дорівнює значенню PR плюс 1, лічильник таймера ШІМ (ТК) збільшується.
3. PWMTCR: Регістр керування таймером ШІМ
Використання: Він містить контрольні біти лічильника, скидання лічильника та ШІМ. Це 8-бітний регістр.
7: 4 |
3 |
2 |
1 |
0 |
ЗАРЕЗЕРВОВАНИЙ |
УВІМКНЕНО ШІМ |
ЗАРЕЗЕРВОВАНИЙ |
ЛІЧИЛЬНИК СКИДАННЯ |
ЛІЧИЛЬНИК УВІМКНЕНО |
- Увімкнення ШІМ: (біт-3)
0- ШІМ вимкнено
1- ШІМ увімкнено
- Увімкнути лічильник: (біт-0)
0- Вимкнути лічильники
1- Увімкнути лічильник
- Скидання лічильника: (біт-1)
0 - нічого не робити.
1- Скидає PWMTC і PWMPC на позитивному краю PCLK.
4. PWMTC: лічильник таймера ШІМ
Використання: Це 32-розрядний регістр. Він містить поточне значення зростаючого таймера ШІМ. Коли лічильник прескалера (ПК) досягає значення реєстру прескалерів (PR) плюс 1, цей лічильник збільшується.
5. PWMIR: ШІМ-реєстр переривань
Використання: Це 16-розрядний реєстр. Він містить прапорці переривання для ШІМ-каналів відповідності 0-6. Прапор переривання встановлюється, коли для цього каналу відбувається переривання (MRx Interrupt), де X - номер каналу (від 0 до 6).
6. PWMMR0-PWMMR6: ШІМ -реєстр збігів
Використання: Це 32-розрядний регістр . Насправді група Match Channel дозволяє встановлювати 6 ШІМ-виходів з керованим одним або 3 подвійними краями. Ви можете змінити сім каналів відповідності, щоб налаштувати ці ШІМ-виходи відповідно до ваших вимог у PWMPCR.
7. ШІММКР: Регістр контролю збігу ШІМ
Використання: Це 32-розрядний регістр. Він містить біти переривання, скидання та зупинки, які керують вибраним каналом відповідності. Збіг відбувається між регістрами збігів ШІМ та лічильниками таймера ШІМ.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
ЗАРЕЗЕРВОВАНИЙ |
ШІММР6S |
ШІММР6Р |
ШІММР6І |
.. |
ШІММР1С |
ШІММР1Р |
ШІММР11 |
ШІММР0С |
ШІММР0Р |
ШІММР01 |
Тут х - від 0 до 6
- ШІММРхІ (біт-0)
УВІМКНУТИ ТА ВИМКНІТЬ ШІМ-переривання
0 - Вимкнути переривання PWM Match.
1- Увімкнути переривання збігу ШІМ.
- ШІММРхР: (біт-1)
RESET PWMTC - значення лічильника таймера, коли воно відповідає PWMRx
0- Нічого не робити.
1- Скидання PWMTC.
- ШІММРх: (біт 2)
ЗУПИНИТЬ PWMTC і PWMPC, коли PWMTC досягне значення регістру відповідності
0 - Вимкніть функцію зупинки ШІМ.
1- Увімкніть функцію зупинки ШІМ.
8. PWMPCR: Регістр керування ШІМ
Використання: Це 16-бітний регістр. Він містить біти, які дозволяють ШІМ-виходи 0-6 і вибирають одно- або двофронтовий контроль для кожного виходу.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
НЕВИКОРИСТОВАНИЙ |
PWMENA6-PWMENA1 |
НЕВИКОРИСТОВАНИЙ |
PWMSEL6-PWMSEL2 |
НЕВИКОРИСТОВАНИЙ |
- PWMSELx (x: від 2 до 6)
- Режим Single Edge для PWMx
- 1- Режим Double Edge для ШІМ.
- PWMENAx (x: від 1 до 6)
- PWMx вимкнено.
- 1- Увімкнено PWMx.
9. PWMLER: реєстр увімкнення ШІМ- фіксації
Використання: Це 8-бітний реєстр. Він містить біти Match x Latch для кожного каналу Match.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
НЕВИКОРИСТОВАНИЙ |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 до 6):
0- Вимкніть завантаження нових значень відповідності
1- Завантажте нові значення відповідності з (PWMMRx) Регістру PWMMatch, коли таймер скидається.
Тепер давайте почнемо будувати апаратне налаштування, щоб продемонструвати модуляцію ширини імпульсу в мікроконтролері ARM.
Потрібні компоненти
Апаратне забезпечення
- Мікроконтролер ARM7-LPC2148
- Схема регулятора напруги 3,3 В
- 10k потенціометр
- Світлодіод (будь-який колір)
- РК-дисплей (16x2) Модуль дисплея
- Макет
- Підключення проводів
Програмне забезпечення
- Keil uVision5
- Інструмент Flash Magic
Схема та з'єднання
Зв'язки між РК та ARM7-LPC2148
ARM7-LPC2148 |
РК-дисплей (16x2) |
Р0.4 |
RS (Вибір реєстру) |
P0.6 |
E (Увімкнути) |
Р0.12 |
D4 (контакт 4) |
P0.13 |
D5 (штифт даних 5) |
Р0.14 |
D6 (штифт даних 6) |
Р0.15 |
D7 (штифт даних 7) |
GND |
VSS, R / W, K |
+ 5В |
VDD, A |
З'єднання між світлодіодами та ARM7-LPC2148
ANODE світлодіода підключений до ШІМ-виходу (P0.0) LPC2148, тоді як контакт CATHODE світлодіода підключений до виводу GND LPC2148.
З'єднання між ARM7-LPC2148 та потенціометром з регулятором напруги 3,3 В
Схема регулятора напруги 3,3 В |
Функція штифта |
Штифт ARM-7 LPC2148 |
1. лівий штифт |
- Ve від GND |
Штифт GND |
2. центральний штифт |
Регульований вихід на 3,3 В. |
На потенціометр Вхід і вихід потенціометра на P0.28 LPC2148 |
3. правий штифт |
+ Ве від 5В ВХІД |
+ 5В |
Бали, на які слід звернути увагу
1. Тут використовується регулятор напруги 3,3 В для надання аналогового вхідного значення штифту АЦП (P0,28) LPC2148, і оскільки ми використовуємо потужність 5 В, нам потрібно регулювати напругу за допомогою регулятора напруги 3,3 В.
2. Потенціометр використовується для зміни напруги між (від 0 В до 3,3 В) для забезпечення аналогового входу (АЦП) до виводу LPC2148 P0.28
Програмування ARM7-LPC2148 для ШІМ
Для програмування ARM7-LPC2148 нам потрібен інструмент keil uVision & Flash Magic. Ми використовуємо USB-кабель для програмування ARM7 Stick через порт Micro USB. Ми пишемо код за допомогою Keil і створюємо шістнадцятковий файл, а потім шістнадцятковий файл перепрошивається на ARM7 за допомогою Flash Magic. Щоб дізнатись більше про встановлення keil uVision та Flash Magic та їх використання, перейдіть за посиланням Початок роботи з мікроконтролером ARM7 LPC2148 та запрограмуйте його за допомогою Keil uVision.
У цьому підручнику ми використовуватимемо АЦП та ШІМ-техніку для управління яскравістю світлодіода. Тут LPC2148 отримує аналоговий вхід (від 0 до 3,3 В) через вхід АЦП P0,28, тоді цей аналоговий вхід перетворюється в цифрове значення (від 0 до 1023). Потім це значення знову перетворюється в цифрове значення (0 - 255), оскільки вихід ШІМ LPC2148 має лише 8-бітову роздільну здатність (2 8). Світлодіод підключений до ШІМ-контакту P0.0, і яскравістю світлодіода можна керувати за допомогою потенціометра. Щоб дізнатись більше про АЦП в ARM7-LPC2148, перейдіть за посиланням.
Етапи програмування LPC2148 для ШІМ та АЦП
Крок 1: - Найперше, це налаштувати ФАПЧ для генерації тактової частоти, оскільки вона встановлює системний та периферійний тактові сигнали LPC2148 відповідно до потреб програмістів. Максимальна тактова частота для LPC2148 становить 60 МГц. Наступні рядки використовуються для налаштування генерації годинника PLL.
void initializePLL (void) // Функція використання PLL для генерації годинника { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; поки (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Крок 2: - Наступним є вибір штифтів ШІМ та функції ШІМ LPC2148 за допомогою реєстру PINSEL. Ми використовуємо PINSEL0, як P0.0 для ШІМ-виходу LPC2148.
PINSEL0 = 0x00000002; // Встановлюючий штифт P0.0 для виходу ШІМ
Крок 3: - Далі нам потрібно СКРИТИ таймери за допомогою PWMTCR (Реєстр управління таймером).
PWMTCR = (1 << 1); // Встановлення реєстру керування таймером ШІМ як скидання лічильника
А потім встановіть значення масштабу, яке визначає роздільну здатність ШІМ. Я встановлюю його на нуль
PWMPR = 0X00; // Встановлення значення попередньо масштабованого ШІМ
Крок 4: - Далі нам потрібно встановити PWMMCR (регістр керування збігом ШІМ), оскільки він встановлює операцію, як скидання, переривання для PWMMR0.
ШІММКР = (1 << 0) - (1 << 1); // Встановлення реєстру контролю відповідності ШІМ
Крок 5: - Максимальний період ШІМ-каналу встановлюється за допомогою ШІММР.
ШІММР0 = ШІМзначення; // Надання значення ШІМ Максимальне значення
У нашому випадку максимальне значення - 255 (для максимальної яскравості)
Крок 6: - Далі нам потрібно встановити Latch Enable у відповідні регістри відповідності за допомогою PWMLER
PWMLER = (1 << 0); // ШІМ-фіксатор Enalbe
(Ми використовуємо PWMMR0) Тож увімкніть відповідний біт, встановивши 1 у PWMLER
Крок 7: - Щоб увімкнути вихід ШІМ на штифт, нам потрібно використовувати ШІМТКР для включення лічильників таймера ШІМ та режимів ШІМ.
PWMTCR = (1 << 0) - (1 << 3); // Увімкнення лічильника ШІМ та ШІМ
Крок 8: - Тепер нам потрібно отримати значення потенціометра для встановлення робочого циклу ШІМ з виводу АЦП P0.28. Отже, ми використовуємо модуль АЦП в LPC2148 для перетворення аналогового входу потенціометрів (від 0 до 3,3 В) до значень АЦП (від 0 до 1023).
Тут ми перетворюємо значення від 0-1023 до 0-255, ділячи його на 4, оскільки ШІМ LPC2148 має 8-бітову роздільну здатність (2 8).
Крок 9: - Для вибору АЦП P0.28 у LPC2148 ми використовуємо
PINSEL1 = 0x01000000; // Встановлення P0.28 як ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Встановлення годинника та PDN для A / D перетворення
Наступні рядки фіксують аналоговий вхід (від 0 до 3,3 В) і перетворюють його в цифрове значення (від 0 до 1023). А потім ці цифрові значення діляться на 4, щоб перетворити їх у (від 0 до 255) і, нарешті, подають як вихід ШІМ у вивід P0.0 LPC2148, до якого підключений світлодіод.
AD0CR - = (1 << 1); // Вибір каналу AD0.1 у затримці реєстру ADC (10); AD0CR - = (1 << 24); // Початок A / D перетворення while ((AD0DR1 & (1 << 31)) == 0); // Перевірка ВИКОНАНОГО біта в реєстрі даних ADC adcvalue = (AD0DR1 >> 6) & 0x3ff; // Отримати РЕЗУЛЬТАТ із реєстру даних ADC dutycycle = adcvalue / 4; // формула для отримання значень робочого циклу від (0 до 255) PWMMR1 = робочий цикл; // встановлюємо значення робочого циклу на ШІМ-регістр відповідності PWMLER - = (1 << 1); // Увімкнути вихід ШІМ зі значенням робочого циклу
Крок 10: - Далі ми відображаємо ці значення в модулі РК-дисплея (16X2). Отже, ми додаємо наступні рядки для ініціалізації модуля РК-дисплея
Void LCD_INITILIZE (void) // Функція підготовки РК-дисплея { IO0DIR = 0x0000FFF0; // Встановлює штифт P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 як час затримки ВИХІДУ (20); LCD_SEND (0x02); // Ініціалізація рідкокристалічного дисплея в 4-розрядному режимі роботи LCD_SEND (0x28); // 2 рядки (16X2) LCD_SEND (0x0C); // Відображення на курсорі вимкнено LCD_SEND (0x06); // Курс автоматичного збільшення LCD_SEND (0x01); // Відобразити чіткий LCD_SEND (0x80); // Перший рядок перша позиція }
Оскільки ми підключали РК-дисплей у 4-бітному режимі до LPC2148, нам потрібно надсилати значення, які відображатимуться як помацання по краплях (верхнє та нижнє). Отже, використовуються наступні рядки.
void LCD_DISPLAY (char * msg) // Функція друку символів, надісланих по одному { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Надсилає верхній гриз IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH для друку даних IO0CLR = 0x00000020; // Час затримки режиму запису RW LOW (2); IO0CLR = 0x00000040; // EN = 0, RS та RW без змін (тобто RS = 1, RW = 0) час затримки (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Надсилає нижній гриз IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; час затримки (2); IO0CLR = 0x00000040; час затримки (5); i ++; } }
Для відображення цих значень АЦП та ШІМ використовуємо наступні рядки у функції int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // Відображення значення АЦП (від 0 до 1023) LCD_SEND (0xC0); sprintf (вихідний сигнал, "ШІМ OP =%. 2f", яскравість); LCD_DISPLAY (світлодіодний вихід); // Відображення значень робочого циклу від (0 до 255)
Повний код та відеоопис навчального посібника наведено нижче.