Контролер аматорського верстата ЧПУ (step

Я реалізував поки для однієї осі, тому що механіка верстата в проекті. Подібні контролери називаються step / dir. І є найдешевший спосіб управління верстата. Оскільки подібний верстат, але зі своїми скажімо "мізками" буде дорожче. Цей пристрій є синхронизирующим ланкою між комп'ютером і драйвером для керування ШД. Отже Step - це крок, dir - напрямок. Звичайно на ПК попередньо повинно бути встановлено Спеціалізована ПО. Благо таких море.
На фото нижче мій варіант реалізації цього девайса, дещо я додав, але основи ті ж. Природно такий пристрій претендує на базову основу, тому що для нормальної роботи більш менш серйозно верстата необхідна зворотній зв'язок.

Отже контролер являє собою пристрій посередник між задає і виконуючим механізмом. Де задає пристрій програма і комп'ютер, що виконує - двигун. Контролер приймає сигнал з комп'ютера. обробляє і управляє драйвером.
Цифри на малюнку:
1. Вихід контролер - драйвер.
2. Вхід комп'ютер - контролер.
3. Вихід драйвер - виконуючий пристрій.
4. Інтерфейс внутрисхемного програмування.
5. Вхід драйвер - контролер.

Для проектування контролера спочатку необхідно визначитися з параметрами майбутнього верстата, тобто вибору необхідних крокових двигунів або ін. виконуючих устойств.
Що нам необхідно реалізувати:
1. Нам необхідно зчитувати напрямок і крок. Для опитування кроку необхідно налаштувати переривання по вхідному сигналу. З метою надання відвести який-небудь пін для зчитування сотояния. Налаштування переривання ми розглядали в статті Підключаємо кнопки до AVR. Крок №12.
2. Налаштувати ШІМ, в минулому записи (крок №14).
3. Налаштувати мінімально можливу затримку між кроками, щоб вал встиг проварачіваться.
4. Прописати алгоритм кроку. Тут трохи теорії. Даний алгоритм залежить від обраного нами двигуна. У мене гібридний уніполярний. Що значить гібридний, це означає що він в собі поєднує як змінні магніти так і постійні. Один крок двигуна состовляет або 3.6 (4 полюса) град. або 1.8 - 0.9 град (8 полюсів). Тобто крок залежить від кількості полюсів на статорі. У мене 6-ть дротів, тобто 4 полюсний, кут повороту 3.6. Як це працює? Нижче наведена анімація роботи крокового двигуна. (Взято з wikipedia.)

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

Годі кроковий режим

Полу кроковий режим

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

У своїй програмі я реалізував повно кроковий режим. Що ж використовуючи частину програм з попередніх статей напишемо програму.
/ * Як завжди починаємо з шапки, сдесь нам головне підключити три бібліотеки: введення-виведення, затримка і переривання * /
#define F_CPU 10000000UL // 10 MHz
#include
#include
#include
volatile int pwm_x, x_sleep; // допоміжні пременися
#define n 15; // мінімально допустима затримка
/ * Переривання по вхідному сигналу * /
SIGNAL (SIG_INTERRUPT0) // обробка переривання
<
x_sleep = 0;
pwm_x = 0;
OCR1A = 255; // 5в Розглянули в попередньому пості №14.
/ * Прочитуємо стан Піна і визначаємося з напрямком * /
if (bit_is_clear (PINC, 4)) // коли біт 4 дорівнює 0
<
/ * Далі ми повинні прописати алгоритм для того, що крокує двигуна. * /
PORTA | = _BV (PA0);
PORTA =

_BV (PA1);
PORTA =

_BV (PA2);
PORTA =

_BV (PA3);
_delay_ms (n); / * Затримка характеризується швидкістю провертання вала, т.к. при занадто швидкому відкриванні ключів двигун буде просто "смикатися", що не встигати проварачіваться * /
PORTA =

_BV (PA0);
PORTA | = _BV (PA1);
PORTA =

_BV (PA2);
PORTA =

_BV (PA3);
_delay_ms (n);

_BV (PA0);
PORTA =

_BV (PA1);
PORTA | = _BV (PA2);
PORTA =

_BV (PA3);
_delay_ms (n);

_BV (PA0);
PORTA =

_BV (PA1);
PORTA =

_BV (PA2);
PORTA | = _BV (PA3);
_delay_ms (n);

pwm_x = 1;
x_sleep = 0;
>
else if (bit_is_set (PINC, 4)) // КОЛИ БІТ 4 РАВЕН 1
PORTA =

_BV (PA0);
PORTA =

_BV (PA1);
PORTA =

_BV (PA2);
PORTA | = _BV (PA3);
_delay_ms (n);

_BV (PA0);
PORTA =

_BV (PA1);
PORTA | = _BV (PA2);
PORTA =

_BV (PA3);
_delay_ms (n);

_BV (PA0);
PORTA | = _BV (PA1);
PORTA =

_BV (PA2);
PORTA =

_BV (PA3);
_delay_ms (n);

PORTA | = _BV (PA0);
PORTA =

_BV (PA1);
PORTA =

_BV (PA2);
PORTA =

_delay_ms (n);
pwm_x = 1; // змінна для визначення включення осі
x_sleep = 0;
>
>

int main (void) // початок основою програми
DDRB = 0xfb; // ВХІД PB2
DDRD = 0xf3; // висновки порту pd2 and PD3 - входи
DDRC = 0x8f; // висновки порту PC4,5,6 - входи
DDRA = 0xff; // всі виходи 1 вихід, 0 -вхід
PORTA = 0X00;
// виробляємо початкові настройки для зовнішнього переривання, поки для INT0
GICR = 0 × 40;
MCUCR = 0 × 02; // по спадающему фронту
sei (); // Дозвіл переривань глобально по всій програмі
// встановлюємо налаштування рахункового регістра для ШІМ
TCCR1A = (1< TCCR1B = (1<

/ * OCR1A з цього регістру відбувається порівняння з рахунковим регістром, необхідний постійний ШІМ. тобто задаємо ОСR1A розрядність до 255. тому модуль рахунку ло 255 * /
while (1)
<
// Безкінечний цикл
if (pwm_x == 1)
// глобальний регістр, який визначає включення осі
<
/ * Цикл для входу в режим сну * /
while ((PIND2! = 0) (x_sleep <= 750 )) /*если на пине по шагам ноль, больше 750 мс, то переводим двигатель в удержание с 20% ШИМом*/
_delay_ms (1);
x_sleep ++; // глобальний регістр, який визначає режим сну
pwm_x = 0;
OCR1A = 50;
>
>
else
<
OCR1A = 50;
pwm_x = 0; / * Дана змінна необхідно якщо задіяні кілька осей * /
>
>
> // закриває дужка основної програми

Схожі статті