Подключение сервомотора (серводвигателя) к микроконтроллеру AVR ATmega16


Сервомоторы (от англ. Servo Motor), которые еще называют следящими электродвигателями или серводвигателями, широко применяются в тех областях, в которых необходим точный контроль, таких как роботы, автоматизированное оборудование, роботизированные руки и т.п. Тем не менее рамки применения сервомоторов не ограничиваются только перечисленными областями – они могут быть использованы и во многих других приложениях.

Подключение серводвигателя к микроконтроллеру AVR ATmega16: внешний вид

В этом проекте мы будет подключать сервомотор к микроконтроллеру ATmega16 (семейство AVR) используя программную среду Atmel Studio 7.0. Сервомотор работает от напряжения 4.8-6В. Мы можем контролировать (управлять) угол поворота и направление вращения сервомотора с использованием сигналов ШИМ (широтно-импульсной модуляции, в англ. – PWM). Необходимо отметить, что сервомоторы не могут поворачиваться на полные 360 градусов, они не используются там, где требуется непрерывное вращение двигателя. Обычно угол поворота для них лежит в пределах 0-180 градусов или от (-90) до (+90) градусов.

Общие принципы работы серводвигателей (сервомоторов)

Серводвигатели включают в свой состав небольшой двигатель постоянного тока, редуктор и схему управления, содержащую переменный резистор, дающий возможность установить выходной вал серводвигателя под определенным углом. Поэтому серводвигатели очень удобны для проектов, где требуется осуществлять весьма быстрое и относительно точное перемещение какого-либо рабочего органа.

Типы серводвигателей

Серводвигатели часто используются в радиоуправляемых моделях автомобилей для поворота рулевых колес или в моделях радиоуправляемых самолетов – для поворота управляющих поверхностей (рулей). На следующем рисунке показаны два серводвигателя разных размеров.

Внешний вид серводвигателей

Серводвигатель справа представляет собой так называемый стандартный серводвигатель. Это наиболее распространенный тип серводвигателя. Такие серводвигатели достаточно часто имеют одинаковые размеры и монтажные расстояния между отверстиями. Намного меньший (и более легкий) серводвигатель слева предназначен для летательных аппаратов. Эти серводвигатели называются сервоприводами 9g .

Сервоприводы с более высоким качеством исполнения и более высоким крутящим моментом имеют редуктор с шестернями из металла, а не из нейлона. Большинство серводвигателей работают на номинальном напряжении питания около 5 В при допустимом диапазоне питающих напряжений от 4 до 7 В. Подключение любительских сервоприводов обычно осуществляется через провода, заканчивающиеся 3-контактным разъемом: питание +, питание - и управляющий сигнал.

Большие и иногда весьма мощные серводвигатели также доступны для использования, но они не так стандартизированы, как любительские маломощные сервомашинки.

Устройство сервопривода

Сервопривод (см. рисунок) состоит из электродвигателя, постоянного тока, приводящего в действие редуктор, уменьшающий скорость вращения двигателя и, в то же время увеличивающий крутящий момент на валу. Для контроля положения выходного вала он соединен с датчиком положения (как правило, это переменный резистор). Для управления мощностью и направлением, в котором поворачивается двигатель сервопривода, схема управления использует входной сигнал от датчика положения в сочетании с сигналом управления, задающим требуемое положение.

Устрйство серводвигателя

Блок управления, получив через сигнал управления величину желаемого положения вала, вычитает из него величину действительного его положения и вырабатывает «сигнал ошибки», который может быть положительным или отрицательным. Этот «сигнал ошибки» подается на питание двигателя, заставляя его изменить положение вала в нужном направлении. Чем больше разница между желаемым и действительным положением выходного вала, тем быстрее двигатель будет поворачиваться к желаемой позиции. Чем ближе к нулю становится значение ошибки (рассогласования), тем меньше становится питание двигателя.

Управление серводвигателем

