Підключення крокового двигуна. Контролер L298
Серия-статей: Програмування Ардуіно з нуля #8
Серія-статей: Ардуїно, використання крокових двигунів #1
Можна застосовувати спеціальні датчики (енкодери), які будуть говорити контролеру скільки саме здійснив оборотів здійснив вал двигуна. Тоді контролер сам зупинятиме двигун після потрібної кількості обертів, незалежно від змінного навантаження. Тож ми зможемо бути впевнені, що наш робот здійснив потрібне переміщення. Саме так влаштовані класичні сервоприводи - в них як датчик виступає поворотний потенціометр (саме він обмежує кут повороту) Ось тільки у такого способу мати свої недоліки - ми все одно можемо керувати тільки потужністю і часом відключення живлення. І керувати оборотами ми можемо не дуже точно - двигун ми відключили, але він може ще деякий час обертатися за інерцією. А для високошвидкісних двигунів за час реакції контролера вал може зробити кілька зайвих обертів.
Якщо нам потрібно забезпечити більш точне керування двигуном, щоб він робив точну кількість оборотів або навіть часткою обороту - тоді нам потрібно застосовувати крокові двигуни. З їхньою допомогою можна здійснювати дуже точні рухи, адже обертання валу контролюється з точністю до кількох градусів. Завдяки цьому можна використовувати такі двигуни для точних переміщень - у верстатах з ЧПУ, 3D принтерах і там, де можливостей сервоприводів недостатньо.
На відміну від сервоприводу, в якому використовується звичайний двигун постійного струму, нехай із додатковим датчиком, кроковий двигун спочатку побудований за іншою схемою. У нього не одна обмотка, а кілька незалежних обмоток. Причому обмотки розташовані паралельно ротору, але під кутом один до одного. Подача струму на одну з обмоток змушує ротор повертатися на невеликий кут і зупинитися. Якщо тепер вимкнути струм на першій обмотці, і подати на наступну – ротор повернеться ще частку обороту. А чергування аодачі напруги між обмотками змусить ротор обертатися, причому залежно від частоти це буде виглядати або як стрибкоподібний поворот валу двигуна на певний кут, або як безперервне обертання (у разі великої частоти перемикання обмоток). Причому тут ми контролюємо як потужність а й точну частоту обертання. І можемо задати точний кут повороту двигуна та відновити точно на певному куті повороту.
На відміну від традиційного двигуна постійного струму, кроковий двигун зазвичай має від чотирьох до шести дротів для підключення. Якщо дротів чотири – перед нами біполярій двигун. Два дроти підключені до однієї обмотки, два – до іншої.
Якщо ж дротів шість - це уніполяриний двигун. По два дроти підключені до кінців кожної обмотки та по одному – у її середині. Ці дроти підключається до заземлення.
У порівнянні з біполярним двигуном, таке підключення забезпечує велику швидкість обертання, але зменшує момент, що крутить. Якщо нам важливий саме момент, можна просто не підключати ці дроти, тобто. ми зробимо з уніполярного двигуна біполярний
Таким чином, підключення обох варіантів крокових двигунів для контролера нічим не відрізняються – і там, і там ми будемо керувати двома виходами для кожної обмотки. Вибрати потрібний варіант потрібно виключно виходячи з типу двигуна, що є у нас, і того, що нам важливіше - швидкість обертання або крутний момент?
Звичайно, ми можемо вручну написати код, який з певним інтервалом буде чергувати подачу струму на обмотки і таким чином забезпечити керування нашим двигуном. Але цей код давно вже написаний і входить до стандартного складання 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);
Схема підключення такого типу контролера двигуна:
І в тому, і в іншому випадку на кожну обмотку буде потрапити струм на час, достатній для здійснення валом одного кроку. Потім струм з першої обмотки забирається, а подається на другу (для наступного кроку), або струм подається на обидві обмотки (для зупинки валу в поточному положенні) або струму з обох обмоток буде знято (для вільного обертання валу) Частота таких перемикань буде регулювати швидкість обертання. Для зміни частоти служить метод 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 градуси, і т.д. Для середніх швидкостей таке уривчасте значення буде не так помітно, зате добре чути часті клацання (з частотою перемикання обмоток). Тому в тих випадках, де потрібний повільний і плавний рух, використовувати крокові двигуни безпосередньо не вийде - потрібно буде додавати знижувальний редуктор або використовувати традиційні двигуни постійного струму.