В этой статье рассказывается, как управлять сервоприводом SG90 через микроконтроллер 51 для достижения угла поворота вперед и назад. Рулевой механизм SG90 является широко используемым микрорулевым механизмом. Он имеет небольшой размер, легкий вес и простую конструкцию. Он широко используется в роботах, моделях дистанционного управления и различных системах автоматического управления.
Используйте микроконтроллер 51 (STC89C52) в качестве контроллера и используйте его мощный порт ввода-вывода и функции таймера для управления сервоприводом SG90. Благодаря программному управлению сервоприводом можно точно управлять для вращения вперед или назад на заданный угол.
Управление рулевым механизмом достигается за счет широтно-импульсной модуляции (ШИМ). При управлении рулевым механизмом на рулевой механизм необходимо подавать серию импульсных сигналов. Ширина импульса определяет угловое положение рулевого механизма. Обычно период управляющего импульса сервопривода SG90 составляет 20 миллисекунд, ширина импульса составляет от 0,5 до 2,5 миллисекунды, а соответствующий диапазон угла составляет от 0 до 180 градусов.
Чтобы реализовать вращение рулевого механизма вперед и назад, необходимо контролировать ширину импульса в разных диапазонах для достижения разных угловых положений. Регулируя ширину и период импульса, мы можем управлять вращением сервопривода в соответствии с нашими требованиями.
Далее будет описано, как генерировать сигналы ШИМ, подходящие для сервопривода SG90, через порт ввода-вывода и таймер микроконтроллера 51. Напишите соответствующую программу, реализующую вращение сервопривода вперед и назад путем регулировки ширины импульса, и предоставьте пример кода.
Двигатель SG90 — это миниатюрный рулевой механизм, обычно используемый в моделях, роботах и других небольших механических устройствах.
1. Принцип работы: Двигатель SG90 основан на принципе двигателя постоянного тока и управляет углом поворота рулевого механизма посредством сигналов ШИМ (широтно-импульсной модуляции). Он состоит из двигателя, редуктора и цепи обратной связи по положению. Эта схема обратной связи использует потенциометр для определения текущего положения сервопривода и передачи его обратно в схему управления.
2. Особенности:
3. Метод управления: Для управления двигателем SG90 требуется сигнал ШИМ. Вот основные шаги по управлению двигателем SG90:
Номинальное рабочее напряжение двигателя SG90 составляет 4,8–6 В. Превышение этого диапазона может привести к повреждению двигателя. Во время работы сервопривод будет генерировать определенный пик тока. При его использовании необходимо убедиться, что источник питания обеспечивает достаточный ток.
Ниже приводится Управляйте сервоприводом SG90 для вращения вперед и назад в зависимости от угла с помощью микроконтроллера 51. Код реализации,Инкапсуляторфункциявызов:
#include <reg51.h>
// Определите контакты порта ввода-вывода для подключения сервопривода
sbit servoPin = P1^0;
// Функция задержки времени
void delay(unsigned int time) {
unsigned int i, j;
for(i = 0; i < time; i++) {
for(j = 0; j < 1000; j++);
}
}
// Управляйте рулевым механизмом для поворота вперед на заданный угол.
void rotateClockwise(unsigned int angle) {
unsigned int pulseWidth = 500 + angle * 11.11;
unsigned int i;
for(i = 0; i < 50; i++) {
servoPin = 1; // Выходной высокий уровень
delay(pulseWidth);
servoPin = 0; // Выходной низкий уровень
delay(20000 - pulseWidth);
}
}
// Управляйте рулевым механизмом для движения задним ходом под заданным углом.
void rotateCounterclockwise(unsigned int angle) {
unsigned int pulseWidth = 2500 - angle * 11.11;
unsigned int i;
for(i = 0; i < 50; i++) {
servoPin = 1; // Выходной высокий уровень
delay(pulseWidth);
servoPin = 0; // Выходной низкий уровень
delay(20000 - pulseWidth);
}
}
void main() {
while(1) {
// Поворот вперед на 90 градусов
rotateClockwise(90);
delay(2000); // Оставайтесь в течение 2 секунд
// Перевернуть на 90 градусов
rotateCounterclockwise(90);
delay(2000); // Оставайтесь в течение 2 секунд
}
}
Ниже приведен код реализации, который использует таймер 0 STC89C52 и порт GPIO для имитации генерации сигналов ШИМ:
#include <reg52.h>
#define FREQ_OSC 11059200UL // Микроконтроллер Работачастота
#define PWM_FREQ 50 // Частота ШИМ-сигнала
#define PWM_RESOLUTION 100 // Разрешение ШИМ-сигнала
sbit Servo = P1^0; // Штифт управления сервоприводом SG90
unsigned int pwmWidth = 0; // Ширина импульса ШИМ
// таймер0инициализацияфункция
void Timer0Init() {
EA = 0; // Отключить общее количество прерываний
TMOD &= 0xF0; // Очистить бит управления T0
TMOD |= 0x01; // Установите T0 в Режим работы 1 (16-битный таймер)
TH0 = (65536 - (FREQ_OSC / 12 / PWM_FREQ)) / 256; // Вычислите и установите старшие 8 бит начального значения счетчика.
TL0 = (65536 - (FREQ_OSC / 12 / PWM_FREQ)) % 256; // Вычислите и установите младшие 8 бит начального значения счетчика.
TR0 = 1; // запускатьтаймер0 ET0 = 1; // Разрешить прерывание таймера 0
EA = 1; // Включить полное прерывание
}
// таймер0Прерывание сервиснаяфункция
пустота Timer0Interrupt() interrupt 1 {
if (pwmWidth > PWM_RESOLUTION) {
Servo = 0; // Сброс сервопривода
} else {
Servo = 1; // Положение сервопривода
}
TH0 = (65536 - (FREQ_OSC / 12 / PWM_FREQ)) / 256; // Сброс старших 8 бит значения счетчика.
TL0 = (65536 - (FREQ_OSC / 12 / PWM_FREQ)) % 256; // Сброс младших 8 бит значения счетчика.
pwmWidth++; // Каждое прерывание увеличивает ширину импульса ШИМ
}
// хозяинфункция
void main() {
Timer0Init(); // инициализациятаймер0 while (1) {
if (pwmWidth > PWM_RESOLUTION) {
pwmWidth = 0;
}
}
}
В коде вывод P1^0 используется в качестве управляющего вывода сервопривода SG90, а сигнал ШИМ генерируется через таймер 0.
В функции Timer0Init установите для таймера 0 режим работы 16-битного таймера 1, рассчитайте и установите начальное значение счетчика, запустите таймер 0 и разрешите прерывание таймера 0.
В функции Timer0Interrupt регулируйте состояние уровня контакта сервоуправления каждый раз, когда Таймер 0 прерывается, и обновляйте значение счетчика Таймера 0.
В основной функции цикл определяет, достигает ли ширина импульса ШИМ установленного разрешения. Если она превышает, отсчет начинается снова с 0.