Проблемы с прерыванием
- Войдите на сайт для отправки комментариев
Доброго всем дня.
У меня такой вопрос, делаю небольшой проект, где требуется подсчет оборотов мотора и последующие вычисления. Имеется небольшой модуль, по сути обычная оптопара, но что-то еще есть, в электронике не очень разбираюсь. Выдает либо аналоговой сигнал, либо цифровой. Так же на моторе у меня сделано отверстие, чтобы замыкать оптопару.
Дак вот, после поиска пришел к выводу, что это можно и нужно реализовать через прерывание. Когда оптопара закрыта, идет 1, когда она открывается(то есть прошел один оборот) идет 0. Написал простой скетч для теста
#define ReadOpt 3 volatile long int total; void setup() { //выставляем pinMode pinMode(ReadOpt, INPUT); digitalWrite(ReadOpt, 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.
Верный код. На 6 ножке весит моторчик.
интересно сколько раз успеет цикл выполниться пока дырка открыта?
тут один чувак с австралии. очень подробно все описал и даже код приложил
http://www.gammon.com.au/forum/?id=11504
интересно сколько раз успеет цикл выполниться пока дырка открыта?
тут один чувак с австралии. очень подробно все описал и даже код приложил
http://www.gammon.com.au/forum/?id=11504
Ну ведь по идее, цикл должен выполнится один раз, пока дырка открыта. Это мне и нужно, чтобы при открытии оптопара прибавить один оборот.
Почитал статью, что вы скинули. Там ведь идет речь о прерывании по таймеру, нет? Не мой ведь случай.
Ну ведь по идее, цикл должен выполнится один раз, пока дырка открыта. Это мне и нужно, чтобы при открытии оптопара прибавить один оборот.
давайте думать логически
в чем же блин разница между
attachInterrupt(1, interruptRead, FALLING);
и
attachInterrupt(1, interruptRead, CHANGE);
и как с этим жить
Давайте :)
Разница в том, что FALLING - вызывает функцию один раз при переходе с HIGH в LOW, а CHANGE - вызывает функцию при любом изменении.
Falling для моей цели подходит идеально, но почему-то функция вызывает как change при любом изменении сигнала, да и плюс к этому несколько раз.
в сторону чего смотреть?
На ум приходит сравнивать время срабатываний и если оно больше, допустим, 100мс, то прибавлять один оборот. Но ведь скорость вращения может быть разной, следовательно и время будет разным. То есть в итоге погрешность все равно будет присутствовать.
Это если программно. Быть может есть способ аппаратно это сделать?
Аппаратно то же самое: ФНЧ и триггер Шмитта.
На ум приходит сравнивать время срабатываний и если оно больше, допустим, 100мс, то прибавлять один оборот. Но ведь скорость вращения может быть разной, следовательно и время будет разным. То есть в итоге погрешность все равно будет присутствовать.
20 мс я от балды написал. По уму надо посмотреть осциллографом сколько там времени дребезжит и взять с небольшим запасом.
ЕвгенийП, понял вас. И то есть, если правильно подобрать время, то независимо от скорости вращения, прибавлять будет корректно?
И то есть, если правильно подобрать время, то независимо от скорости вращения, прибавлять будет корректно?
Не будет! Будет четко ловится спад и иногда (при дребезге) наростание. Для обеспечения стабильности можна настроить прерывание по изменению и при правильном времени защиты от дребезга получите удвоеное число оборотов.
интересно сколько раз успеет цикл выполниться пока дырка открыта?
тут один чувак с австралии. очень подробно все описал и даже код приложил
http://www.gammon.com.au/forum/?id=11504
английский не знаю, но думаю по этомй статье реально смогу научиться. спасибо. вроде все более менее понятно на первый взгляд
С подтягивающими резисторами у меня не все однозначно получалось. Попробуйте убрать эту строку, а подтяжку, если она нужна выполнить аппаратно.
немного не понял, о какой строчке идет речь?
немного не понял, о какой строчке идет речь?
Я про первый пост, 8 строка скетча.
Сейчас увидел, что в следующей версии(следующий пост) Вы ее уже убрали.