Підключення сервоприводу до мікроконтролеру - як підключити - avr - проекти на мікроконтролерах

Підключення сервоприводу до мікроконтролеру - як підключити - avr - проекти на мікроконтролерах

Сервопривод, як і кроковий двигун. є елементом точної кінематики, що дозволяє досягати точне позиціювання механізмів. Але на відміну від крокової двигуна, сервопривід має зворотний зв'язок, що дозволяє в будь-який момент відстежити точний кут повороту вала. Як джерело зворотного зв'язку можуть бути використані різні типи енкодерів і потенціометри.

У статті розглянемо підключення і роботу з молодшими представниками сервоприводів - т.зв. сервомашинками - гаряче улюбленими серед роботостроітелей і моделістів.

Сервомашинка складається з корпусу, в якому укладено невеликий колекторний електромотор, редуктор і керуюча електроніка.

Підключення сервоприводу до мікроконтролеру - як підключити - avr - проекти на мікроконтролерах

В якості зворотнього зв'язку застосовуються потенціометри. Тому ці серви мають обмеження по куту повороту вала навколо осі. Так, в придбаних мною Серв Futaba S3003, кут повороту вихідного валу становить 225 °.

Технічні характеристики Futaba S3003

Потенціометр зворотного зв'язку посаджений прямо на вихідний вал, завдяки йому блок управління сервомашинки відстежує точне положення вала: опір потенціометра змінюється пропорційно куту повороту. Прочитавши опір, блок управління порівнює це значення з тим, яке повинно бути при заданому положенні вала. Якщо ці значення відрізняються, блок управління дає команду двигуну повернути вал в заданому напрямку, зменшуючи різницю значень. Досягнувши положення вала, коли значення з потенціометра збігається з заданим значенням, двигун зупиняється. Зчитування значення з потенціометра і його порівняння відбувається з великою частотою, тому вихідний вал буде прагнути зайняти задане положення при зміні зовнішнього навантаження.

Конструкція сервомашинки виконана таким чином, що крутний момент від двигуна до вихідного валу передається через редуктор з великим передавальним числом, тому при малих розмірах і енерговитратах, сервомашинки можуть забезпечувати більшу тягу.

В якості керуючого сигналу служить імпульсний сигнал з періодом 20 мс і з тривалістю від 0,8 до 2,2 мс. Це певний стандарт управління сервомашинок. Чим довше прийшов імпульс, тим на більший кут повернеться вал сервомашинки. Для розгону сервомашинки період проходження імпульсів можна зменшити до 10 мс.

Підключення сервоприводу до мікроконтролеру - як підключити - avr - проекти на мікроконтролерах

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

Підключення сервоприводу до мікроконтролеру - як підключити - avr - проекти на мікроконтролерах

Як видно управляти Серв досить просто - досить гнати імпульсний сигнал з потрібною частотою і шпаруватістю. Цей сигнал можна генеріовать ШІМ. або написати свою функцію обробки переривання по таймеру. Але в Bascom-AVR вже є вбудована команда для управління сервомашинками - Servo. Її і розглянемо.

Для початку необхідно конфігурувати підключення сервомашинок:

Config Servos = X. Servo1 = Portb. 0. Servo2 = Portb. 1. Reload = Var

Servos = X; вказується кількість підключаються сервомашинок, можливе підключення до 14 серв.

Servo1 = Portb. 0; вказується порт підключення першої серви

Servo2 = Portb. 1; вказується порт підключення другий серви

Reload = Var; тут Var час в мікросекундах, яке проходить між перериваннями від таймера.

За замовчуванням для організації переривань використовується Timer0, тому використовувати його в своїх цілях вже не вийти. Bascom-AVR дозволяє перекинути обслуговування переривань на будь-який інший таймер, наприклад щоб звільнити Timer0 і задествовать Timer1 досить вказати це в рядку конфігурації:

Config Servos = 2. Servo1 = Portb. 0. Servo2 = Portb. 1. Reload = 10. Timer = Timer1

Після того як всі сконфигурировали залишається тільки рулювати нашої сервомашинки. Це робиться за допомогою такої команди

а - порядковий номер сервомашинки

F - змінна, значення якої задає кут повороту вала серви

Тестовий код цілком:

$ Regfile = "m8def.dat" 'мікроконтролер ATmega8
$ Crystal = 8000000 'частота роботи 8МГц

'Конфігуруємо порти для підключення сервоприводів
Config Portb. 0 = Output
Config Portb. 1 = Output

'Налаштовуємо підключення двох сервомашинок
Config Servos = 2. Servo1 = Portb. 0. Servo2 = Portb. 1. Reload = 15

Dim F AsByte 'змінна для першої серви
Dim S AsByte 'змінна для другої серви

'Дозволяємо переривання
EnableInterrupts

F = 15 'значенням змінної задається кут повороту вала сервомашинки
S = 70

Схему підключення не наводжу, думаю один сигнальний провід проблем не викличе;) Його можна підключати до порту мікроконтролера безпосередньо, а можна через резистор опором пару сотень ом - для перестраховки.

Змінюючи значення перемменних F і S можемо змінювати кут повороту першої і другої сервомашинок відповідно. Чим менше значення параметра Reload, тим спритніше наші сервомашинки будуть повертатися на потрібний кут.

Для своїх серв підібрав робочий диапаз він значень Servo (a), в яких вал може обертатися. Крайнє положення вал займає при значенні 0 і 150, відповідно при значенні 75 вал займає проміжне положення.

Підключення сервоприводу до мікроконтролеру - як підключити - avr - проекти на мікроконтролерах
Підключення сервоприводу до мікроконтролеру - як підключити - avr - проекти на мікроконтролерах
Підключення сервоприводу до мікроконтролеру - як підключити - avr - проекти на мікроконтролерах

Servo (a) = 0 Servo (a) = 75 Servo (a) = 150

Підкажіть, я намагаюся зчитувати сигнали "серво" з радіоприймача, але чомусь лічені дані мають високий розкид (сервоприводи НЕ Дригало, але дані зчитуються з високі розкидом)?
Я зчитую за допомогою команд: Timer (вимірюю імпульс) або ADC (вимірюю напруга).
Найцікавіше, то що вимірював напругу цифровим мультиметром і напруга "на каналі серво" було стабільно (все відмінно), але при зчитування напруги за допомогою Atmega8 (команда ADC), мікросхема постійно видає дані про малі. Не знаєте, чому не вдається вірно вважати напругу за допомогою Atmega8? Підключав так-же і резистори, що гасять, але лічений напруга все одно гуляє.

Може, є ще спосіб вважати сигнали "серво" від радіоприймача?

погрався з програмою вощем не знаю як ваша машинка а моя HITEC HS 422, на відріз відмовилася працювати на 8 мегагерц, правда запустив на атюні 2313 але 4 добре стабільно і 2 мегагерци дуже жваво так, ось хотілося б щоб був опис по докладніше ну що ще можна в прогу втюхати, там може регулювання кута від резистора там або від далекоміра наприклад ось СПАСИБІ ВАМ

Схожі статті