Не работает Триггер Шмидта
- Войдите на сайт для отправки комментариев
Втр, 05/08/2014 - 23:41
Здравствуйте, я начинающий в освоении и столкнулся с неразрешимой проблемой.
Решил защитить кнопку от дребезга контактов, но схема не работает. Скретч
int buttonInt = 0;//Pin 2 int pinLed = 13; volatile boolean shine = false; void setup() { pinMode(pinLed, OUTPUT); attachInterrupt(buttonInt, swap,RISING); } void swap() { shine = !shine; } void loop() { digitalWrite(pinLed, shine ? HIGH :LOW); delay(100); }
13 лед беспомощно моргает, на нажатие кнопки реагирует как-то не внятно и не так как планировалось. Вообще по идее при нажатии на кнопку должно меняться состояние. Горит\потухнет.
Схема
10мф конденсатор, резистор на 10 ком, триггер Шмидта sn74act14n. Что не так в моей схеме или скретче?
Кстати на схеме нарисован конденс вроде как длинной ножкой на землю,я так понял, что это не правильно. Хотя я уже по всеякому пробовал. Полная шляпа. Такое ощущение что у меня ничего нет, не триггера, не конденсатора, не кнопки.
Я бы сперва выбросил всю лабуду, оставив только кнопку, притянутую к 1 и посмотрел, работает ли скетч. А далее добавлял компоненты поштучно.
Спасибо за оперативный ответ. Да, нужно попробовать по шагам. Попробую завтра. Сеня уже заи..
Тут посмотрел ещё на конденсатор. Он на 50в. Это нормально?
10мкф не многовато? сколько он будет заряжаться через 10ком
Зачем такие сложности? Кнопку между землёй и пином прерывания, включаете подтягивающий резистор, ставите срабатывание при падении напряжения, в функции прерывания вначале ставите
int i=0;
while(i <100) {i++; }
это вместо delay, т.к в прерываниях он не работает. Конечно, будет простой, но это так плохо, если задача такая как у вас, тем более можно подобрать довольно малое число для сравнения.
Мы не ищем легких путей.
Глядя на схему я боюсь представить как чайник в розетку включаете.
Кстати на схеме нарисован конденс вроде как длинной ножкой на землю,я так понял, что это не правильно.
На схеме нарисован конденсатор, у которого минусовой пин на землю подключен. Минусовой пин помечается полоской, на которой нарисован либо минус либо минус с обводкой(похож на 0 ноль). Ножку можно откусить, если брать БУ конденсатор с какой-нибудь платы, они там уже откусаны.
Понял, увидел, спасибо.
Сначала я не заморачивался, но нашел пример аппаратной стабилизации http://wiki.amperka.ru/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D1%83%D1%80%D0%BE%D0%BA%D0%B8:10-%D0%BF%D1%80%D0%B5%D1%80%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D0%B8-%D0%B0%D0%BF%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F-%D1%81%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F
Я нашел несколько ресурсов, которые предалают такой способ решения проблемы дребезга. Решил попробоать как это работает. Зачем рассуждать о том как я включаю чайник в розетку? Конечно с помощью триггера шмидта, как вы уже наверное догадались.
10мкф не многовато? сколько он будет заряжаться через 10ком
В примере была именно эта емкость http://wiki.amperka.ru/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D1%83%D1%80%D0%BE%D0%BA%D0%B8:10-%D0%BF%D1%80%D0%B5%D1%80%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D0%B8-%D0%B0%D0%BF%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F-%D1%81%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F там есть и расчет в видео
10мкф не многовато? сколько он будет заряжаться через 10ком
В примере была именно эта емкость http://wiki.amperka.ru/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D1%83%D1%80%D0%BE%D0%BA%D0%B8:10-%D0%BF%D1%80%D0%B5%D1%80%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D0%B8-%D0%B0%D0%BF%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F-%D1%81%D1%82%D0%B0%D0%B1%D0%B8%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F там есть и расчет в видео
Триггер Шмидта прекрасно работает и без Ардуино, в данном случае ардуино выполняет роль индикатора, то есть сигнализирует светиком, что ей в порт что-то прибежало.
Возьмите мультиметр, или, если есть, осциллограф и замерьте напряжение на выходе триггера Шмидта при нажатой и ненажатой кнопке.
Ну зачем нужен триггер Шмитта, если хватает и срабатывания при половине питающего напряжения? Просто заряжайте конденсатор через резистор и кнопку....
Хотя не првильно всё это вам высказывать и смеяться над Вашим чайников, это же просто интересно и познавательно.
А, вот ещё что - эти тактовые кнопки надо подключать точно так, как показано на вашем рисунке-схеме. Они только выглядят со всех сторон одинаково (на первый взгляд), но если её поставить не так, как на рисунке, то ничего, ессно, не заработает.
И ещё я не наблюдаю цепи разряда конденсатора.
А, блин, сама кнопка. Их симметричность сбивает с толку.
Зачем такие сложности? Кнопку между землёй и пином прерывания, включаете подтягивающий резистор, ставите срабатывание при падении напряжения, в функции прерывания вначале ставите
int i=0;
while(i <100) {i++; }
это вместо delay, т.к в прерываниях он не работает. Конечно, будет простой, но это так плохо, если задача такая как у вас, тем более можно подобрать довольно малое число для сравнения.
Попробовал со стягивающим резистором. Почти как надо работает, только все таки видно, что из-за дребезга иногда по 2 раза за нажатие сменяются состояние лэда.
Кнопка... Иногда её полезно развернуть по схеме на 90 градусов у неё пары замыкаются... , rising - Попробуйте заменить на falling : это срабативание по срезу , и ризинг и фаллинг практически работают в этом применении ка триггер шмидта , а точнее , как триггер - защелка. .
Почти как надо работает, только все таки видно, что из-за дребезга иногда по 2 раза за нажатие сменяются состояние лэда.
так замените счёт до ста, например, до 200.
Похоже все таки заработало. Ещё раз всю схему разобрал и собрал. Где-то накосячил наверное при сборке в ночи. Только пока явного преимущества не вижу. Так же как со стягивающим резистором работает. Ладно, будем подбирать оптимальные параметры.
Всем спасибо, коллеги.
А вы не пробовали, кнопку напрямую к дуине подключить?
И я, если не совсем понимаю чем вам триггер Шмидта поможет в борьбе с дребезгом.
Дребезг, это же по сути "много-много" нажатий/отжатий кнопки. От 0v до 5v, а не "напряжение скачет/плавает".
Кстати, если не ошибаюсь, то триггер Шмидта, по сути является составной частью любого цифрового пина ардуины.
И ставить его снаружи - нет необходимости.
А "дребезг" аппаратно давиться с помощью конденсатора. Он у вас уже есть.
И програмно - тоже не сложно.
Главное понять откуда он береться: в момент нажатия кнопки, когда она "уже почти нажалась". Возникает "неуверенный контакт". За миллисекунды может десятки раз "замкнутся/разомкнуться". Пока вы додавите пальцем в "четкое состояние".
Отсюда и способ борьбы: после того как словили первое нажатие, какое-то время нужно просто не обращать внимание на нажатия кнопки. Если с прошлого нажатия прошло слишком мало времени, то это явно не "человек так быстро жмет", а "дребезг". Нужно просто подождать и он прекратится.
Вообщем IMHO - одна деталька у вас лишняя. А в случае програмной борьбы - даже две (еще и кондер не нужен).
P.s. и delay() в loop() - лишний.
P.s. и delay() в loop() - лишний.
ну там вообще весь луп лишний, логичнее поставить запись в порт в самой функции прерывания, чем переписывать его тысячи раз в секунду ничего не изменяя.
P.s. и delay() в loop() - лишний.
ну там вообще весь луп лишний, логичнее поставить запись в порт в самой функции прерывания, чем переписывать его тысячи раз в секунду ничего не изменяя.
Вообщем-то "дело вкуса", но я бы все-таки в loop() это делал.
Во первых - "разделение отвественности".
Сегодня нам нужно просто светиком светить, завтра на LCD показывать, после завтра - в Serial выводить.
И далеко не все можно делать в "прерывании".
Во вторых: чем меньше, тупее обработчик прерывания - тем лучше. Это "прерывание", чем раньше из него выскочили, тем болше шансов оставить зубы целыми.
В третьих: ничего страшного в "переписывать его тысячи раз в секунду ничего не меняя" - тоже нет. "Моторесурс" у нас на это не тратиться :)
При переписывании тысячу раз в секунду расходуется электроэнергия(А у меня она с сентября 3.5 рубля за киловатт ваххаха, но всё же, друг батарейки или аккумуляторы).
Тогда уж поставить проверку условия, изменилось ли чего, что б не писать в порт.
Делал себе какую то хренотень, уже не помню какую, у меня при вызов прерывания просто присваивалась 1 какой то переменной, затем в лупе, кога есть время выполнял проверку на эту единицу, если 1, то делал что то и присваивал той же переменной 0. Довольно удобно.
>Тогда уж поставить проверку условия, изменилось ли чего, что б не писать в порт.
А вы уверены что этой проверки уже нет на библиотечном или аппаратном уровне? (тогда ваши проверки - будут лишней нагрузкой).
А вы уверены, что проверка условия будет тратить меньше электроэнергии чем лишняя запись в порт?
А вы уверен что даже пустой loop() будет меньше тратить электроэнергии?
Хотите экономии.... смотрите режими энергопотребления. "Засыпайте" между периодами активности, снижайте частоту, переходите на 3.3v, ставте регулятор импульсный и т.п.
Пустой loop тратит чуть-чуть меньше, примерно на 1мА =)