Не могу правильно отловить прерывание

com
Offline
Зарегистрирован: 06.09.2013

Чертовщина какая-то.... имею датчик движения, при срабатывании - импульс длительностью 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
Offline
Зарегистрирован: 06.09.2013

схема не загрузилась в предыдущем посте

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

com, просто вы неудачно пин выбрали, он по дефолту подтянут к 5 вольтам, и ваш транзистор меряется  силами с подтяжкой меги :) Вобщем на другой пин нужно переставить. Кстати 2 секунды -это почти вечность для контрллера, можно и без прерывания отловить, да и без транзистора -аналоговым входом.

com
Offline
Зарегистрирован: 06.09.2013

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

насчет сменить пин - у меня не мега, у меня про мини. доступны для прерываний пины 2 и 3, пробовал на обоих - монопенисуально

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

com пишет:

транзистор кт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.

Земли-то датчика и Ардуины соеденины с эмиттером?

Что за датчик- может у него открытый коллектор?

com
Offline
Зарегистрирован: 06.09.2013

замерил напругу.

на входе ровно 1.65

база-эмиттер, транзистор закрыт - 0в, открыт - 0,65в. на R2 падение ровно 1.0в, закон кирхгофа подтвержден! :)