- Серводвигатель
- Управление серводвигателем с помощью ШИМ и АЦП LPC2148
- Контакты PWM и ADC в 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
- Как использовать АЦП в ARM-LPLC2148
Контакты PWM и ADC в ARM7-LPC2148
На изображении ниже показаны выводы ШИМ и АЦП в LPC2148. Желтые прямоугольники обозначают (6) контактов ШИМ, а черные прямоугольники обозначают (14) контактов АЦП.
Необходимые компоненты
Оборудование
- ARM7-LPC2148
- ЖК-дисплей (16x2) Дисплейный модуль
- Серводвигатель (SG-90)
- Регулятор напряжения 3,3 В
- Потенциометр 10k (2 шт.)
- Макетная плата
- Подключение проводов
Программного обеспечения
- Keil uVision5
- Инструмент Flash Magic
Принципиальная схема и подключения
В таблице ниже показано соединение между серводвигателем и ARM7-LPC2148:
СЕРВО ПИН |
ARM7-LPC2148 |
КРАСНЫЙ (+ 5В) |
+ 5В |
КОРИЧНЕВЫЙ (ЗЕМЛЯ) |
GND |
ОРАНЖЕВЫЙ (ШИМ) |
P0.1 |
Вывод P0.1 - это выход ШИМ LPC2148.
В таблице ниже показаны схемы соединений между ЖК-дисплеем и ARM7-LPC2148.
ARM7-LPC2148 |
ЖК-дисплей (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 |
+ 5В |
ВДД, А |
В приведенной ниже таблице показаны соединения между ARM7 LPC2148 и потенциометр с регулятором напряжения 3.3В.
ИС регулятора напряжения 3.3V |
Функция булавки |
ARM-7 LPC2148 контакт |
1. левый штифт |
- Ve от GND |
Контакт GND |
2. центральный штифт |
Регулируемый выход + 3,3 В |
К входу потенциометра и выходу потенциометра на P0.28 LPC2148 |
3. правая булавка |
+ Ve от 5В ВВОД |
+ 5В |
Следует отметить
1. Здесь используется стабилизатор напряжения 3,3 В для подачи аналогового входного значения на вывод АЦП (P0.28) LPC2148. Поскольку мы используем мощность 5 В, нам необходимо регулировать напряжение с помощью регулятора напряжения 3,3 В.
2. Потенциометр используется для изменения напряжения в диапазоне (от 0 В до 3,3 В) для обеспечения аналогового входа (АЦП) на вывод P0.28 LPC2148.
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 МГц. Следующие строки используются для настройки генерации тактовой частоты ФАПЧ.
void initilizePLL (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 для вывода PWM LPC2148.
PINSEL0 - = 0x00000008; // Установка контакта P0.1 LPC2148 как PWM3
Шаг 4: - Затем нам нужно СБРОСИТЬ таймеры с помощью PWMTCR (Регистр управления таймером).
PWMTCR = 0x02; // Сбросить и отключить счетчик для ШИМ
Затем установите значение предварительного масштабирования, которое определяет разрешение ШИМ.
PWMPR = 0x1D; // Предварительное масштабирование значения регистра
Шаг 5: - Затем установите PWMMCR (регистр управления согласованием PWM), поскольку он устанавливает такие операции, как сброс, прерывания для PWMMR0 и PWMMR3.
PWMMCR = 0x00000203; // Сброс и прерывание при совпадении MR0, прерывание при совпадении MR3
Шаг 6: - Максимальный период канала PWM устанавливается с помощью PWMMR0, а Ton рабочего цикла PWM изначально устанавливается на 0,65 мс.
PWMMR0 = 20000; // Временной период волны ШИМ, 20 мсек PWMMR3 = 650; // Тонна волны ШИМ 0,65 мс
Шаг 7: - Затем нам нужно установить Latch Enable на соответствующие регистры совпадения с помощью PWMLER
PWMLER = 0x09; // Разрешение защелки для PWM3 и PWM0
(Мы используем PWMMR0 и PWMMR3) Итак, активируйте соответствующий бит, установив 1 в PWMLER
Шаг 8: - Чтобы включить вывод ШИМ на вывод, нам нужно использовать PWMTCR для включения счетчиков таймера ШИМ и режимов ШИМ.
PWMPCR = 0x0800; // Включить PWM3 и PWM 0, PWMTCR с одним фронтом PWMTCR = 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 для аналого-цифрового преобразования
Следующие строки фиксируют аналоговый вход (от 0 до 3,3 В) и преобразуют его в цифровое значение (от 0 до 1023). Затем эти цифровые значения делятся на 4, чтобы преобразовать их в (от 0 до 255), и, наконец, подаются как выход ШИМ на вывод P0.1 LPC2148. Здесь мы преобразуем значения от 0-1023 до 0-255, разделив их на 4, поскольку ШИМ LPC2148 имеет 8-битное разрешение (28).
AD0CR - = (1 << 1); // Выбираем канал AD0.1 в регистре АЦП delaytime (10); AD0CR - = (1 << 24); // Запускаем аналого- цифровое преобразование while ((AD0DR1 & (1 << 31)) == 0); // Проверяем бит DONE в регистре данных АЦП adcvalue = (AD0DR1 >> 6) & 0x3ff; // Получаем РЕЗУЛЬТАТ из регистра данных АЦП dutycycle = adcvalue / 4; // формула для получения значений рабочего цикла от (0 до 255) PWMMR1 = dutycycle; // устанавливаем значение рабочего цикла в регистр совпадения ШИМ 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 Режим записи delaytime (2); IO0CLR = 0x00000040; // EN = 0, RS и RW без изменений (т.е. RS = 1, RW = 0) delaytime (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 (дисплей ADC); // Отображение значения АЦП (от 0 до 1023) angle = (adcvalue / 5.7); // Формула для преобразования значения АЦП в угол (от o до 180 градусов) LCD_SEND (0xC0); sprintf (значение угла, "УГОЛ =%. 2f град", угол); LCD_DISPLAY (значение угла);
Полный код и видео-описание учебника приведены ниже.