Підключення крокового двигуна. Контролер L298

Серия-статей: Програмування Ардуіно з нуля #8

Серія-статей: Ардуїно, використання крокових двигунів #1

Ми підключили до нашого контролера звичайні двигуни постійного струму. З їх допомогою можна, наприклад, рухати мобільну платформу на колісному або гусеничному ходу або здійснювати найпростіші дії (типу відкриття дверей або підняття штор). Ось тільки регулювати обертання цих двигунів можна лише подаючи на них певну напругу. І якщо ми, наприклад, подамо 100% потужності на одну секунду, ми не можемо бути впевнені, що за цей час двигун поверне вал, наприклад, на 100 оборотів. Адже навантаження може змінюватися, а відповідно і швидкість обертання за тієї ж заданої потужності. У разі візуального керування роботом це не проблема – побачив, що робот проїхав потрібну дистанцію – подав команду на зупинку. Але ми хотіли створювати саме автоматичні пристрої, які не вимагатимуть посіяної уваги. Тут є кілька варіантів:

Можна застосовувати спеціальні датчики (енкодери), які будуть говорити контролеру скільки саме здійснив оборотів здійснив вал двигуна. Тоді контролер сам зупинятиме двигун після потрібної кількості обертів, незалежно від змінного навантаження. Тож ми зможемо бути впевнені, що наш робот здійснив потрібне переміщення. Саме так влаштовані класичні сервоприводи - в них як датчик виступає поворотний потенціометр (саме він обмежує кут повороту) Ось тільки у такого способу мати свої недоліки - ми все одно можемо керувати тільки потужністю і часом відключення живлення. І керувати оборотами ми можемо не дуже точно - двигун ми відключили, але він може ще деякий час обертатися за інерцією. А для високошвидкісних двигунів за час реакції контролера вал може зробити кілька зайвих обертів.

Якщо нам потрібно забезпечити більш точне керування двигуном, щоб він робив точну кількість оборотів або навіть часткою обороту - тоді нам потрібно застосовувати крокові двигуни. З їхньою допомогою можна здійснювати дуже точні рухи, адже обертання валу контролюється з точністю до кількох градусів. Завдяки цьому можна використовувати такі двигуни для точних переміщень - у верстатах з ЧПУ, 3D принтерах і там, де можливостей сервоприводів недостатньо.

На відміну від сервоприводу, в якому використовується звичайний двигун постійного струму, нехай із додатковим датчиком, кроковий двигун спочатку побудований за іншою схемою. У нього не одна обмотка, а кілька незалежних обмоток. Причому обмотки розташовані паралельно ротору, але під кутом один до одного. Подача струму на одну з обмоток змушує ротор повертатися на невеликий кут і зупинитися. Якщо тепер вимкнути струм на першій обмотці, і подати на наступну – ротор повернеться ще частку обороту. А чергування аодачі напруги між обмотками змусить ротор обертатися, причому залежно від частоти це буде виглядати або як стрибкоподібний поворот валу двигуна на певний кут, або як безперервне обертання (у разі великої частоти перемикання обмоток). Причому тут ми контролюємо як потужність а й точну частоту обертання. І можемо задати точний кут повороту двигуна та відновити точно на певному куті повороту.

На відміну від традиційного двигуна постійного струму, кроковий двигун зазвичай має від чотирьох до шести дротів для підключення. Якщо дротів чотири – перед нами біполярій двигун. Два дроти підключені до однієї обмотки, два – до іншої. Схема підключення біполярного крокового двигуна до контролера на базі L298}

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

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

Схема підключення уніполярного крокового двигуна до контролера на базі L298 як біполярного

Таким чином, підключення обох варіантів крокових двигунів для контролера нічим не відрізняються – і там, і там ми будемо керувати двома виходами для кожної обмотки. Вибрати потрібний варіант потрібно виключно виходячи з типу двигуна, що є у нас, і того, що нам важливіше - швидкість обертання або крутний момент?

Звичайно, ми можемо вручну написати код, який з певним інтервалом буде чергувати подачу струму на обмотки і таким чином забезпечити керування нашим двигуном. Але цей код давно вже написаний і входить до стандартного складання Arduino IDE, просто підключимо бібліотеку Stepper командою #include . Тепер створимо об'єкт типу stepper і вкажемо, до яких саме пін підключені наші обмотки. Для цього нам потрібно вказати ще одну характеристику крокового двигуна - кількість кроків для одного обороту валу. Стандарти двигуни, які найпростіше придбати, зазвичай мають точність позиціонування 1,8 ° або 3.6 °. Цей кут відповідає значенню одного кроку, відповідно для одного обороту потрібно буде здійснити відповідно 200 і 100 кроків. Нехай наш двигун має точність 200 кроків на оборот:

const int StepsForRotation=200; // 200 кроків на оборот – 1.8 градуси на один крок

