Blog the XELFAER

Заметки *NIX

Подключение сервопривода к микроконтроллеру —

В сети достаточно много статей связанных с подключением сервоприводов к микроконтроллерам, но в основном большая часть использует уже готовые платформы такие как Arduino или его клоны, а вот с подключением к обычному МК информации достаточно скудно. Было перелопачено вагон статей, спален один сервопривод(пал смертью храбрых от перегрева — но не зря в итоге), и цель была достигнута. В данной статье я и постараюсь рассказать что в итоге вышло и с какими проблемами столкнулся.

Для начала потребуется микроконтроллер. Для моей задумки требовалось всего 2 ШИМ канала и изначально был выбран МК Atmega8, но потом было решено использовать Attiny2313, так как прошивка будет занимать не много места, да и у него есть 4 ШИМ канала, поэтому эта идея показалась более рентабельной. Сервопривод был куплен TowerPro SG90 на который только недавно смог найти datasheet более менее неплохой. Сравнивал цены на разных магазинах(на радиорынках почему то вообще или не слышали о них или нет никаких вообще) в нашей стране, самым дешевым по цене+стоимость доставки вышло на zelectro.

Схема устройства:
attiny2313_servo

На схеме указан необходимый минимум обвязки для МК. Конечно можно было выкинуть кварцевый резонатор и использовать внутренний тактовый генератор МК, но так как я использую макетку — решил задействовать внешний кварц. Разъем JP1 служит для подключения сервопривода. К выводу №1 разъема JP1 подключается сигнальный провод сервопривода, к выводу №2 подключается +5V от отдельного источника питания,а вывод №3 — GND необходимо соединить от отдельного источника питания с GND МК.
Сразу стоит сказать почему используется отдельный источник питания: так как сервопривод потребляет достаточно немало то при питании от USB порта ПК происходит просадка напряжения и вал сервы начинал судорожно дергаться.

Далее можно приступить к написанию прошивки для МК. Для начала необходимо рассчитать значения для ШИМ. Что бы рассчитать воспользуемся формулой:

Fpwm = Fosc/ n*(1+TOP);
где: Fosc — частота кварцевого резонатора, n — делитель частоты

подставим наши данные для расчета:
TOP = (12*1000000)/(8*50)-1=29999

зы. для тех кому лень считать во вложении есть калькулятор для расчета значения.

Также нам понадобятся значения крайних положений для сервопривода который обычно указывается в datasheet на серву. Для данной модели пришлось подбирать методом научного тыка исходя из указанных в datasheet: 0о = 1000 и 180о = 3400. Для наглядности реализуем непрерывное вращение вала сервы от 0о до 180о и обратно.

Код прошивки собственно вот:

#include <avr/io.h>
#include <util/delay.h>

//*** Главная программа ***//
int main(void)
{
    DDRD=0x00;      //установим все порты DDRD как входы
    PORTD=0x00;     //установим логический 0 на все порты DDRD

    //устанавливаем Timer1 в режим Fast PWM mode 14 (выход на порт PB3)
    TCCR1A = (1<<COM1A1) | (1<<WGM11);                      //clear on compare
    TCCR1B = (1<<WGM12)  | (1<<WGM13) | (1<<CS11);          //делитель частоты 8

    DDRB |= (1<<3);     //устанавливаем PB3 как выход

    ICR1=29999;         //период = 20 ms
   
    int i;

    while(1)
        {  
            for (i=1000; i<3400; i=i+10)    //перемещение вала сервы от 0 до 180 градусов
            {
                OCR1A=i;
                _delay_ms(10);
            }
           
            for (i=3400; i>1000; i=i-10)    //перемещение вала сервы от 180 до 0 градусов
            {
                OCR1A=i;
                _delay_ms(10);
            }
        };
}

Компилируем прошивку:

avr-gcc -mmcu=attiny2313 -I. -gdwarf-2 -DF_CPU=12000000UL -Os -o main.o main.c
avr-objcopy -O ihex main.o main.hex

Заливаем прошивку в МК:

avrdude -c usbasp -p t2313 -U flash:w:main.hex

Выставляем fuse:
hfuse: 0xdf
lfuse: 0xff

И напоследок видео работы:

Скачать архив прошивки: firmware

© 2014 — 2015, XELFAER. Все права защищены. Использование материалов блога разрешается только при указании активной ссылки на статью.

Print Friendly, PDF & Email

Рубрики: Linux | Microcontrollers | Radioelectronica


комментария 2

  1. luk:

    Спасибо за статью!
    Подскажите пожалуйста, а 3 сервомотора SG90 с мк ATtiny2313 как соединить?

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