#1 2026-04-24 12:18:48

3611621
Учасник
Зареєстрований: 2026-04-24
Повідомлень: 5

скетч, що керує електродвигуном із зворотним зв’язком

Потрібно написати скетч і налаштувати обладнання
Завдання: Написати повний робочий скетч і налаштувати обладнання, для Arduino UNO, що керує електродвигуном із зворотним зв’язком через енкодер.

ЛОГІКА РОБОТИ:
1. Задається цільова швидкість електродвигуна
2. Енкодер на валу двигуна підраховує кількість імпульсів за заданий інтервал часу.
3. За даними енкодера розраховується поточна швидкість обертання двигуна.
4. ПІД-регулятор порівнює поточну швидкість двигуна з цільовою і обчислює керуючий вплив.
5. ШІМ-сигнал подається на драйвер двигуна для регулювання швидкості.
6. Значення відображаються на LCD 2004:
7. Усі дані записуються на карту пам'яті

Неактивний

#2 2026-04-24 14:39:25

jokeer
Гість

Re: скетч, що керує електродвигуном із зворотним зв’язком

Виглядає логічно. Декомпозиція на підзадачі виконана, апаратне забезпечення підібране. В чому питання? wink Пора здавати курсову роботу?

#3 2026-04-24 15:21:12

3611621
Учасник
Зареєстрований: 2026-04-24
Повідомлень: 5

Re: скетч, що керує електродвигуном із зворотним зв’язком

не варто сміятися. можете допомогти?

Неактивний

#4 2026-04-24 16:01:33

jokeer
Гість

Re: скетч, що керує електродвигуном із зворотним зв’язком

Допомогти - це пару абзаців тексту. Ок. Що не виходить конкретно?

#5 2026-04-26 21:17:34

3611621
Учасник
Зареєстрований: 2026-04-24
Повідомлень: 5

Re: скетч, що керує електродвигуном із зворотним зв’язком

Znmok-ekrana-2026-04-26-214511.jpg

Поки що я зупинився на тому, що енкодер неправильно підраховує оберти.
Якщо відома кількість імпульсів N і кількість імпульсів на один оберт PPR:  Оберти = N/PPR

На енкодері вказано Resolution 10P/R, а насправді це генератор випадкових чисел.
Тобто на один механічний оберт вала енкодера Omron E6B2-CWZ6C щоразу видає нове значення.
Виходи Чорний (Канал A) і Білий (Канал B) підключені через  зовнішній pull-up резистор 10 кОм до +5V

Остання редакція 3611621 (2026-04-26 21:47:56)

Неактивний

#6 2026-04-26 22:16:09

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 197

Re: скетч, що керує електродвигуном із зворотним зв’язком

У тих хто використовує богопротивний Fritzing в пеклі буде окремий котел, з bredboard ом wink
Бібліотек для енкодера в інтернеті значно більше ніж 1. Ви взяли готову чи пиляєте щось своє?

Неактивний

#7 2026-04-27 00:14:06

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 828

Re: скетч, що керує електродвигуном із зворотним зв’язком

3611621 пише:

2. Енкодер на валу двигуна підраховує кількість імпульсів за заданий інтервал часу.

Який діапазон швидкостей обертання?

3611621 пише:

на один механічний оберт вала енкодера Omron E6B2-CWZ6C щоразу видає нове значення.

Енкодер не видає значення, енкодер видає сигнали. Як ви їх обробляєте?

Неактивний

#8 2026-04-27 12:08:13

3611621
Учасник
Зареєстрований: 2026-04-24
Повідомлень: 5

Re: скетч, що керує електродвигуном із зворотним зв’язком

1. Користуюся готовими бібліотеками.  + gpt + cloud + gemini + copilot
2. Швидкість обертання вала 30–300 об/хв
3. Отримані сигнали використовую для обчислення швидкості обертання вала.

Неактивний

#9 2026-04-27 13:10:09

nickjust
Учасник
Зареєстрований: 2024-06-13
Повідомлень: 47

Re: скетч, що керує електродвигуном із зворотним зв’язком

https://forum.arduino.ua/img/members/3885/Omron-E6B2_CWZ6C.zip

Неактивний

#10 2026-04-27 14:35:49

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 197

Re: скетч, що керує електродвигуном із зворотним зв’язком

Хм wink

Користуюся готовими бібліотеками.  + gpt + cloud + gemini + copilot

Ну, допустим ок

Швидкість обертання вала 30–300 об/хв

Ок.

Отримані сигнали використовую для обчислення швидкості обертання вала.

Ок.

То в чому питання? Ви ж не вважаєте що якісь анонімуси телепатичним способом вгадають що там чатік вам накодив?

Неактивний

#11 2026-04-27 20:53:23

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 828

