ARDUINO Ложные срабатывания щелевого датчика

N0rdling

★✩✩✩✩✩✩
15 Янв 2020
154
20
Всех приветствую!
И прошу помощи. Задача собрать намоточный станок, который бы считал длину намотанного провода (в мм). За отсчет длины отвечает щелевой оптический датчик (куплен на известном китайском ресурсе) на компараторе LM393 (фото ниже). В скетче счетчик срабатывает по прерыванию "RISING" ноги D2 (кусок скетча привожу). Довольно часто наблюдаются ложные срабатывания, а именно - по 2 раза бывает срабатывает (привожу скрин счетчика из монитора порта, на котором по таймингам видны по 2 срабатывания в одно и то же время).
Вопрос: как это побороть?
C++:
#define Piece 1// 31,5*PI/24                 //минимальный кусок контролируемой длины (наматываемая длина при при обороте между двумя отверстиями счетчика), мм
//расчет: d*PI/n   - d-диаметр колесика счетчика, n - количество щелей в колесике счетчика

#define encoder 2         //пин счетчика оборотов

volatile int LenghtBuff = 0; //буфер длины намотки для обратного отсчета

void setup()
{
  Serial.begin (9600);
      pinMode(encoder, INPUT);
      attachInterrupt(0, counter, FALLING);
}
void counter() {
  LenghtBuff -= Piece;
  Serial.println(LenghtBuff);
}
 

Вложения

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
Вопрос: как это побороть?
Для начала сделать световую изоляцию, чтобы лишний свет не попадал в область датчика.
Затем сделать программный или аппаратный антидребезг. Да, дребезг может быть не только на контактах кнопок.
 

N0rdling

★✩✩✩✩✩✩
15 Янв 2020
154
20
@Геннадий П, что имеется ввиду под световой изоляцией? На фото ниже мое устройство (точнее именно счетчик). По поводу дребезга: разве в данном модуле (щелевом датчике) нет аппаратного дребезга (компаратор LM393)?
 

Вложения

poty

★★★★★★✩
19 Фев 2020
3,237
942
Интересно, как количество оборотов переводится в длину провода? Потенциально можно адаптировать параметры катушки при намотке виток к витку, но приблизительность всё равно останется, особенно на длинных катушках.
А что за время выводится в распечатке?
 

N0rdling

★✩✩✩✩✩✩
15 Янв 2020
154
20
@poty, длина намотки считается не хитро, в коде есть пояснение:
//расчет: d*PI/n - d-диаметр колесика счетчика, n - количество щелей в колесике счетчика
В "распечатке" - время срабатывания прерывания (в котором пересчитывается счетчик длины) при "FALLING" (обнаружении изменения сигнала на низкий) на ноге D2.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
что имеется ввиду под световой изоляцией?
Это и имеется. Всю конструкцию с крыльчаткой и датчиком закрыть светонепроницаемой конструкцией. Т.к. при попадании постороннего света возможны отклонения в показаниях, что и выливается в ложные срабатывания.
1676289318120.png

нет аппаратного дребезга (компаратор LM393)?
Компаратор - это компаратор. У него есть четко заданная цель работы и ни о каком антидребезге он не знает.
 

N0rdling

★✩✩✩✩✩✩
15 Янв 2020
154
20
@Геннадий П, кроме компаратора на плате есть резисторы и конденсаторы, которые, скорее всего должны участвовать в подавлении дребезга.
В любом случае, не подскажите, в общих чертах, как программно реализовать антидребезг совместно с применением счетчика в прерываниях? Код я напишу, мне бы идею, так сказать))
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
которые, скорее всего должны участвовать в подавлении дребезга
1676292097806.png
как программно реализовать антидребезг совместно с применением счетчика в прерываниях?
Найдите любой код или описание антидребезга кнопок.

Но для начала, вырежьте из картона коробку и накройте ей конструкцию датчика. Нужно начинать с простого.
 
  • Лойс +1
Реакции: N0rdling

poty

★★★★★★✩
19 Фев 2020
3,237
942
В "распечатке" - время срабатывания прерывания (в котором пересчитывается счетчик длины) при "FALLING" (обнаружении изменения сигнала на низкий) на ноге D2.
Каким образом оно определяется? Прямо внутри прерывания или откладывается через флаг до поимки оного в основном коде?
Что двигает провод (вручную/мотор)? Используется ли натяжитель или другая конструкция, которая может давать колебания натяжения?
Почему я об этом спрашиваю? Вот смотрите: первые две строки - разница времени - +1,44, далее - +0, +1,4, +1,21, +1,77, +1,49, +0, +1,82, +0,28, +0,46, +0,56, +0,93... Для столь частых отверстий в колесе разность интервалов весьма большая, больше похоже на ошибку определения момента, который потом выводится через Serial, тем более, что скорость Вы для него выставили 9600.
 

N0rdling