Управляющий сигнал на серводвигатель - это не напряжение, как можно было бы ожидать, а сигнал широтно-импульсной модуляции (ШИМ). Этот сигнал является стандартным для всех любительских сервомашинок и выглядит так, как показано на следующем рисунке.

Импульсы для управления серводвигателем

Серводвигатель ожидает прихода импульса управления каждые 20 мс. Импульс длительностью 1,5 мс установит серводвигатель в центральное положение, соответствующее повороту выходного вала на 90°. Более короткие импульсы в 1,0 мс установят выходной вал в начальное положение - 0°, а импульсы в 2,0 мс - крайнее положение - 180°. В реальности этот диапазон может быть немного меньше, чем полные 180°, без укорочения импульсов на одном конце и удлинения на другом. Не редкость и ситуация, когда для 0° нужен импульс 0,5 мс, а для 180° - 2,5 мс.

Назначение контактов сервомотора

Представлено на следующем рисунке. Я думаю, здесь все просто и понятно.

Назначение контактов сервомотора

1. Red (красный) = Положительное напряжение питания (от 4.8V до 6V)
2. Brown (коричневый) = Ground (земля)
3. Orange (оранжевый) = Control Signal – управляющий сигнал (PWM Pin – контакт ШИМ)

Необходимые компоненты

  1. Микроконтроллер ATmega16 (купить на AliExpress).
  2. Программатор AVR-ISP (купить на AliExpress), USBASP (купить на AliExpress) или другой подобный.
  3. Микро сервомотор SG90 Tower Pro (купить на AliExpress).
  4. Кварцевый резонатор 16 МГц (купить на AliExpress).
  5. Конденсатор 100 нФ (2 шт.) (купить на AliExpress).
  6. Конденсатор 22 пФ (2 шт.) (купить на AliExpress).
  7. Кнопка.
  8. Светодиод (купить на AliExpress).
  9. Макетная плата.
  10. Навесные проводники.
  11. Источник питания с напряжением 5 Вольт.

Работа схемы

Соедините все компоненты как показано на следующем рисунке.

Подключение сервомотора к микроконтроллеру AVR ATmega16: схема соединений

У микроконтроллера Atmega16 четыре контакта ШИМ, мы можем использовать любой из них. В этом проекте мы будем использовать контакт PD5 (OC1A) – мы его будем напрямую соединять с оранжевым проводом сервомотора. Светодиод будет использоваться для индикации питания. Также необходимо соединить одну кнопку с контактом сброса (Reset) микроконтроллера чтобы иметь возможность осуществлять его сброс в любое время. Соедините Atmega16 с кварцевым генератором. Вся наша конструкция будет работать от напряжения 5В.

Полностью собранная схема будет выглядеть следующим образом (под бумажкой - серводвигатель):

Подключение сервомотора к микроконтроллеру AVR ATmega16: конструкция в сборе

Управление сервомотором с использованием AVR ATmega16

Подобно шаговому двигателю, серводвигатель не нуждается ни в каком внешнем драйвере, например, ULN2003 или L293D. Для управления им нужен всего лишь сигнал ШИМ модуляции, который легко сформировать с помощью микроконтроллера семейства AVR. Вращающий момент используемого в нашем проекте серводвигателя составляет 2.5 кг/см, поэтому если вам нужен больший вращающий момент, то вам необходимо будет использовать другой серводвигатель.

В общих принципах работы сервомоторов мы уже выяснили что сервомотор ожидает прихода импульса каждые 20 мс, а от длительности положительного импульса будет зависеть угол поворота сервомотора.

Импульсы для управления сервомотором: картинка в цвете

Чтобы генерировать нужные нам импульсы мы будем использовать Таймер 1 микроконтроллера Atmega16. Микроконтроллер способен работать на частоте 16 МГц, но мы будем использовать частоту 1 МГц поскольку в нашем проекте нам ее вполне хватит для того чтобы микроконтроллер справился с возложенными на него функциями. Предделитель установим в 1, то есть получим шкалу 1 МГц/1 = 1 МГц. Таймер 1 будем использовать в режиме быстрой ШИМ (то есть Fast PWM Mode), то есть в режиме 14 (Mode 14). Вы можете использовать различные режимы таймера чтобы генерировать нужную вам последовательность импульсов. Более подробную информацию об этом вы можете найти в Atmega16 Official Datasheet.

