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

Поки що я зупинився на тому, що енкодер неправильно підраховує оберти.
Якщо відома кількість імпульсів N і кількість імпульсів на один оберт PPR: Оберти = N/PPR
На енкодері вказано Resolution 10P/R, а насправді це генератор випадкових чисел.
Тобто на один механічний оберт вала енкодера Omron E6B2-CWZ6C щоразу видає нове значення.
Виходи Чорний (Канал A) і Білий (Канал B) підключені через зовнішній pull-up резистор 10 кОм до +5V
Остання редакція 3611621 (2026-04-26 21:47:56)
Неактивний
У тих хто використовує богопротивний Fritzing в пеклі буде окремий котел, з bredboard ом ![]()
Бібліотек для енкодера в інтернеті значно більше ніж 1. Ви взяли готову чи пиляєте щось своє?
Неактивний
2. Енкодер на валу двигуна підраховує кількість імпульсів за заданий інтервал часу.
Який діапазон швидкостей обертання?
на один механічний оберт вала енкодера Omron E6B2-CWZ6C щоразу видає нове значення.
Енкодер не видає значення, енкодер видає сигнали. Як ви їх обробляєте?
Неактивний
1. Користуюся готовими бібліотеками. + gpt + cloud + gemini + copilot
2. Швидкість обертання вала 30–300 об/хв
3. Отримані сигнали використовую для обчислення швидкості обертання вала.
Неактивний
Хм ![]()
Користуюся готовими бібліотеками. + gpt + cloud + gemini + copilot
Ну, допустим ок
Швидкість обертання вала 30–300 об/хв
Ок.
Отримані сигнали використовую для обчислення швидкості обертання вала.
Ок.
То в чому питання? Ви ж не вважаєте що якісь анонімуси телепатичним способом вгадають що там чатік вам накодив?
Неактивний
https://forum.arduino.ua/img/members/3885/Omron-E6B2_CWZ6C.zip
В цій імплементації зміна стану відбувається лише по одному фронту однієї фази. Такий метод в більшості випадків нормально працює при постійному обертанні вала. Але на граничних умовах - наприклад, покачування вала в обидва боки - будуть хибні спрацювання.
Повноцінний конечний автомат квадратурного енкодера виглядає десь так:
що досить просто реалізується за допомогою таблиці переходів.
Неактивний
Ну, так собі рішення. Але в архіві є сцилка на статтю на хабрі де все досить добре розжоване. До речі на високих обертах доведеться застосовувати тактоложество, а 2000 обертів у автора atmega не потягнула.
Неактивний
а 2000 обертів у автора atmega не потягнула.
Не дивно, з енкодером на 2000 PPR. Якщо іншого нема, а треба оберти в секунду при обертанні в один бік на такій швидкості, то можна тільки фазу Z читати. Тоді 1 PPR виходить, можна рахувати хоч мільйон об/хв.
А ще у атмеги є input capture, якщо програмної швидкодії недостатньо.
Неактивний
Дійсно. Якщо автору потрібно тільки рахувати rpm, йому і енкодер за 1500 грн не потрібен. Досить магніта і датчика Холла за 20 грн. Або взяти BLDC і крутити з потрібною швидкістю.
Візьміть осцилограф і подивіться що він там вертає.
Або візьміть абсолютну будь яку демку від будь якої ліби для енкодера і покрутіть. Демка повинна бути робоча.
До речі pid регулятор не дасть вам точного регулювання. Дасть приблизне. Якщо треба справді точно - беріть bldc.
Можливо, проблема саме в цьому енкодері?
Можливо. Але дуже малоймовірно. Також можливо, що проблема десь у зʼєднаннях, платі чи контролері. Це теж малоймовірно.
Майже впевнений, що проблема в коді, а коду ми не бачили.
Напишіть програму, що пише стан входів у Serial. Повільно обертайте енкодер і перевірте, чи бачите очікуваний квадратурний сигнал.
Якщо все ок, напишіть мінімальну програму, яка обчислює швидкість обертів і видає результат в Serial. Якщо працює не так як очікується, то показуйте код.
Мені потрібне точне регулювання обертів
Точне - це яке в цифрах?
При інтервалі в 1 секунду з PPR 10 точність виміру не перевищуватиме 5-6 об/хв. При 30 об/хв це 20%.
А точність регулювання, навіть при ідеально підібраних коефіцієнтах PID, залежатиме як від точності виміру, так і від властивостей керованої системи: потужності двигуна, характеристики навантаження.
Ви можете лише визначити, що відхилення поточної швидкості від цільової перевищує заданий поріг.
Неактивний
Починай з каналу А
відкрий 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)
Неактивний
В цьому скетчі вже баги.
1. 16-бітна змінна pulses змінюється в ISR, а читається неатомарно.
2.
if (pulses != last) {
...
Serial.println(pulses);
last = pulses;Тут race condition. При всіх трьох зчитуваннях pulses може мати три різні значення.
Неактивний
![]()
Тобто варто взяти 32 розрядний проц - і можна за атомарність не паритись? ![]()
Тут 2 речі незрозуміло.. Чому 9600 а не 115200. І чому не взяти готову лібу, навіщо вайбкодити те що вже зроблено і бездоганно працює? Чи це челлендж такий? ![]()
Неактивний
Тобто варто взяти 32 розрядний проц - і можна за атомарність не паритись?
Якщо атомарність доступа до слова цієї розрядності гарантується апаратно, то для одиничного запису чи читання - так, можна не паритись. Лише впевнитись, що змінна розміщується з необхідним вирівнюванням (зазвичай це також гарантується). Але на деяких архітектурах може довестись паритись із реордерінгом інструкцій та memory барʼєрами, а іноді і з інвалідацією кеша ![]()
А при read/modify/write все одно потрібна синхронізація.
Неактивний
А так?
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)
Неактивний
нюанс-либа рахує x4-10 P/R → 40 імпульсів/оберт
Ну так на то і енкодер.
Взагалі для вимірювання швидкості та ліба (разом з енкодером) - це мікроскоп для забивання шурупів
Можна взяти timer-counter і просто рахувати імпульси.
Неактивний
А так?
Так уже краще. ChatGPT вчиться? ![]()
додати кондюк 0.1 мкФ на землю (A → GND)
З підтяжкою 10 кОм такий конденсатор утворюватиме ФНЧ з частотою зрізу 160 Гц. А з вбудованою - десь 60-70 Гц. На 300 об/хв може ще не впливатиме, але якщо більше - вже не годиться.
Щоб позбутись "брудних" фронтів (якщо вони там дійсно є і заважають), можна просто рахувати по обом фронтам фази A скільки раз фаза B змінила значення на протилежне від попереднього.
либа от Paul Stoffregen
нюанс-либа рахує x4-10 P/R → 40 імпульсів/оберт
То вже якесь збочення.
Неактивний