- ШИМ (модулация на широчината на импулса)
- ШИМ щифтове в ARM7-LPC2148
- ШИМ регистри в ARM7-LPC2148
- Необходими компоненти
- Електрическа схема и връзки
- Програмиране ARM7-LPC2148 за ШИМ
- Стъпки, включени в програмирането на LPC2148 за PWM и ADC
Както знаем, микроконтролерите приемат аналогов вход от аналогови сензори и използват ADC (Analog to Digital converter) за обработка на тези сигнали. Но какво, ако микроконтролерът иска да генерира аналогов сигнал за управление на аналогово управлявани устройства като серво мотор, DC мотор и т.н.? Микроконтролерите не произвеждат изходно напрежение като 1V, 5V, вместо това използват техника, наречена PWM за работа с аналогови устройства. Пример за PWM е охлаждащият вентилатор на нашия лаптоп (двигател с постоянен ток), който трябва да се контролира скоростта в съответствие с температурата и същото се реализира чрез използване на техниката Pulse Width Modulation (PWM) в дънните платки.
В този урок ще контролираме яркостта на светодиода, като използваме ШИМ в микроконтролера ARM7-LPC2148.
ШИМ (модулация на широчината на импулса)
PWM е добър начин за управление на аналоговите устройства, използвайки цифрова стойност като контрол на скоростта на двигателя, яркостта на светодиода и др. Въпреки че PWM не осигурява чист аналогов изход, но генерира прилични аналогови импулси за управление на аналоговите устройства. PWM всъщност модулира ширината на правоъгълна импулсна вълна, за да получи вариация в средната стойност на получената вълна.
Работен цикъл на ШИМ
Процентът от времето, през което ШИМ сигналът остава ВИСОКИ (навреме) се нарича работен цикъл. Ако сигналът винаги е включен, той е в 100% работен цикъл и ако винаги е изключен, това е 0% работен цикъл.
Работен цикъл = Време за включване / (Време за включване + Време за изключване)
ШИМ щифтове в ARM7-LPC2148
Изображението по-долу показва PWM изходните щифтове на ARM7-LPC2148. Общо има шест щифта за PWM.
ШИМ канал |
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: PWM Prescale Register
Употреба: Това е 32-битов регистър. Той съдържа броя пъти (минус 1), които PCLK трябва да циклира, преди да увеличи PWM брояча на таймера (Той всъщност съдържа максималната стойност на брояча на предскалата).
2. PWMPC: PWM Prescaler Counter
Използване: Това е 32-битов регистър . Той съдържа нарастващата стойност на брояча. Когато тази стойност е равна на PR стойност плюс 1, броячът на таймера PWM (TC) се увеличава.
3. PWMTCR: Регистър за управление на таймера на PWM
Употреба: Съдържа контролни битове Counter Enable, Counter Reset и PWM Enable. Това е 8-битов регистър.
7: 4 |
3 |
2 |
1 |
0 |
РЕЗЕРВИРАН |
Активиране на ШИМ |
РЕЗЕРВИРАН |
БРОЯВАНЕ НА НУЛИРАНЕ |
БРОЙКА АКТИВИРАН |
- Активиране на ШИМ: (бит-3)
0- PWM Disabled
1- PWM Enabled
- Активиране на брояча: (бит-0)
0- Деактивиране на броячите
1- Активиране на брояча
- Нулиране на брояча: (Бит-1)
0- Не правете нищо.
1- Нулира PWMTC и PWMPC на положителния ръб на PCLK.
4. PWMTC: PWM брояч на таймера
Употреба: Това е 32-битов регистър. Той съдържа текущата стойност на нарастващия PWM таймер. Когато броячът на прескалера (PC) достигне стойността на регистъра на прескалера (PR) плюс 1, този брояч се увеличава.
5. PWMIR: ШИМ регистър на прекъсванията
Употреба: Това е 16-битов регистър. Той съдържа флагове за прекъсване за PWM Match Channels 0-6. Флаг за прекъсване се задава, когато възникне прекъсване за този канал (MRx прекъсване), където X е номерът на канала (0 до 6).
6. PWMMR0-PWMMR6: PWM Match Register
Употреба: Това е 32-битов регистър . Всъщност групата Match Match позволява настройка на 6 PWM изхода с контролиран от един край или 3 с двоен ръб. Можете да модифицирате седемте канала за съвпадение, за да конфигурирате тези PWM изходи, за да отговарят на вашите изисквания в PWMPCR.
7. PWMMCR: ШИМ регистър за контрол на съвпадението
Употреба: Това е 32-битов регистър. Съдържа битове за прекъсване, нулиране и спиране, които контролират избрания канал за съвпадение. Съществува съвпадение между регистрите за съвпадение на ШИМ и броячите на ШИМ таймера.
31:21 |
20. |
19. |
18. |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
РЕЗЕРВИРАН |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
ШИММР11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Тук x е от 0 до 6
- PWMMRxI (бит-0)
АКТИВИРАНЕ ИЛИ ЗАКЛЮЧВАНЕ на ШИМ прекъсвания
0 - Деактивирайте прекъсванията на PWM Match.
1- Активирайте прекъсването на PWM Match.
- PWMMRxR: (бит-1)
RESET PWMTC - Стойност на брояча на таймера, когато съвпада с PWMRx
0- Не правете нищо.
1- Нулира PWMTC.
- PWMMRxS: (бит 2)
СПРЕТЕ PWMTC & PWMPC, когато PWMTC достигне стойността на регистъра на съвпадението
0- Деактивирайте функцията за спиране на PWM.
1- Активирайте функцията PWM Stop.
8. PWMPCR: ШИМ контролен регистър
Употреба: Това е 16-битов регистър. Той съдържа битовете, които позволяват PWM изходи 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 за PWMx.
- PWMENAx (x: 1 до 6)
- PWMx деактивира.
- 1- Активиран PWMx.
9. PWMLER: Регистър за активиране на PWM Latch
Употреба: Това е 8-битов регистър. Той съдържа битове Match x Latch за всеки Match 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.3V регулатор на напрежение IC
- 10k потенциометър
- LED (всеки цвят)
- LCD (16x2) дисплеен модул
- Макет
- Свързване на проводници
Софтуер
- Keil uVision5
- Инструмент Flash Flash
Електрическа схема и връзки
Връзки между LCD и ARM7-LPC2148
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Избор на регистър) |
P0.6 |
E (Активиране) |
P0.12 |
D4 (ПИН за данни 4) |
P0.13 |
D5 (ПИН за данни 5) |
P0.14 |
D6 (ПИН за данни 6) |
P0.15 |
D7 (ПИН за данни 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
Връзка между LED и ARM7-LPC2148
ANODE на LED е свързан към ШИМ изхода (P0.0) на LPC2148, докато CATHODE щифтът на LED е свързан към GND щифт на LPC2148.
Връзка между ARM7-LPC2148 и потенциометър с 3.3V регулатор на напрежение
3.3V регулатор на напрежение IC |
ПИН функция |
ПИН ARM-7 LPC2148 |
1. Ляв щифт |
- Ve от GND |
GND щифт |
2. Централен щифт |
Регулиран + 3.3V изход |
Към потенциометър Вход и изход на потенциометър до P0.28 от LPC2148 |
3. Десен щифт |
+ Ve от 5V ВХОД |
+ 5V |
Точки, които трябва да се отбележат
1. Тук се използва регулатор на напрежение от 3.3V, за да се осигури аналогова входна стойност на ADC щифта (P0.28) на LPC2148 и тъй като използваме 5V мощност, трябва да регулираме напрежението с регулатор на напрежение от 3.3V.
2. Потенциометър се използва за промяна на напрежението между (0V до 3.3V), за да осигури аналогов вход (ADC) към LPC2148 щифт P0.28
Програмиране ARM7-LPC2148 за ШИМ
За да програмираме ARM7-LPC2148, се нуждаем от инструмента keil uVision & Flash Magic. Използваме USB кабел за програмиране на ARM7 Stick чрез микро USB порт. Пишем код с помощта на Keil и създаваме шестнадесетичен файл и след това HEX файлът се мига на ARM7 стик с помощта на Flash Magic. За да научите повече за инсталирането на keil uVision и Flash Magic и как да ги използвате, следвайте връзката Първи стъпки с ARM7 LPC2148 Microcontroller и го програмирайте с Keil uVision.
В този урок ще използваме ADC и PWM техника за контрол на яркостта на светодиода. Тук LPC2148 получава аналогов вход (0 до 3.3V) чрез ADC входен щифт P0.28, след което този аналогов вход се преобразува в цифрова стойност (0 до 1023). След това тази стойност отново се преобразува в цифрова стойност (0 - 255), тъй като PWM изходът на LPC2148 има само 8-битова разделителна способност (2 8). Светодиодът е свързан към ШИМ P0.0 и яркостта на светодиода може да се контролира с помощта на потенциометъра. За да научите повече за ADC в ARM7-LPC2148, следвайте връзката.
Стъпки, включени в програмирането на LPC2148 за PWM и ADC
Стъпка 1: - Първото нещо е да конфигурирате PLL за генериране на часовник, тъй като настройва системния часовник и периферния часовник на LPC2148 според нуждите на програмистите. Максималната тактова честота за LPC2148 е 60Mhz. Следващите редове се използват за конфигуриране на генерация на PLL часовник.
void initializePLL (void) // Функция за използване на PLL за генериране на часовник { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; докато (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Стъпка 2: - Следващото нещо е да изберете PWM щифтовете и PWM функцията на LPC2148, като използвате PINSEL регистър. Използваме PINSEL0, както използваме P0.0 за ШИМ изход на LPC2148.
PINSEL0 = 0x00000002; // Настройващ щифт P0.0 за ШИМ изход
Стъпка 3: - След това трябва да НУЛИРАМЕ таймерите, използвайки PWMTCR (Timer Control Register).
PWMTCR = (1 << 1); // Задаване на PWM Timer Control Register като нулиране на брояча
И след това задайте стойността на прескалата, която определя разделителната способност на ШИМ. Настройвам го на нула
PWMPR = 0X00; // Задаване на предварително зададена стойност на ШИМ
Стъпка 4: - След това трябва да зададем PWMMCR (PWM match control register), тъй като задава операция като нулиране, прекъсвания за PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // Настройване на регистър за контрол на съвпадение на PWM
Стъпка 5: - Максималният период на PWM канала се задава с PWMMR.
PWMMR0 = PWMvalue; // Даване на ШИМ стойност Максимална стойност
В нашия случай максималната стойност е 255 (за максимална яркост)
Стъпка 6: - След това трябва да настроим Latch Enable на съответните регистри на съвпадение, използвайки PWMLER
PWMLER = (1 << 0); // Резе на ШИМ на Enalbe
(Използваме PWMMR0) Така че активирайте съответния бит, като зададете 1 в PWMLER
Стъпка 7: - За да активираме PWM изхода към щифта, трябва да използваме PWMTCR за активиране на броячите на PWM таймера и режимите PWM.
PWMTCR = (1 << 0) - (1 << 3); // Активиране на PWM и PWM брояч
Стъпка 8: - Сега трябва да получим стойностите на потенциометъра за настройка на работния цикъл на ШИМ от ADC щифт P0.28. Така че ние използваме ADC модул в LPC2148 за преобразуване на потенциометър аналогов вход (0 до 3.3V) в ADC стойности (0 до 1023).
Тук преобразуваме стойностите от 0-1023 в 0-255, като го разделяме с 4, тъй като PWM на LPC2148 има 8-битова резолюция (2 8).
Стъпка 9: - За избор на ADC щифт P0.28 в LPC2148 използваме
PINSEL1 = 0x01000000; // Задаване на P0.28 като ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Настройка на часовник и PDN за A / D преобразуване
Следващите редове улавят аналоговия вход (0 до 3.3V) и го преобразуват в цифрова стойност (0 до 1023). И тогава тези цифрови стойности се разделят на 4, за да се преобразуват в (0 до 255) и накрая се подават като PWM изход в P0.0 пин на LPC2148, към който е свързан светодиодът.
AD0CR - = (1 << 1); // Избор на канал AD0.1 във времето за забавяне на регистъра ADC (10); AD0CR - = (1 << 24); // Стартиране на A / D преобразуването докато ((AD0DR1 & (1 << 31)) == 0); // Проверете бита СЪСТАВЕНО в ADC регистър на данни adcvalue = (AD0DR1 >> 6) & 0x3ff; // Вземете РЕЗУЛТАТА от регистъра на данни ADC dutycycle = adcvalue / 4; // формула за получаване на стойности на работния цикъл от (0 до 255) PWMMR1 = dutycycle; // задаване на стойност на работния цикъл на ШИМ регистър на съвпадение PWMLER - = (1 << 1); // Активиране на PWM изход със стойност на работния цикъл
Стъпка 10: - След това показваме тези стойности в LCD (16X2) дисплейния модул. Затова добавяме следните редове за инициализиране на LCD дисплейния модул
Void LCD_INITILIZE (void) // Функция за подготвяне на LCD { IO0DIR = 0x0000FFF0; // Задава ПИН P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 като OUTPUT delaytime (20); LCD_SEND (0x02); // Инициализиране на lcd в 4-битов режим на работа LCD_SEND (0x28); // 2 реда (16X2) LCD_SEND (0x0C); // Показване на курсора на разстояние LCD_SEND (0x06); // Автоматично увеличаване на курсора LCD_SEND (0x01); // Показване на ясен LCD_SEND (0x80); // Първа позиция първа позиция }
Тъй като свързвахме LCD в 4-битов режим с LPC2148, трябва да изпращаме стойности, които да се показват като хапка по хапване (горна и долна хапка). Така че се използват следните редове.
void LCD_DISPLAY (char * msg) // Функция за отпечатване на изпратените символи един по един { uint8_t i = 0; докато (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 ++; } }
За да покажем тези стойности на ADC и PWM, използваме следните редове във функцията int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (displayadc); // Показване на ADC стойност (от 0 до 1023) LCD_SEND (0xC0); sprintf (ledoutput, "PWM OP =%. 2f", яркост); LCD_DISPLAY (ledoutput); // Показване на стойности на работния цикъл от (0 до 255)
Пълното описание на кода и видеото на урока са дадени по-долу.