Re: скетч, що керує електродвигуном із зворотним зв’язком

nickjust пише:

https://forum.arduino.ua/img/members/3885/Omron-E6B2_CWZ6C.zip

В цій імплементації зміна стану відбувається лише по одному фронту однієї фази. Такий метод в більшості випадків нормально працює при постійному обертанні вала. Але на граничних умовах - наприклад, покачування вала в обидва боки - будуть хибні спрацювання.
Повноцінний конечний автомат квадратурного енкодера виглядає десь так:
halfstep.png
що досить просто реалізується за допомогою таблиці переходів.

Неактивний

#12 2026-04-27 22:35:23

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 197

Re: скетч, що керує електродвигуном із зворотним зв’язком

Ну, так собі рішення. Але в архіві є сцилка на статтю на хабрі де все досить добре розжоване. До речі на високих обертах доведеться застосовувати тактоложество, а 2000 обертів у автора atmega не потягнула.

Неактивний

#13 2026-04-27 23:11:47

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 828

Re: скетч, що керує електродвигуном із зворотним зв’язком

jokeR пише:

а 2000 обертів у автора atmega не потягнула.

Не дивно, з енкодером на 2000 PPR. Якщо іншого нема, а треба оберти в секунду при обертанні в один бік на такій швидкості, то можна тільки фазу Z читати. Тоді 1 PPR виходить, можна рахувати хоч мільйон об/хв.
А ще у атмеги є input capture, якщо програмної швидкодії недостатньо.

Неактивний

#14 Вчора 07:19:55

jokeer
Гість

Re: скетч, що керує електродвигуном із зворотним зв’язком

Дійсно. Якщо автору потрібно тільки рахувати rpm, йому і енкодер за 1500 грн не потрібен. Досить магніта і датчика Холла за 20 грн. Або взяти BLDC і крутити з потрібною швидкістю.

#15 Вчора 12:35:42

3611621
Учасник
Зареєстрований: 2026-04-24
Повідомлень: 5

Re: скетч, що керує електродвигуном із зворотним зв’язком

Мені потрібне точне регулювання обертів, і саме енкодер.
Можливо, проблема саме в цьому енкодері? Чи є досвід використання якоїсь іншої моделі?
Дякую

Неактивний

#16 Вчора 13:19:04

jokeer
Гість

Re: скетч, що керує електродвигуном із зворотним зв’язком

Візьміть осцилограф і подивіться що він там вертає.
Або візьміть абсолютну будь яку демку від будь якої ліби для енкодера і покрутіть. Демка повинна бути робоча.

#17 Вчора 13:21:59

jokeer
Гість

Re: скетч, що керує електродвигуном із зворотним зв’язком

До речі pid регулятор не дасть вам точного регулювання. Дасть приблизне. Якщо треба справді точно - беріть bldc.

#18 Вчора 14:32:21

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 828

Re: скетч, що керує електродвигуном із зворотним зв’язком

3611621 пише:

Можливо, проблема саме в цьому енкодері?

Можливо. Але дуже малоймовірно. Також можливо, що проблема десь у зʼєднаннях, платі чи контролері. Це теж малоймовірно.
Майже впевнений, що проблема в коді, а коду ми не бачили.

Напишіть програму, що пише стан входів у Serial. Повільно обертайте енкодер і перевірте, чи бачите очікуваний квадратурний сигнал.

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

3611621 пише:

Мені потрібне точне регулювання обертів

Точне - це яке в цифрах?

При інтервалі в 1 секунду з PPR 10 точність виміру не перевищуватиме 5-6 об/хв. При 30 об/хв це 20%.
А точність регулювання, навіть при ідеально підібраних коефіцієнтах PID, залежатиме як від точності виміру, так і від властивостей керованої системи: потужності двигуна, характеристики навантаження.
Ви можете лише визначити, що відхилення поточної швидкості від цільової перевищує заданий поріг.

Неактивний

#19 Вчора 18:08:44

nickjust
Учасник
Зареєстрований: 2024-06-13
Повідомлень: 47

Re: скетч, що керує електродвигуном із зворотним зв’язком

Починай з каналу А
відкрий Serial Monitor (9600),помалу зроби 1 оберт
повинен побачити

Pulses: 10

якщо 10 - гуд,якщо інше - херовий контакт,живлення енкодера,довгі дроти,підтяжка

включити INPUT_PULLUP   , додати кондюк 0.1 мкФ на землю (A → GND)
У Omron E6B2-CWZ6C: вихід транзисторний -«1» формується підтяжкой

фронт може бути «брудний» → берем тілько RISING

const byte pinA = 2;          // обязательно пин с прерыванием (UNO: 2 или 3)
volatile unsigned int pulses = 0;

void isrA() {
  pulses++;                  // считаем только фронт
}