Stepper stepmotor (StepsForRotation, 4, 7); // Перша обмотка управляється виходом 4, друга - 7

Оскільки при керуванні кроковим двигуном використовується лише наявність або відсутність струму на обмотках, то нам немає необхідності в підключенні виходів із ШИМ регулюванням. Достатньо використовувати тільки піни I1 та I2. Логічна одиниця на виведенні буде відповідати подачі номінальної напруги на один кінець обмотки та нульового – на інший. Логічний нуль - номінальна напруга на другому кінці обмотки і нульового на першому. Таким чином, кожна з двох обмоток управляється одним цифровим виходом.

Також контролер двигуна може мати незалежне управління кожним виходом (тобто коли для керування однією парою висновків використовується три цифрові виходи – два звичайні для незалежного керування кожним виходом і один ШІМ для регулювання значення напруги, що подається). Тут ми повністю незалежно вказуємо, яку напругу (високу чи низьку) подавати на кожен з кінців обмотки, тобто кожна з двох обмоток керується за допомогою двох цифрових висновків

const int StepsForRotation=200;

Stepper stepmotor (StepsForRotation, 4, 5, 6, 7);

Схема підключення такого типу контролера двигуна:

Схема підключення уніполярного крокового двигуна до контролера на базі L298 з двома пінами для керування однією обмоткою

І в тому, і в іншому випадку на кожну обмотку буде потрапити струм на час, достатній для здійснення валом одного кроку. Потім струм з першої обмотки забирається, а подається на другу (для наступного кроку), або струм подається на обидві обмотки (для зупинки валу в поточному положенні) або струму з обох обмоток буде знято (для вільного обертання валу) Частота таких перемикань буде регулювати швидкість обертання. Для зміни частоти служить метод Stepper.setSpeed(int speed); який встановлює для нашого крокового двигуна певну швидкість обертання (в обертах на хвилину). При цьому при виклику цього методу двигун не почне обертатись із зазначеною швидкістю – ми лише встановлюємо швидкість. Для руху необхідно використовувати метод Stepper.step(int steps);, який подає команду двигуну зробити кроки steps зі швидкістю, встановленою командою setSpeed. Приклад використання для двигуна, підключеного до 4 та 7 пін:

/* Управління кроковим двигуном, підключеного до контролера на базі мікросхеми L298*/

#include // Підключаємо бібліотеку керування кроковими двигунами

const int StepsForRotation=200; // 200 кроків на оборот – 1.8 градуси на один крок

Stepper stepmotor (StepsForRotation, 4, 7); // Ініціалізуємо кроковий двигун 200 кроків на оборот, управління обмотками через 4 та 7 цифрові виходи

void setup()

{

stepmotor.setSpeed(60); // Встановлюємо швидкість обертання 60 оборотів за хвилину (1 оборот за секунду)

}

void loop()

{

stepmotor.step(100); // Посилаємо двигуну команду зробити 100 кроків (половину обороту)

delay(1000); // Чекаємо на одну секунду

stepmotor.step(-100); // Посилаємо двигуну команду зробити 100 кроків (половину обороту) у зворотному напрямку

delay(-1000);

}

Після завантаження на контрорлер, підключений до нього двигун зробить півоберта зі швидкістю 60 об/хв (1 об/сек, тобто на півоберта йому знадобиться 0.5 секунди), зупиниться на одну секунду, потім з тією ж швидкістю провернеться на півоберта у зворотному напрямку.

Потрібно всмоктувати, що ми тут не можемо безпосередньо впливати на швидкість обертання лише на частоту кроків. І якщо для середніх і великих швидкостей обертання це не так важливо, то при малих значеннях швидкості буде добре помітне переривчасте обертання валу. Наприклад, при встановленій швидкості 1 оборот за хвилину вал двигуна не буде повільно обертатися зі швидкістю 6 градусів за секунду. Він максимально швидко повернеться на 1,8 градуси, потім зупиниться на третину секунди мс, потім повернеться ще на 1,8 градуси, і т.д. Для середніх швидкостей таке уривчасте значення буде не так помітно, зате добре чути часті клацання (з частотою перемикання обмоток). Тому в тих випадках, де потрібний повільний і плавний рух, використовувати крокові двигуни безпосередньо не вийде - потрібно буде додавати знижувальний редуктор або використовувати традиційні двигуни постійного струму.

Еще:

Программирование контроллеров – с чего начать (Программирование Arduino с нуля #1)
Подключение периферии, платы расширения (Программирование Arduino с нуля #2)
Организация питания для Arduino (Программирование Arduino с нуля #3)
Подключаем сервопривод к Arduino (Программирование Arduino с нуля #4)
Создаем класс для управления сервоприводом (Программирование Arduino с нуля #6)
Подключение шагового двигателя. Контроллер L298 (Программирование Arduino с нуля #8)