Настройка параметров ШИМ для ATmega16

Чтобы использовать Таймер 1 в режиме быстрой ШИМ нам необходимо будет верхнее значение (TOP value) регистра ICR1 (Input Capture Register1 – входной захватывающий регистр). Найти значение TOP можно по следующей формуле:

fpwm = fcpu / n x (1 + TOP)

Это выражение можно упростить до следующего:

TOP = (fcpu / (fpwm x n)) – 1

где N = коэффициент деления предделителя
fcpu = частота процессора
fpwm = частота следования импульсов на входе серводвигателя, которая равна 50 Гц

То есть мы должны подставить в приведенную формулу следующие значения переменных: N = 1, fcpu = 1MHz, fpwm = 50Hz.

Подставив все это, мы получим ICR1 = 1999.

Это значит, что для того чтобы достичь максимального уровня, т.е. 1800 (поворот оси сервомотора на 180 градусов), необходимо чтобы ICR1 = 1999.

Для частоты 16 МГц и коэффициенте деления предделителя равному 16, получим ICR1 = 4999.

Исходный код программы на языке С (Си) с пояснениями

Представленный здесь код программы для микроконтроллера Atmega16 предназначен для вращения сервомотора с 00 до 1800 и возвращения назад с 1800 до 00. Это перемещение будет осуществлено за ряд последовательных шагов - 0 – 45 – 90 – 135 – 180 – 135 – 90 – 45 – 0. Чтобы задействовать функции задержки в программе мы будем использовать внутреннюю библиотеку Atmel Studio под названием <util/delay.h>.

Видео, демонстрирующее работу схемы

(3 голосов, оценка: 5,00 из 5)
Загрузка...
5 121 просмотров

Комментарии

Подключение сервомотора (серводвигателя) к микроконтроллеру AVR ATmega16 — 4 комментария

  1. Здравствуйте, вы пишете "Это значит, что для того чтобы достичь максимального уровня, т.е. 1800 (поворот оси сервомотора на 180 градусов), необходимо чтобы ICR1 = 1999." и потом "для вращения сервомотора с 00 до 1800 и возвращения назад с 1800 до 00.". Указанное вами значение 1800 это что? По какой формуле вычисляется? из контекста не понятно.
    Спасибо.

    • Добрый вечер, чтобы сервомотор повернуть на 180 градусов, необходим импульс в ШИМ сигнале длительностью 2 мс. Значение ICR1 = 1999, загруженное в таймер, позволяет засечь время равное 2 мс

  2. Здравствуйте.Вот я так написал код и все заработало.

    #define F_CPU 1000000UL
    #include
    #include

    int main(void)
    {
    TCCR1A |= (1<<COM1A1);
    TCCR1A &= ~(1<<COM1A0);

    TCCR1A &= ~(1<<WGM10);
    TCCR1A &= ~(1<<WGM11);
    TCCR1B &= ~(1<<WGM12);
    TCCR1B |= (1<<WGM13);

    TCCR1B |= (1<<CS11);
    TCCR1B &= ~(1<<CS10);
    TCCR1B &= ~(1<<CS12);

    OCR1A = 95;
    ICR1 = 1250;

    DDRB |= (1<<1) | (1<<2);
    PORTB &= ~((1<<1) | (1<<2));

    DDRD &= ~((1<<2) | (1<<3));
    PORTD |= (1<<2) | (1<<3);

    while (1)
    {
    if (0==(PIND & (1<<3)))
    {
    OCR1A -=5;
    _delay_ms(15);
    if (OCR1A <=45) OCR1A = 45;

    }
    else if ((0==(PIND & (1<145) OCR1A = 145;
    }
    else
    {
    OCR1A = 95;
    }
    }
    }

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *