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