★✩✩✩✩✩✩
15 Янв 2020
154
20
@poty, время в "распечатке" не знаю откуда берется, проставляется автоматически в мониторе порта. Провод пробовал двигать и мотором и вручную - очень медленно, в обоих случаях есть дребезг. Да, склонен считать что это именно дребезг на границе перехода от материала к щели в колесике.Про частоту прорезей в черном колесике -уменьшил их до 9 штук - результата нет.
 

N0rdling

★✩✩✩✩✩✩
15 Янв 2020
154
20
"Поигрался" с программным антидребезгом - дошел до 50мс, ложных срабатываний нет, но теперь, видимо, пропускает срабатывания. Буду прикручивать RC аппаратный антидребезг...
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Боюсь это мало поможет. Стоит датчик линии на маховике мотора, отслеживает белую полоску на ней. И периодически были ложные срабатывания. И особенно было заметно при остановке мотора, когда маховик на издыхании физически вибрирует немного. Но этого хватало для каких то заоблачных скоростей. Пробовал сделал что то вроде динамического программного антидребезга, изначально он 50, после уменьшается на до половины времени оборота, при торможении он увеличивается. Только не очень помогло. В результате оставил 15 мс, что соотв. 4000 оборотам в минуту максимально. У меня мотор 3000-3200 оборотов в минту делает.

Но может у Вас получится аппаратно , мотор и датчик другие. Расскажите потом.
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
@Старик Похабыч, здесь нужно в датчике гистерезис делать, как в нормальных промышленных изделиях, тогда не будет такого. Только гистерезис по аналоговой части, иначе бессмысленно. Антидребезг, конечно, хорошо, но тоже далеко не панацея.

@N0rdling, вот это, как мне кажется, изначально спорный постулат, что значения сдваиваются из-за дребезга. Вы как-то сравнивали с реальным количеством импульсов?
 

N0rdling

★✩✩✩✩✩✩
15 Янв 2020
154
20
@poty, сравнить с реальным количеством импульсов затруднительно. Возможно, осциллограмма даст более ясную картину происходящего. Возможно - это не дребезг, не утверждаю, что именно он.
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
Только гистерезис по аналоговой части, иначе бессмысленно.
На модуле уже стоит операционник. Нужно посмотреть схему, может он уже там реализован. Если нет, то можно переделать добавив дополнительный резистор.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
476
137
сравнить с реальным количеством импульсов затруднительно
Вы же писали, что медленно вращали рукой и наблюдали "дребезг", медленно вращая вы явно могли посчитать количество пройденных щелей, или я вас не правильно понял?
 

N0rdling

★✩✩✩✩✩✩
15 Янв 2020
154
20
@Bruzzer, правильно, медленно я провращал 10-15 импульсов, из них в мониторе порта несколько лишних вылезло с одинаковым таймингом. А вот если двигатель вращает, то уже проблематично за ним успеть посчитать :)
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
476
137
Если есть возможность исключить рывки, дрожание, и вращение в обратную сторону (даже небольшое), то по моему задачу можно решить программным антидребезгом, например подстраивая его значение в зависимости от скорости вращения, как писали выше, (если фиксированное значение задержки не устраивает). Может быть поставить для этого подтормаживатель. Подсчитайте, какие скорости возможны, насколько резко они могут меняться, и сколько отсчетов на оборот вам реально надо.
 

N0rdling

★✩✩✩✩✩✩
15 Янв 2020
154
20
@Bruzzer, я прикидывал по максимальной скорости вращения и при 9 щелях в диске получается 12 миллисекунд между срабатываниями. Опытным путем установил, что ложные срабатывания отсутствуют при задержке от 50мс.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
476
137
@N0rdling,
Для 9 узких щелей (т.е размер щели намного меньше промежутка между ними), если не экономить, и не пытаться решить программно, то можно поставить два считывателя со смещением. При срабатывании первого считывателя он запрещает свои прерывания и разрешает прерывания второго, и наоборот. Если для одного датчика мин время 12 мс, то для 2-х сдвинутых будет примерно 6 мс, что достаточно много чтобы прерывания не терялись.
 

N0rdling

★✩✩✩✩✩✩
15 Янв 2020
154
20
@Bruzzer, немного не так, 9 щелей, размер которых равен промежутку между ними (широкие щели). Немного не понял с двумя датчиками: допустим, один из них сработал и сразу запретил свои прерывания, потом сработал второй и с дребезгом посчитал не верно....
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
476
137
@N0rdling,
Наиболее понятно это при узких щелях и больших промежутках. Датчик А сработал на узкой щели. Датчик Б стоит в этот момент посередине между щелями. Тогда после первого срабатывания А и отключения его прерывания, датчик А может дребезжать сколько угодно, пока не засветится датчик Б, а он засветится, когда датчик А будет посередине между щелями и следовательно датчик А гарантированно выешел из зоны дребезга. И так далее.
Я не призываю вас использовать два датчика, просто говорю, что в некоторых случаях можно сделать так.
 

N0rdling

★✩✩✩✩✩✩
15 Янв 2020
154
20
@Bruzzer, идея с двумя датчиками выглядит очень привлекательной и надёжной, но есть одна сложность - правильно спозиционировать 2 датчика.