Підключення сервоприводу до мікроконтролеру - blog the xelfaer

У мережі досить багато статей пов'язаних з підключенням сервоприводів до мікроконтролерів, але в основному велика частина використовує вже готові платформи такі як Arduino або його клони, а ось з підключенням до звичайного МК інформації досить бідно. Було перелопачено вагон статей, спалень один сервопривід (загинув смертю хоробрих від перегріву - але не дарма в результаті), і мета була досягнута. У даній статті я і спробую розповісти що в підсумку вийшло і з якими проблемами зіткнувся.

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

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

Далі можна приступити до написання прошивки для МК. Для початку необхідно розрахувати значення для ШІМ. Що б розрахувати скористаємося формулою:

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


підставимо наші дані для розрахунку:


зи. для тих кому ліньки рахувати у вкладенні є калькулятор для розрахунку значення.

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

Код прошивки власне ось:

#include
#include

// *** Головна програма *** //
int main # 40; void # 41;
# 123;
DDRD = 0x00; // встановимо всі порти DDRD як входи
PORTD = 0x00; // встановимо логічний 0 на всі порти DDRD

// встановлюємо Timer1 в режим Fast PWM mode 14 (вихід на порт PB3)
TCCR1A = # 40; 1 < TCCR1B = # 40; 1 <

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

ICR1 = 29999; // період = 20 ms

while # 40; 1 # 41;
# 123;
for # 40; i = 1000; i <3400 ; i = i + 10 ) //перемещение вала сервы от 0 до 180 градусов
# 123;
OCR1A = i;
_delay_ms # 40; 10 # 41; ;
# 125;

for # 40; i = 3400; i> 1000; i = i - 10 # 41; // переміщення вала серви від 180 до 0 градусів
# 123;
OCR1A = i;
_delay_ms # 40; 10 # 41; ;
# 125;
# 125; ;
# 125;

Схожі статті