Не могу правильно отловить прерывание
- Войдите на сайт для отправки комментариев
Чертовщина какая-то.... имею датчик движения, при срабатывании - импульс длительностью 2 сек напряжение около 1.8 в. Пытаюсь "нормализовать" его, заодно инвертировав
транзистор кт315
отлавливаю таким образом:
// проверочный скетч для отладки срабатывания прерывания volatile boolean alarm = false; unsigned long currenttime=0, endtime=0; void setup() { pinMode(11, OUTPUT); attachInterrupt(0, setalarm, FALLING); } void loop() { currenttime = millis(); if (alarm) // сработал датчик движения { alarm = false; endtime = currenttime + 10000; // на 10 сек включить сигнальную лампу } if (currenttime < endtime) digitalWrite(11, LOW); // реле включается низким уровнем else digitalWrite(11, HIGH); } void setalarm() { alarm = true; }
на первый взгляд схема работает нормально - пока датчик не сработал, то на входе напряжение 5в, при срабатывании датчика транзистор открывается, на входе напряжение меньше 0.1в Но почему-то прерывание срабатывает постоянно, независимо от срабатывания датчика и независимо от уровня сигнала на входе, т.е сигнальная лампа горит постоянно сразу после включения ардуино.
нормальная работа начинается только после уменьшения номинала R1 с 10 ком до 150 ом, тогда все происходит именно так, как и задумано: при срабатывании датчика включается лампа, горит и через 10 сек после последнего срабатывания датчика гаснет. Но в этом случае при срабатывании датчика и открытии транзистора напряжение на входе контроллера 1.7В
пробовал на двух платах (про мини и нано) и нескольких транзисторах - рпезультат одинаковый.
что я делаю не так?
схема не загрузилась в предыдущем посте
com, просто вы неудачно пин выбрали, он по дефолту подтянут к 5 вольтам, и ваш транзистор меряется силами с подтяжкой меги :) Вобщем на другой пин нужно переставить. Кстати 2 секунды -это почти вечность для контрллера, можно и без прерывания отловить, да и без транзистора -аналоговым входом.
аналоговым - да, замечательно ловится, напрямую выход от датчика на вход ардуино. так и было изначально, когда всего один датчик - в основном цикле опрос и тут же реакция. а теперь, когда проект разросся, через прерывания стало бы намного удобнее. если получится, конечно.
насчет сменить пин - у меня не мега, у меня про мини. доступны для прерываний пины 2 и 3, пробовал на обоих - монопенисуально
транзистор кт315
Но в этом случае при срабатывании датчика и открытии транзистора напряжение на входе контроллера 1.7В
что я делаю не так?
кт315 ...... не лучший вариант, но всё равно будем расследовать!
Напряжение насыщения коллектор -эмиттер при токах коллектора 20мА и базы 2 мА = 0.4-0.5 Вольта
Напряжение насыщения база -эмиттер при токах коллектора 20мА и базы 2 мА = 1.0-1.1 Вольта
У вас на входе " около 1.8 Вольта" , на R2 соответственно 1.8-1.0 =0.8 Вольта
0.8 Вольта и 2 килоома - ток будет 0.4 мА в базу( или 5.3 мА при 150 Ом)
У вас 10 килоом коллекторной нагрузки, а это всего 0.5 мА
Если у вас 1.7 Вольта - значит не вошёл в насыщение.
Предположений три:
1. Входное напряжение проседает даже от такого маленького тока, каким вы его нагружаете.
2. Неправильно включён транзистор ( например перепутаны коллектор-эмиттер)
3. он погиб....
Померьте напряжение база-эмиттер, если там сильно больше Вольта- обрыв базы.
P.S.
Земли-то датчика и Ардуины соеденины с эмиттером?
Что за датчик- может у него открытый коллектор?
замерил напругу.
на входе ровно 1.65
база-эмиттер, транзистор закрыт - 0в, открыт - 0,65в. на R2 падение ровно 1.0в, закон кирхгофа подтвержден! :)