Ви не увійшли.
https://forum.gsmhosting.com/vbb/index.php
Чорний форум - wtf??
Я рахую,тре всьо спробувати...та вчитися!
І краще розмовляти з ШІ ніж з їбаньками з форумів,таких як Радіокот (правда там є і нормальні)
Мені ще подобається Чорний форум - також норм допомогають.
І ще замічаю ,що інет став нууу дуже грошовий ....усі кинулися заробляти...за прошивку 2017 року ,яка нещо давно вільно була на оффсайті Acer хотят гроші....гроші....гроші....
А так?
Так уже краще. ChatGPT вчиться? ![]()
додати кондюк 0.1 мкФ на землю (A → GND)
З підтяжкою 10 кОм такий конденсатор утворюватиме ФНЧ з частотою зрізу 160 Гц. А з вбудованою - десь 60-70 Гц. На 300 об/хв може ще не впливатиме, але якщо більше - вже не годиться.
Щоб позбутись "брудних" фронтів (якщо вони там дійсно є і заважають), можна просто рахувати по обом фронтам фази A скільки раз фаза B змінила значення на протилежне від попереднього.
либа от Paul Stoffregen
нюанс-либа рахує x4-10 P/R → 40 імпульсів/оберт
То вже якесь збочення.
нюанс-либа рахує x4-10 P/R → 40 імпульсів/оберт
Ну так на то і енкодер.
Взагалі для вимірювання швидкості та ліба (разом з енкодером) - це мікроскоп для забивання шурупів
Можна взяти timer-counter і просто рахувати імпульси.
А так?
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 імпульсів/оберт
Тобто варто взяти 32 розрядний проц - і можна за атомарність не паритись?
Якщо атомарність доступа до слова цієї розрядності гарантується апаратно, то для одиничного запису чи читання - так, можна не паритись. Лише впевнитись, що змінна розміщується з необхідним вирівнюванням (зазвичай це також гарантується). Але на деяких архітектурах може довестись паритись із реордерінгом інструкцій та memory барʼєрами, а іноді і з інвалідацією кеша ![]()
А при read/modify/write все одно потрібна синхронізація.
![]()
Тобто варто взяти 32 розрядний проц - і можна за атомарність не паритись? ![]()
Тут 2 речі незрозуміло.. Чому 9600 а не 115200. І чому не взяти готову лібу, навіщо вайбкодити те що вже зроблено і бездоганно працює? Чи це челлендж такий? ![]()
В цьому скетчі вже баги.
1. 16-бітна змінна pulses змінюється в ISR, а читається неатомарно.
2.
if (pulses != last) {
...
Serial.println(pulses);
last = pulses;Тут race condition. При всіх трьох зчитуваннях pulses може мати три різні значення.
Починай з каналу А
відкрий 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;
}
}Можливо, проблема саме в цьому енкодері?
Можливо. Але дуже малоймовірно. Також можливо, що проблема десь у зʼєднаннях, платі чи контролері. Це теж малоймовірно.
Майже впевнений, що проблема в коді, а коду ми не бачили.
Напишіть програму, що пише стан входів у Serial. Повільно обертайте енкодер і перевірте, чи бачите очікуваний квадратурний сигнал.
Якщо все ок, напишіть мінімальну програму, яка обчислює швидкість обертів і видає результат в Serial. Якщо працює не так як очікується, то показуйте код.
Мені потрібне точне регулювання обертів
Точне - це яке в цифрах?
При інтервалі в 1 секунду з PPR 10 точність виміру не перевищуватиме 5-6 об/хв. При 30 об/хв це 20%.
А точність регулювання, навіть при ідеально підібраних коефіцієнтах PID, залежатиме як від точності виміру, так і від властивостей керованої системи: потужності двигуна, характеристики навантаження.
Ви можете лише визначити, що відхилення поточної швидкості від цільової перевищує заданий поріг.
До речі pid регулятор не дасть вам точного регулювання. Дасть приблизне. Якщо треба справді точно - беріть bldc.
Візьміть осцилограф і подивіться що він там вертає.
Або візьміть абсолютну будь яку демку від будь якої ліби для енкодера і покрутіть. Демка повинна бути робоча.
Мені потрібне точне регулювання обертів, і саме енкодер.
Можливо, проблема саме в цьому енкодері? Чи є досвід використання якоїсь іншої моделі?
Дякую
Дійсно. Якщо автору потрібно тільки рахувати rpm, йому і енкодер за 1500 грн не потрібен. Досить магніта і датчика Холла за 20 грн. Або взяти BLDC і крутити з потрібною швидкістю.