Проблемы с прерыванием

Тема в разделе "Arduino & Shields", создана пользователем Yoga, 2 авг 2015.

  1. Yoga

    Yoga Нуб

    Доброго всем дня.
    У меня такой вопрос, делаю небольшой проект, где требуется подсчет оборотов мотора и последующие вычисления. Имеется небольшой модуль, по сути обычная оптопара, но что-то еще есть, в электронике не очень разбираюсь. Выдает либо аналоговой сигнал, либо цифровой. Так же на моторе у меня сделано отверстие, чтобы замыкать оптопару.

    Дак вот, после поиска пришел к выводу, что это можно и нужно реализовать через прерывание. Когда оптопара закрыта, идет 1, когда она открывается(то есть прошел один оборот) идет 0. Написал простой скетч для теста

    Код (Text):
    #define ReadOpt 3

    volatile long int total;

    void setup() {
      //выставляем pinMode
      pinMode(ReadOpt, INPUT);
      pinMode(6, OUTPUT);
      digitalWrite(6, HIGH);
        //Сериал
      Serial.begin(9600);
      Serial.println("Test");

        //прерывание
      attachInterrupt(1, interruptRead, FALLING);
    }


    void loop() {

      Serial.println(total);

    }

    void interruptRead(){
    total++;
      }
    И вроде бы все хорошо, обороты считаются, но у меня закралось сомнение, что черезчур много считает. Решил в ручную открывать и закрывать оптопару картоном. Дак вот, когда я открываю оптопару и сигнал переходит с HIGH в LOW, прерывание срабатывает 3-4 раза и затем, когда закрываю он еще пару раз вызывает прерывание.

    Итог:
    1) Прерывание срабатывает почему-то не один раз
    2) Прерывание в режиме FALLING срабатывает даже тогда, когда сигнал идет с 0 в 1.

    Что я сделал не так и в сторону чего смотреть?



    Надеюсь на вашу помощь. Возможно объяснил не очень понятно и если что, готов ответить на вопросы :)
    [​IMG]
     
  2. DrProg

    DrProg Вечный нерд

    Вероятно промежуточные состояния оптопара не может как то однозначно определить 0 это или 1 вот и шлет то одно то другое. Своего рода оптический дребезг. Вы знаете какова минимальная и максимальная продолжительность одного импульса? Самое простое - добавить задержку после первого срабатывания на несколько миллисекунд, но это тогда не в прерывании.
     
  3. Yoga

    Yoga Нуб

    Cчитал просто значение, которое дает оптопара. Просто открыва и закрывал. Вроде же все ровно, нет?
    Код (Text):
    Test
    1
    1
    1
    1
    0
    0
    0
    0
    0
    1
    1
    1
    1
    1
    1
    0
    0
    0
    0
    0
    1
    1
    1
    1
    1
    0
    0
     
    На счет задержки я думал, но ведь если мотор будет крутиться с разной скоростью, то задержка должна быть разной :(
     
  4. DrProg

    DrProg Вечный нерд

    То что сигнал идет с даже с 0 на 1 говорит о том, что на самом деле он происходит несколько раз туда-обратно. То что в сериалпорт пишет ровно ни о чем не говорит, дребезг длится гораздо короче. Вам надо прикинуть минимальную продолжительность импульса свет-не свет (то есть сколько он будет длиться при максимальных оборотах) и игнорировать изменения происходящие быстрее.
     
  5. Yoga

    Yoga Нуб

    Хорошо, как вариант можно попробовать использовать задержку, но все же в таком способе может присутствовать погрешность, как мне кажется.


    А какие варианты решения этой проблемы еще могут быть? Я думал попробовать датчик холла, хотя, все таки оптопара мне больше подходит.
     
  6. ANV

    ANV Гуру

    74HC14
     
  7. DrProg

    DrProg Вечный нерд

    Кстати да, триггер Шмитта используется для аппаратного подавления помех и дребезга. Может сработать. Вот тут хороший пример со схемами и программной частью.
     
  8. Yoga

    Yoga Нуб

    Была мысль, после просмотра видео урока о прерываниях. Собственно оттуда и узнал о них :)
    Но как я понял, триггер Шмитта используется для перевода аналогового сигнала в цифровой. Или я не прав?
    Хотя по сути у этого модуля есть и аналоговый выход, можно его использовать.
     
  9. DrProg

    DrProg Вечный нерд

    RC цепь как бы приуменьшает скачки при дребезге за счет своей инертности. Сперва нужно подобрать время менее которого не следует давать напряжению достичь состояния при котором можно назвать его сигналом. Формула есть в ссылке. Задача же триггера распознать является ли сигнал сигналом или же остается на уровне помехи. В общем нужно подобрать сопротивление и резистор так, чтобы напряжение в дребезге не успевало превысить порог срабатывания триггера. Опять возвращаемся к вопросу: каково минимальное время импульса оптопары при вращении диска на максимальных оборотах? Если оно сравнимо с временем дребезга, то будет давиться вместе с ними.
     
  10. Yoga

    Yoga Нуб

    Ух, много новой информации для меня, нужно все изучить :)
    Спасибо за ответы, надеюсь получится
     
  11. andriano

    andriano Нерд

    Видите ли, на самом деле нет ни аналогового сигнала, ни цифрового. Есть зависимость тока или напряжения от времени. Все. "Аналоговый" или "Цифровой" - это наша трактовка конкретного сигнала, но никак не свойство самого сигнала.

    Кстати, если у датчика есть "аналоговый" выход, возможно, целесообразнее брать сигнал именно с него. По сути "цифровой" выход - это результат обработки "аналогового" теми же RC-цепью и триггером Шмитта. Если параметры этих двух узлов подобраны неоптимально, возникают побочные эффекты, например, в виде "дребезга". Можно попытаться самому построить и наладить эти цепи. Результат при грамотном подходе заведомо будет не хуже. Вопрос, чувствуете ли Вы для этого в себе достаточно сил.

    И еще.
    Если не ошибаюсь, на фото не оптопара, а "оптотройка", т.е. датчик с одним светодиодом и двумя фотодатчиками. Вы, судя по всему, используете только один из них. Интересно, как работает другой. И еще одно... если Вы "не заметили" второго фотодатчика, нет ли вероятности, что ВЫ допустили и другие ошибки при монтаже схемы?
     
  12. Yoga

    Yoga Нуб

    Но разве у них не разные свойства? Ну то есть аналоговый сигнал непрерывный с множеством значений, а цифровой только определенные значения? Хотя скорее всего я не прав :)

    Аналоговый выход есть, а вот знаний и опыта, чтобы обработать его, думаю, что не хватит. На самом деле, мне кажется, что лучше было бы самому "собрать" такой датчик, поскольку этот куплен где-то на али за пару долларов и не ясно с каким качеством сделан. Но опять же, боюсь, что не хватит навыков.

    А вот это вы меня сейчас удивили) Думал там излучатель и приемник. Все.
     
  13. andriano

    andriano Нерд

    3.0 Вольта с точки зрения цифровой техники - это логическая "1". И 3.1 В - "1". И 4.6 В - "1". Как видим, сигналы разные, а трактуем мы их (в цифровой технике) как одинаковые. Но это только вопрос трактовки.
    Например, для ТТЛ логики принято, что все, что меньше 0.4 В - "0", а все, что больше 2.4 В - "1". Сигнал в диапазоне 0.4-2.4 В на выходе цифровых схем появляться не должен. А если появится на входе, разные экземпляры микросхем могут трактовать его по-разному, из-за чего возможны ошибки. Чтобы снизить вероятность таких ошибок, применяют компараторы и триггеры Шмитта. Но ничто не мешает трактовать "цифровой" сигнал как "аналоговый", провести его "аналоговую" обработку (например, с помощью RC-цепи), а потом снова "превратить в цифровой" с помощью триггера Шмитта.
    Что касается китайских товаров, то у нас, особенно в 90-е годы, как-то сложилось мнение, что они все низкокачественные. На самом деле это не так. Элементная база для ВСЕЙ электроники производится в Китае. В том числе для самой высококачественной. Просто китайцы выпускают продукцию во ВСЕМ диапазоне цен и качества. Ну а то, что в 90-е мы могли себе позволить только самое дешевое - проблемы наши, а не китайцев.

    Навыки - приобретаются.
    Если поначалу страшно, то попытаться сделать не весь датчик целиком, а сначала только выходной преобразователь для него, - мне кажется, достаточно взвешенное решение. Можно взять сигнал с аналогового выхода, пропустить его через RC-цепь, а потом триггер Шмитта. И посмотреть, как будут влиять параметры RC-цепи на Результат. Вполне вероятно, что этого окажется достаточно для того, чтобы добиться желаемой работы датчика.
    Вообще-то по идее это должен быть инкрементный валкодер, который кроме перемещения/скорости способен определять и направление вращения. https://ru.wikipedia.org/wiki/Датчик_угла_поворота
     
  14. Yoga

    Yoga Нуб

    Теперь мне стало понятно, спасибо. Кстати, на модуле используется компаратор.
    Ну я мало застал время 90-х, поэтому мнения, что все китайский товары низкокачественные у меня нет. Пользуюсь продукцией Xiaomi - все отлично. А вот то, что очень дешевый товар может быть с хорошим качеством, верю не всегда.
    Попробовать в любом случае стоит, поэтому буду изучать материал, пока идут детальки. Если резистор и конденсатор купить в радиодеталях не проблема, то триггера Шмитта там нет.
     
  15. andriano

    andriano Нерд

    Дешевый - понятие относительное. Если товар производится в Китае, то стоить он там может в несколько раз дешевле, чем у нас.
    Как раз триггер Шмитта в магазине форума, на котором мы сейчас общаемся, есть: http://amperka.ru/product/74act14-schmitt-trigger
     
  16. Yoga

    Yoga Нуб

    Всем привет :) Надеюсь темы можно поднимать.
    Получил детальки и появилось свободное время, а вместе с этим новые вопросы.
    Сегодня немного поэкспрементировал, брал аналоговый сигнал с датчика, пропускал через триггер Шмитта и по сути, прерывания работали, как и должны работать. Все четко считалось. Правда пока проверял просто закрывая и открывая оптопару бумажкой, без моторчика.

    Но вот правда появились вопросы. А именно: для чего в данном случае нужна RC цепь? Ну то есть это служит неким фильтром?
    Как подобрать резистор с конденсатором? И так же, как правильно произвести подключение.
    Я пробовал это сделать из вики-статьи про перетягивания каната, но все же, там пример для кнопки,а у меня немного другое.
    Направьте на правильный путь :)

    Спасибо!
     
  17. Unixon

    Unixon Оракул Модератор

    Эта цепь устраняет ненужные высокочастотные колебания (дребезг) путем их осреднения.

    Подбором постоянной времени RC цепочки, исходя из ограничений на время регистрации события. Ограничения сверху - это максимальный интервал времени срабатывания оптопары (прохождения оптического окна) и более строгое ограничение - максимальное время запаздывания вход оптопары - выход триггера, за это время на выходе RC цепочки напряжение должно измениться достаточно для регистрации отличного логического уровня. Ограничение снизу - максимальный интервал времени в течение которого регистрируется дребезг при отсутствии фильтра.
     
  18. Yoga

    Yoga Нуб

    Спасибо. Но, конечно, для меня понятнее не стало:(

    [​IMG]

    сейчас у меня сделано так. В a1 подключен датчик, который на выходе дает аналоговый сигнал. Конденсатор 100 нФ и резистор 100 кОм. Достаточно ли этого будет, если предположить, что скорость вращения не больше 40-50 оборотов за секунду(ну это с запасом).
     
  19. Unixon

    Unixon Оракул Модератор

    Ну так а чего бы не посчитать вам характерные временные интервалы?