Устранение дребезга оптического переключателя
- Войдите на сайт для отправки комментариев
Здравствуйте.
Имеется в наличии некоторый оптический переключатель китайского происхождения. Точно не известно, что это, но вроде как FC-33 (на базе H2010) (по крайней мере, так он определяется поисковиком, xd). Выдал преподаватель в универе, сказал "Вот тебе датчик, иди делай робота", и был таков.
Требуется: Используя переключатель как оптический энкодер (в паре с диском с прорезями) определить скорость вращения некоторого вала.
На пути решения поставленной задачи столкнулся с проблемой - ложные срабатывания. Как "дребезг" у кнопок.
Накидал тестовую программу, задача которой - считать срабатывания оптопары. Код программы:
#define L_encoder 2 volatile unsigned long counter; void setup() { Serial.begin(115200); attachInterrupt(0, intrpts, CHANGE); pinMode(L_encoder, INPUT); } void intrpts() { counter ++; } void loop() { Serial.println(counter); }
За одну прорезь ардуинка выполняет несколько прерываний. Каждое прерывание увеличивает счётчик на единицу. То есть, за одну прорезь счётчик должен увеличиваться на 1, а на деле, увеличивается на 2+.
Перечитал уйму ресурсов, везде говорят про какие-то триггеры Шмидта, RC-цепи, и программное подавление дребезга(что, в случае с прерываниями неприменимо). Объясните пожалуйста, как тупому, куда припаять резистор с конденсатором, или как ещё можно решить эту проблему.
Заранее прошу не кидать тапками, в последнее время уже крыша едет с этой учёбой.
программное подавление дребезга(что, в случае с прерываниями неприменимо)
что-то новое
за одну прорезь счётчик должен увеличиваться на 1, а на деле, увеличивается на 2+.
с чего бы это?
если внимательно посмотреть на код. как раз на 2 и должен увеличиваться...
CHANGE как переводится?
программное подавление дребезга(что, в случае с прерываниями неприменимо)
что-то новое
А есть способ? delay'ем в прерывании не отделаться, только запрещать их на время, после первого срабатывания, скажем, через millis. Но реализовать это у меня не получилось, а готовых решений не нашёл.
с чего бы это?
если внимательно посмотреть на код. как раз на 2 и должен увеличиваться...
Должно срабатывать на изменении сигнала, то есть, если сигнал меняется с 0 на единицу, и если с 1 на 0. Вы скорее всего неправильно поняли). "За одну прорезь" - подразумевался проворот диска с прорези на риску. То есть, однократное изменение сигнала.
Если использовать RAISING, прерывание всё равно будет срабатывать, даже если значение изменится с 1 на 0. Всё из-за дребезга, или как его тут обозвать. Пока не успокоится - сигнал несколько раз сменится от 0 к 1 и обратно.
Да и, ладно бы если всегда на 2, так по разному же выдаёт. Может счётчик на 1 увеличить, может на 8, и так далее.
А ты осциллографом-то смотрел, что у тебя на фотоприемнике тварица?
А ты осциллографом-то смотрел, что у тебя на фотоприемнике тварица?
Осциллографа не имею в пользовании, так что с этим затруднения. На борту датчика кстати есть компаратор LM393, пишут, что он грешит подобным.
Если использовать RAISING, прерывание всё равно будет срабатывать, даже если значение изменится с 1 на 0. Всё из-за дребезга, или как его тут обозвать. Пока не успокоится - сигнал несколько раз сменится от 0 к 1 и обратно.
Без осцилла диагностика причины невозможна. Скорее всего у вас на питании пульсации, которые в гистерезисе воспринимаются как новый импульс. Для проверки запитайте опто-модуль от батареек.
Увы, никаких изменений. Скачет так же, что с батарейками, что с конденсаторами.
Ищите осциллограф
Может и таким что то увидите - http://arduino.ru/forum/proekty/virtualnyi-ostsillograf
не надо запрещать, просто не увеличивайте счетчик некоторое время после первого срабатывания.
Сколько прорезей у вас в диске и какая максимальная скорость вращения?
Может и таким что то увидите - http://arduino.ru/forum/proekty/virtualnyi-ostsillograf
Тут и аналог то не нужен. Просто выдавайте измеряемый 0/1 в сериал (плоттер) на максимуме скорости UART. Или через буфер, если не достаточно разрешения.
Не получилось реализовать такое в коде. Да и аппаратно гасить всяко надёжнее.
Прорезей в диске 20, за максимальную скорость не отвечу точно, но не больше 1000 об/мин. Крутит простенький моторчик с редуктором:
По входу в прерывание поставь задержку на 100 - 500 мкс (подбрать минимум при отсутствии повторов), перед выходом очисти флаг прерывания.
Не получилось реализовать такое в коде. Да и аппаратно гасить всяко надежнее.
не получилось реализовать? Скажите честно, что даже не пробовали.
Что там " реализовывать"? При входе в прерывание первым делом проверяем время с прошлого входа и если прошло менее ХХХ мкс - тут же выходим. ВСЕ.
А насчет " надежности" - никакой надежности от выключения прерывания не добавится, ничего "аппаратно" там не гасится, все программно, просто кода больше и вероятность ошибок больше.
Мне кажется, вы вообще ничего сами делать не хотите, готового решения ждете? Зря.
одно дело потрепаться на аглицком, но читать - это уже за гранью )))
одно дело потрепаться на аглицком, но читать - это уже за гранью )))
Что и Вы не знаете о существовании онлайн-переводчиков? Ужость! :-(
На русском :)
одно дело потрепаться на аглицком, но читать - это уже за гранью )))
Что и Вы не знаете о существовании онлайн-переводчиков? Ужость! :-(
так они напереводят...и как быть с ненормативной, но очень выразительной лексикой? )))
так они напереводят...и как быть с ненормативной, но очень выразительной лексикой? )))
Это какой ? "дребезг"?
Первая же ссылка
За что вы на меня набрасываетесь? Перепробовал много всего, результатов не было, отчего сослался на свою некомпетентность в данном вопросе и полез на форумы. Глупость? Может быть. Лень? Не думаю.
А за советы спасибо.
Первая же ссылка
Я правда не один десяток сайтов пересмотрел, но такого не находил. Эх ох... Видно поиск информации - не моё). Спасибо большое
Первая же ссылка
Проверил - тестовый код работает как надо. Спасибо ещё раз!
Выходит, что этот модуль идёт совсем без гистерезиса. А так с резистором получается по факту триггер шмитта, который отсекает все мелкие колебания уровня засветки и помехи от питания.
Сразу виден уровень схемотехника этого модуля. В схему надо добавить не только ПОС, но и плавающее смещение на инверсный вход, чтобы обеспечить стабильную работу схемы при разных уровнях внешней засветки.
Первая же ссылка
Проверил - тестовый код работает как надо. Спасибо ещё раз!
Аппаратно одолел, а программно? В твоём коде:
Аппаратно одолел, а программно?
Как-то так наверное. Не знаю, как будет работать, проверить возможности уже нет). Датчик пропаян, прикручен, и справляется как и должен, не хочу разбирать.