void setup() {
  Serial.begin(9600);

  pinMode(pinA, INPUT);      // если есть внешняя подтяжка
  // pinMode(pinA, INPUT_PULLUP); // включи это, если сомневаешься

  attachInterrupt(digitalPinToInterrupt(pinA), isrA, RISING);
 //attachInterrupt(digitalPinToInterrupt(pinA), isrA, CHANGE); // 20 имп на оборот

  Serial.println("Start test");
}

void loop() {
  static unsigned int last = 0;

  if (pulses != last) {
    Serial.print("Pulses: ");
    Serial.println(pulses);
    last = pulses;
  }
}

Остання редакція nickjust (Вчора 18:16:34)

Неактивний

#20 Вчора 19:19:30

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 828

Re: скетч, що керує електродвигуном із зворотним зв’язком

В цьому скетчі вже баги.
1. 16-бітна змінна pulses змінюється в ISR, а читається неатомарно.
2.

  if (pulses != last) {
...
    Serial.println(pulses);
    last = pulses;

Тут race condition. При всіх трьох зчитуваннях pulses може мати три різні значення.

Неактивний

#21 Вчора 19:42:00

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 197

Re: скетч, що керує електродвигуном із зворотним зв’язком

wink
Тобто варто взяти 32 розрядний проц - і можна за атомарність не паритись? wink

Тут 2 речі незрозуміло.. Чому 9600 а не 115200. І чому не взяти готову лібу, навіщо вайбкодити те що вже зроблено і бездоганно працює? Чи це челлендж такий? wink

Неактивний

#22 Вчора 20:07:03

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 828

Re: скетч, що керує електродвигуном із зворотним зв’язком

jokeR пише:

Тобто варто взяти 32 розрядний проц - і можна за атомарність не паритись? wink

Якщо атомарність доступа до слова цієї розрядності гарантується апаратно, то для одиничного запису чи читання - так, можна не паритись. Лише впевнитись, що змінна розміщується з необхідним вирівнюванням (зазвичай це також гарантується). Але на деяких архітектурах може довестись паритись із реордерінгом інструкцій та memory барʼєрами, а іноді і з інвалідацією кеша wink

А при read/modify/write все одно потрібна синхронізація.

Неактивний

#23 Вчора 20:16:31

nickjust
Учасник
Зареєстрований: 2024-06-13
Повідомлень: 47

Re: скетч, що керує електродвигуном із зворотним зв’язком

А так?

const byte pinA = 2;
volatile uint16_t pulses = 0;

void isrA() {
  pulses++;  // ISR короткий — это хорошо
}

void setup() {
  Serial.begin(9600);
  pinMode(pinA, INPUT); // или INPUT_PULLUP при необходимости
  attachInterrupt(digitalPinToInterrupt(pinA), isrA, RISING);
}

void loop() {
  static uint16_t last = 0;

  uint16_t snapshot;

  noInterrupts();        // критическая секция
  snapshot = pulses;     // атомарный снимок
  interrupts();

  if (snapshot != last) {
    Serial.print("Pulses: ");
    Serial.println(snapshot);
    last = snapshot;
  }
}

і знову jokeR правий,можна простіше



відкриваємо Arduino IDE
Sketch → Include Library → Manage Libraries
В пошуку пишемо:
Encoder
либа от Paul Stoffregen

нюанс-либа рахує x4-10 P/R → 40 імпульсів/оберт

Остання редакція nickjust (Вчора 20:24:16)

Неактивний

#24 Вчора 20:58:34

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 197

Re: скетч, що керує електродвигуном із зворотним зв’язком

нюанс-либа рахує x4-10 P/R → 40 імпульсів/оберт

Ну так на то і енкодер.
Взагалі для вимірювання швидкості та ліба (разом з енкодером) - це мікроскоп для забивання шурупів wink Можна взяти timer-counter і просто рахувати імпульси.

Неактивний

#25 Вчора 21:54:41

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 828

Re: скетч, що керує електродвигуном із зворотним зв’язком

nickjust пише:

А так?

Так уже краще. ChatGPT вчиться? smile

nickjust пише:

додати кондюк 0.1 мкФ на землю (A → GND)

З підтяжкою 10 кОм такий конденсатор утворюватиме ФНЧ з частотою зрізу 160 Гц. А з вбудованою - десь 60-70 Гц. На 300 об/хв може ще не впливатиме, але якщо більше - вже не годиться.
Щоб позбутись "брудних" фронтів (якщо вони там дійсно є і заважають), можна просто рахувати по обом фронтам фази A скільки раз фаза B змінила значення на протилежне від попереднього.

nickjust пише:

либа от Paul Stoffregen
нюанс-либа рахує x4-10 P/R → 40 імпульсів/оберт

То вже якесь збочення.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму