- Серво мотор
- Управление на серво мотора с помощта на LPC2148 PWM & ADC
- ШИМ и ADC щифтове в ARM7-LPC2148
- Необходими компоненти
- Електрическа схема и връзки
- Програмиране ARM7-LPC2148 за управление на серво мотора
В нашия предишен урок сме свързали стъпков двигател с ARM7-LPC2148. В този урок ще управляваме сервомотора с ARM7-LPC2148. Серво моторът има предимство с ниска консумация на енергия пред стъпков двигател. Серво мотор спира консумацията на енергия, когато се достигне желаната позиция, но стъпковият двигател непрекъснато консумира енергия, за да заключи вала в желаното положение. Серво двигателите се използват най-вече в проектите за роботика поради тяхната точност и лесна работа.
В този урок ще научим за Servo Motor и как да свържем Servo с ARM7-LPC2148. Потенциометърът също е свързан за промяна на позицията на вала на сервомотора и LCD за показване на стойността на ъгъла.
Серво мотор
Серво мотор е комбинация от DC мотор, система за управление на позицията и предавки. Въртенето на серво мотора се контролира чрез прилагане на ШИМ сигнал към него, ширината на ШИМ сигнала решава ъгъла на въртене и посоката на двигателя. Тук ще използваме серво мотор SG90 в този урок, той е един от популярните и най-евтините. SG90 е серво на 180 градуса. Така че с това серво може да позиционираме оста от 0-180 градуса:
- Работно напрежение: + 5V
- Тип на предавката: Пластмаса
- Ъгъл на въртене: 0 до 180 градуса
- Тегло: 9gm
- Въртящ момент: 2,5 кг / см
Преди да започнем програмирането на серво мотора, трябва да знаем какъв тип сигнал трябва да бъде изпратен за управление на серво мотора. Трябва да програмираме MCU да изпраща PWM сигнали към сигналния проводник на серво мотора. Вътре в сервомотора има контролна схема, която отчита работния цикъл на ШИМ сигнала и позиционира вала на сервомоторите на съответното място, както е показано на снимката по-долу
На всеки 20 милисекунди сервомоторът проверява пулса. Така че, регулирайте ширината на импулса на сигнала, за да завъртите вала на двигателя.
- Ширина на импулса 1 ms (1 милисекунда) за завъртане на серво до 0 градуса
- Ширина на импулса 1,5ms за завъртане до 90 градуса (неутрално положение)
- Ширина на импулса 2 ms за въртене на серво на 180 градуса.
Преди да свържете серво с ARM7-LPC2148, можете да тествате серво с помощта на тази верига за тестер на серво мотор. Също така проверете как серво мотор може да бъде свързан с други микроконтролери:
- Серво моторно управление с помощта на Arduino
- Интерфейс на серво мотора с микроконтролер 8051
- Управление на серво мотора с помощта на MATLAB
- Серво моторно управление с Raspberry Pi
- Взаимодействие на серво мотор с MSP430G2
- Свързващ серво мотор със STM32F103C8
Управление на серво мотора с помощта на LPC2148 PWM & ADC
Серво мотор може да се управлява от LPC2148 с помощта на ШИМ. Чрез предоставяне на PWM сигнал към PWM щифта на SERVO с период от 20ms и честота от 50Hz, ние можем да позиционираме вала на серво мотора около 180 градуса (-90 до +90).
Потенциометър се използва за промяна на работния цикъл на ШИМ сигнала и завъртане на вала на сервомотора, този метод е реализиран чрез използване на модула ADC в LPC2148. Така че имаме нужда както от PWM, така и от ADC концепции, които да бъдат приложени в този урок. Така че любезно вижте нашите предишни уроци, за да научите PWM и ADC в ARM7-LPC2148.
- Как да използвам ШИМ в ARM7-LPC2148
- Как да използвам ADC в ARM-LPLC2148
ШИМ и ADC щифтове в ARM7-LPC2148
Изображението по-долу показва PWM и ADC щифтовете в LPC2148. Жълтите полета показват (6) PWM щифтове, а черните карета (14) ADC щифтове.
Необходими компоненти
Хардуер
- ARM7-LPC2148
- LCD (16x2) дисплеен модул
- Серво мотор (SG-90)
- 3.3V регулатор на напрежение
- 10k потенциометър (2 Nos)
- Макет
- Свързване на проводници
Софтуер
- Keil uVision5
- Инструмент Flash Flash
Електрическа схема и връзки
Таблицата по-долу показва връзката между сервомотора и ARM7-LPC2148:
СЕРВО ПИНОВЕ |
ARM7-LPC2148 |
ЧЕРВЕН (+ 5V) |
+ 5V |
КАФЯВ (GND) |
GND |
ОРАНЖЕВ (ШИМ) |
P0.1 |
Пинът P0.1 е PWM изходът на LPC2148.
Таблицата по-долу показва верижните връзки между 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 |
Таблицата по-долу показва връзките между 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
3. Пинът P0.1 на LPC2148 осигурява PWM изход към серво мотора за управление на позицията на двигателя.
4. Според стойността на аналоговия вход (ADC) позицията на серво мотора се променя от (0 до 180 градуса) през ШИМ изходен щифт при P0.1 на LPC2148.
Програмиране 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.
Стъпки, свързани с конфигурирането на LPC2148 за ШИМ и ADC за управление на серво мотора
Стъпка 1: - Включете необходимите заглавни файлове за кодиране на LPC2148
#include
Стъпка 2: - Следващото нещо е да конфигурирате 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; }
Стъпка 3: - Следващото нещо, което трябва да направите, е да изберете PWM щифтовете и PWM функцията на LPC2148, като използвате PINSEL регистър. Използваме PINSEL0, както използваме P0.1 за ШИМ изход на LPC2148.
PINSEL0 - = 0x00000008; // Настройка на щифт P0.1 на LPC2148 като PWM3
Стъпка 4: - След това трябва да НУЛИРАМЕ таймерите, използвайки PWMTCR (Timer Control Register).
PWMTCR = 0x02; // Нулиране и деактивиране на брояча за ШИМ
И след това задайте стойността на прескалата, която решава разделителната способност на ШИМ.
PWMPR = 0x1D; // Стойност на регистъра от предскала
Стъпка 5: - След това задайте PWMMCR (регистър за контрол на съвпадение на PWM), тъй като задава операция като нулиране, прекъсвания за PWMMR0 и PWMMR3.
PWMMCR = 0x00000203; // Нулиране и прекъсване на MR0 мач, прекъсване на MR3 мач
Стъпка 6: - Максималният период на PWM канала се задава с PWMMR0 и тонът на работния цикъл на PWM първоначално е зададен на 0,65msec
PWMMR0 = 20000; // Период от време на PWM вълна, 20msec PWMMR3 = 650; // Тон PWM вълна 0,65 msec
Стъпка 7: - След това трябва да настроим Latch Enable на съответните регистри на съвпадение, използвайки PWMLER
PWMLER = 0x09; // Активиране на заключване за PWM3 и PWM0
(Използваме PWMMR0 и PWMMR3) Така че активирайте съответния бит, като зададете 1 в PWMLER
Стъпка 8: - За да активираме PWM изхода към щифта, трябва да използваме PWMTCR за активиране на броячите на PWM таймера и режимите PWM.
PWMPCR = 0x0800; // Активиране на PWM3 и PWM 0, PWM с един ръб PWMTCR = 0x09; // Активиране на PWM и брояч
Стъпка 9: - Сега трябва да получим стойностите на потенциометъра за настройка на работния цикъл на ШИМ от ADC щифт P0.28. Така че, ние използваме ADC модул в LPC2148 за преобразуване на потенциометър аналогов вход (0 до 3.3V) в ADC стойности (0 до 1023).
Стъпка 10: - За избор на 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.1 пин на LPC2148. Тук преобразуваме стойностите от 0-1023 в 0-255, като го разделяме с 4, тъй като ШИМ на LPC2148 има 8-битова резолюция (28).
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 изход със стойност на работния цикъл
Стъпка 11: - След това показваме тези стойности в дисплейния модул 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", работен цикъл); LCD_DISPLAY (displayadc); // Показване на ADC стойност (от 0 до 1023) ъгъл = (adcvalue / 5.7); // Формула за преобразуване на стойността на ADC в ъгъл (o до 180 градуса) LCD_SEND (0xC0); sprintf (anglevalue, "ANGLE =%. 2f deg", ъгъл); LCD_DISPLAY (ъглова стойност);
Пълното описание на кода и видеото на урока са дадени по-долу