Відповісти

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

Назад

Огляд теми (нові повідомленні вгорі)

jokeer
Сьогодні 08:21:39

Чорний форум - wtf??

nickjust
Сьогодні 07:24:59

Я рахую,тре всьо спробувати...та вчитися!
І краще розмовляти з ШІ ніж з їбаньками з форумів,таких як Радіокот (правда там є і нормальні)
Мені ще подобається Чорний форум - також норм допомогають.
І ще замічаю ,що інет став нууу дуже грошовий ....усі кинулися заробляти...за прошивку 2017 року ,яка нещо давно вільно була на оффсайті Acer хотят гроші....гроші....гроші....

dimich
Вчора 21:54:41
nickjust пише:

А так?

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

nickjust пише:

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

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

nickjust пише:

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

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

jokeR
Вчора 20:58:34

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

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

nickjust
Вчора 20:16:31

А так?

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 імпульсів/оберт

dimich
Вчора 20:07:03
jokeR пише:

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

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

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

jokeR
Вчора 19:42:00

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

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

dimich
Вчора 19:19:30

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

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

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

nickjust
Вчора 18:08:44

Починай з каналу А
відкрий 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;
  }
}
dimich
Вчора 14:32:21
3611621 пише:

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

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

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

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

3611621 пише:

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

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

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

jokeer
Вчора 13:21:59

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

jokeer
Вчора 13:19:04

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

3611621
Вчора 12:35:42

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

jokeer
Вчора 07:19:55

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

dimich
2026-04-27 23:11:47
jokeR пише:

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

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

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