считывание импульсов

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нет, ну, хорошо, плохие выбросы 13 микросекунд, а хорошие? Вот этот меандр - сколько? Я не вижу ничего на скрине. Это нужно чтобы так расчитать RC-цепочку, чтобы ненужные сигналы она съела, а нужные оставила в покое.

Хотя, защита есть в самом МК (диоды на землю и питание), так что можно просто поставить перед пином резистор на 10-100кОм, чтобы ток ограничнить и, думаю, этого будет достаточно.

blink_977
Offline
Зарегистрирован: 10.08.2013

теперь скетч

#define InPin PB0
#define OutPin PB1
unsigned long ih,il,tx;
bool fl;
void setup() {
 digitalWrite(OutPin, LOW); 
 pinMode(OutPin, OUTPUT);
 fl=true; 
}
void loop() { 
while(1){
  ih=pulseIn(InPin,HIGH,200000L); 
  il=pulseIn(InPin,LOW,200000L);
  if ((ih=0) || (il=0)) { fl=true; continue; }; // Движок стоит, заряжаем импульс
  tx=(ih+il) /2;  // Период импульсов 
  if ((tx < 27000) && fl ) {  // обороты больше ХХ, дать импульс
  digitalWrite(OutPin, HIGH);   
  delay(500);                  
  digitalWrite(OutPin, LOW);
  fl=false;  //Импульс дали, ждем остановки движка 
  }
}
}

это не сработало

я переделал его вот так, что бы убедится что он хоть что то ловит

#define InPin PB0
#define OutPin PB1
unsigned long ih,il,tx;
bool fl;
void setup() {
 digitalWrite(InPin, LOW);
 digitalWrite(OutPin, LOW); 
 pinMode(OutPin, OUTPUT);
 fl=true; 
 Serial.begin(9600);
}
void loop() { 
while(1){
  ih=pulseIn(InPin,HIGH,200000L); 
  il=pulseIn(InPin,LOW,200000L);
  if ((ih=0) || (il=0)) { fl=true; continue; }; // Движок стоит, заряжаем импульс
  tx=(ih+il) /2;  // Период импульсов 
  Serial.println(tx);
  }
}
}

но монитор выдает только 0

по идее он должен был выдать мне сумму ih и il поделенную на 2, в микросекундах

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Первый скетч - строка 14, второй - строка 16 (а также посмотрите везде внимательно, может ещё где есть)

Вы используете присваивание "=" вместо сравнения "=="

blink_977
Offline
Зарегистрирован: 10.08.2013

ЕвгенийП пишет:

Первый скетч - строка 14, второй - строка 16 (а также посмотрите везде внимательно, может ещё где есть)

Вы используете присваивание "=" вместо сравнения "=="

это я совсем удалил даже, оставив только

ih=pulseIn(InPin, HIGH);
il=pulsein(InPin, LOW);

Serial.println(ih+il);

но все равно 0

осциллограф показывает мне 5 вольт, мультиметр 6.3 вольта, может ли мультиметр ошибаться из за меандра? может я PB0 спалил уже

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

blink_977 пишет:

ЕвгенийП пишет:

Первый скетч - строка 14, второй - строка 16 (а также посмотрите везде внимательно, может ещё где есть)

Вы используете присваивание "=" вместо сравнения "=="

это я совсем удалил даже, оставив только

ih=pulseIn(InPin, HIGH);
il=pulsein(InPin, LOW);

Serial.println(ih+il);

но все равно 0

Так показывайте скетч-то. В том я Вам показал на ошибку, Вы что-то удалили, показывайте новый.

И ещё, скажите Вы мне наконец длительность высокой части сигнала, ну не вижу я на картинке, уж третий раз спрашиваю.

blink_977
Offline
Зарегистрирован: 10.08.2013

так видно? 70мс получается?

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

blink_977, привидите дефайны inpin/outpin в сответствии с общепринятыми стандартами. Не назначайте на их на 0 и 1 пины -они заняты сериалом.

blink_977
Offline
Зарегистрирован: 10.08.2013

dimax пишет:

blink_977, привидите дефайны inpin/outpin в сответствии с общепринятыми стандартами. Не назначайте на их на 0 и 1 пины -они заняты сериалом.

Так PB0 это 8-й пин

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нет, PB0 - это просто число 0, т.е. при использовании в digitalRead - нулевой пин.

Если у Вас восьмой, то не умничайте и пишите 8.

----------

Про картинку - ну, так там не 5В, а 2,5 (полклеточки). Разве нет?

blink_977
Offline
Зарегистрирован: 10.08.2013

ЕвгенийП пишет:

Нет, PB0 - это просто число 1, т.е. при использовании в digitalRead - первый пин.

Если у Вас восьмой, то не умничайте и пишите 8.

----------

Про картинку - ну, так там не 5В, а 2,5 (полклеточки). Разве нет?

а, это я щас просто стабилитрон присобачил, для проверки, он сбросил до 2.8 вольт.

а так там клеточка 5 вольт

то есть тут я подключаюсь к пин 3 уно, и в мониторе должен увидеть сумму ih, il в микросекундах, верно?

#define InPin PB3
unsigned long ih,il;
void setup() {
 Serial.begin(9600);
 digitalWrite(InPin, LOW);
}
void loop() { 
while(1){
  ih=pulseIn(InPin,HIGH); 
  il=pulseIn(InPin,LOW);
  Serial.println(ih+il);
  }
}
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

blink_977 пишет:

то есть тут я подключаюсь к пин 3 уно, и в мониторе должен увидеть сумму ih, il в микросекундах, верно?

Конечно, нет. Если Вы хотите работать с пином 3 UNO, то не умничайте и в первой строке так и пишите

#define InPin 3

Вам же уже про это двле говорили!

blink_977
Offline
Зарегистрирован: 10.08.2013

ЕвгенийП пишет:

blink_977 пишет:

то есть тут я подключаюсь к пин 3 уно, и в мониторе должен увидеть сумму ih, il в микросекундах, верно?

Конечно, нет. Если Вы хотите работать с пином 3 UNO, то не умничайте и в первой строке так и пишите

#define InPin 3

Вам же уже про это двле говорили!

остальное верно? импульсы в 70мс?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не знаю, надо знать что означают п=риски и клеточки. У меня например, всё только по клеточкам. А у Вас, если по рискам, то 70, а если по клеточкам, то 15.

blink_977
Offline
Зарегистрирован: 10.08.2013

так работает, только помогите до ума довести

#define InPin 9
#define OutPin 13
unsigned long ih,il,tx;
bool fl;
void setup() {
 pinMode(InPin, INPUT);
 digitalWrite(OutPin, LOW); 
 pinMode(OutPin, OUTPUT);
 fl=true; 
}
void loop() { 
while(1){
  ih=pulseIn(InPin,HIGH,200000L); 
  il=pulseIn(InPin,LOW,200000L);
  if ((ih==0) || (il==0)) { fl=true; continue; }; // Движок стоит, заряжаем импульс
  tx=(ih+il) /2;  // Период импульсов 
  if ((tx < 100000) && fl ) {  // обороты больше ХХ, дать импульс
  digitalWrite(OutPin, HIGH);   
  delay(500);                  
  digitalWrite(OutPin, LOW);
  fl=false;  //Импульс дали, ждем остановки движка 
  }
}
}

диод моргает в нужное время, но проблема в том что он и потом периодически моргает, и мне надо что бы он раз моргнул, и замолчал до следующего падения оборотов до 0-я. если конкретно то нужно что бы он моргал при каждом числе оборотов равным 550-600

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Напомните, пожалуйста чётко и ясно, что Вам нужно.

Правильно лия понимаю, что Вам нужно после включения питения , отсчитать нужное количество прилетевших импльсов, выдать ... (какой сигнал и куда?) и после этого забыть всё как кошмарный сон до следующего включения питания?

Или там что-то ещё? Неохота всю тему перерывать.

blink_977
Offline
Зарегистрирован: 10.08.2013

ЕвгенийП пишет:

Напомните, пожалуйста чётко и ясно, что Вам нужно.

Правильно лия понимаю, что Вам нужно после включения питения , отсчитать нужное количество прилетевших импльсов, выдать ... (какой сигнал и куда?) и после этого забыть всё как кошмарный сон до следующего включения питания?

Или там что-то ещё? Неохота всю тему перерывать.

после включения питания, выдавать HIGH на любом пине, ТОЛЬКО при конкретном количестве импульсов, и неважно питание отключится или нет, нужно задать конкретный порог срабатывания, когда импульсы ниже или выше этого порога, тогда никакой реакции не должно быть

blink_977
Offline
Зарегистрирован: 10.08.2013

сделал так, это опытным путем

#define InPin 9
#define OutPin 13
unsigned long ih,il,tx;
bool fl;
void setup() {
  Serial.begin(9600);
 pinMode(InPin, INPUT);
 digitalWrite(OutPin, LOW); 
 pinMode(OutPin, OUTPUT);
 fl=true; 
}
void loop() { 
while(1){
  ih=pulseIn(InPin,HIGH); 
  il=pulseIn(InPin,LOW);
  if ((ih==0) || (il==0)) { fl=true; continue; }; // Движок стоит, заряжаем импульс
  tx=(ih+il) /2;  // Период импульсов 
  Serial.println(tx);
  if ((tx>10000 && tx<10500) && fl ) {  // обороты больше ХХ, дать импульс
  digitalWrite(OutPin, HIGH);   
  delay(500);                  
  digitalWrite(OutPin, LOW);
  fl=false;  //Импульс дали, ждем остановки движка 
  }
  
}
}

проблема в помехах которые появляются в момент когда на педаль газа давишь. двигатель с холостых начинает обороты набирать, и вот в этот момент помеха проскакивает, которая расценивается мц как импульс. варианта два: либо скетч затачивать что бы он только на конкретную длительность импульса реагировал, либо RC цепочкой. посоветуйте что лучше?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Неясно. Итак, допсутим мы задали порог - 100 импульсов.

Птиние включилось, считаем прилетающие имплульсы. На сотом поднимаем HIGH на некотором пине.

ЧТо мы делаем дальше? Продолжаем считать и поднимаем на 200-м? Или забиваем на всё и больше ничего не считаем?

blink_977
Offline
Зарегистрирован: 10.08.2013

ЕвгенийП пишет:

Неясно. Итак, допсутим мы задали порог - 100 импульсов.

Птиние включилось, считаем прилетающие имплульсы. На сотом поднимаем HIGH на некотором пине.

ЧТо мы делаем дальше? Продолжаем считать и поднимаем на 200-м? Или забиваем на всё и больше ничего не считаем?

При 100 импульсах поднимаем пин на пол секунды. Если прилетело допустим 110 или выше этого, то ничего не происходит, пин стоит на LOW. Тоже самое и вниз: прилетело 90- опять ничего не происходит, поднялось до 100 опять - HIGH на пол секунды.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Погодите, я может тупой, но счёчик-то не уменьтшается никогда! Или мы его србасываем в ноль в какой-то момент?

Вот включили питание, летят импульсы, мы исх считаем.

Вот прилетел сотый импульс, мы включили пин в HIGH на полсекунды. Счётчик не сбрасываем? Как после этого может прилететь 90-ый или там снова сотый? Для этого надо счётчик сбросить.

Т.е.е я пока не могу понять логику работы

 

 

blink_977
Offline
Зарегистрирован: 10.08.2013

ЕвгенийП пишет:

Погодите, я может тупой, но счёчик-то не уменьтшается никогда! Или мы его србасываем в ноль в какой-то момент?

Вот включили питание, летят импульсы, мы исх считаем.

Вот прилетел сотый импульс, мы включили пин в HIGH на полсекунды. Счётчик не сбрасываем? Как после этого может прилететь 90-ый или там снова сотый? Для этого надо счётчик сбросить.

Т.е.е я пока не могу понять логику работы

 

 

какой счетчик? Я не считаю количество импульсов, мне нужно посчитать об/мин, и на допустим, 500об/мин поднять пин, через полсекунды его опустить опять. Обороты выше 500об/мин - ничего не происходит, никакой пин не поднимается, обороты ниже 500об/мин, опять ничего не происходит. Щас поняли?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

blink_977 пишет:

какой счетчик? Я не считаю количество импульсов, мне нужно посчитать об/мин, и на допустим, 500об/мин поднять пин, через полсекунды его опустить опять. Обороты выше 500об/мин - ничего не происходит, никакой пин не поднимается, обороты ниже 500об/мин, опять ничего не происходит. Щас поняли?

Почти. 

Т.е. если мы сделаем порогом, скажем 500.

Всякий раз, когда обороты к порогу снизу, включаем пин в HIGH на заданное время. В любое другое время ничего не делаем.

А 1 оборот в минуту это сколько импульсов?

blink_977
Offline
Зарегистрирован: 10.08.2013

ЕвгенийП пишет:

blink_977 пишет:

какой счетчик? Я не считаю количество импульсов, мне нужно посчитать об/мин, и на допустим, 500об/мин поднять пин, через полсекунды его опустить опять. Обороты выше 500об/мин - ничего не происходит, никакой пин не поднимается, обороты ниже 500об/мин, опять ничего не происходит. Щас поняли?

Почти. 

Т.е. если мы сделаем порогом, скажем 500.

Всякий раз, когда обороты к порогу снизу, включаем пин в HIGH на заданное время. В любое другое время ничего не делаем.

А 1 оборот в минуту это сколько импульсов?

скажите как это вычислить, и я отвечу )

я отталкиваюсь от данных серийного монитора, на холостых оборотах значение переменной tx колеблется от 13650 до 13750. опытным путем, сидя в заведенной машине я сделал так:

if((tx>10000 && tx<10500) && fl) //если обороты между этими значениями
//то включить такой то пин

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

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нет, давайте всё-таки сделаем по-человечекски.

Выаш tx - это просто однократно измеренный период, точность плюс/мину полвершка давайте нормально считать обороты.

Для это Вам не нужен pulseIn, достачтоно преравяни по высокому уровню.

Про какой-то ещё свплеск от которого нужно избавляться я впревые слышу, давайте потом с ним разбираться.

Считать обороты, так считать.

Если Вы не знаете сколько сигналов приходит за один роборот - не беда. Давайте посчитае "сигналы в минуту". а когда Вы будете их показывать на экране, Вы сравните их с показаниями тахометра и посчитаете коэффициент.

Сегодян я не могу, но в выходной, мы могли бы это сделать.

nik182
Offline
Зарегистрирован: 04.05.2015

blink_977 пишет:

так работает, только помогите до ума довести

#define InPin 9
#define OutPin 13
unsigned long ih,il,tx;
bool fl;
void setup() {
 pinMode(InPin, INPUT);
 digitalWrite(OutPin, LOW); 
 pinMode(OutPin, OUTPUT);
 fl=true; 
}
void loop() { 
while(1){
  ih=pulseIn(InPin,HIGH,200000L); 
  il=pulseIn(InPin,LOW,200000L);
  if ((ih==0) || (il==0)) { fl=true; continue; }; // Движок стоит, заряжаем импульс
  tx=(ih+il) /2;  // Период импульсов 
  if ((tx < 100000) && fl ) {  // обороты больше ХХ, дать импульс
  digitalWrite(OutPin, HIGH);   
  delay(500);                  
  digitalWrite(OutPin, LOW);
  fl=false;  //Импульс дали, ждем остановки движка 
  }
}
}

диод моргает в нужное время, но проблема в том что он и потом периодически моргает, и мне надо что бы он раз моргнул, и замолчал до следующего падения оборотов до 0-я. если конкретно то нужно что бы он моргал при каждом числе оборотов равным 550-600

О! Мой скетч работает :-) Посмотрите логику - повторно моргать он может только если подумал, что двигитель стоит и зарядил fl. Видимо из pulseIn иногда прилетает ноль и перезапускает скетч.  В строку 15 введите переменную- счётчик и счтитайте количество повторов нуля. Думаю штук 10 хватит. Только при превышении этого количества перезаряжайте fl - значит движок точно стоит. И вставте сразу за строкой 15 обнуление этого счётчика , что бы не интегрировался. Либо вообще выкиньте строку 15. Тогда сработает один раз и больше ни разу до перезапуска ардуины не моргнёт.      

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

blink_977 пишет:

так работает, только помогите до ума довести

#define InPin 9
#define OutPin 13
unsigned long ih,il,tx;
bool fl;
void setup() {
 pinMode(InPin, INPUT);
 digitalWrite(OutPin, LOW); 
 pinMode(OutPin, OUTPUT);
 fl=true; 
}
void loop() { 
while(1){
  ih=pulseIn(InPin,HIGH,200000L); 
  il=pulseIn(InPin,LOW,200000L);
  if ((ih==0) || (il==0)) { fl=true; continue; }; // Движок стоит, заряжаем импульс
  tx=(ih+il) /2;  // Период импульсов 
  if ((tx < 100000) && fl ) {  // обороты больше ХХ, дать импульс
  digitalWrite(OutPin, HIGH);   
  delay(500);                  
  digitalWrite(OutPin, LOW);
  fl=false;  //Импульс дали, ждем остановки движка 
  }
}
}

диод моргает в нужное время, но проблема в том что он и потом периодически моргает, и мне надо что бы он раз моргнул, и замолчал до следующего падения оборотов до 0-я. если конкретно то нужно что бы он моргал при каждом числе оборотов равным 550-600

О! Мой скетч работает :-) Посмотрите логику - повторно моргать он может только если подумал, что двигитель стоит и зарядил fl. Видимо из pulseIn иногда прилетает ноль и перезапускает скетч.  В строку 15 введите переменную- счётчик и счтитайте количество повторов нуля. Думаю штук 10 хватит. Только при превышении этого количества перезаряжайте fl - значит движок точно стоит. И вставте сразу за строкой 15 обнуление этого счётчика , что бы не интегрировался. Либо вообще выкиньте строку 15. Тогда сработает один раз и больше ни разу до перезапуска ардуины не моргнёт.      

да, это ваш скетч, я раза три упоминал что он ваш, см. посты выше

я просто изменил там несколько строк

тоже мысль про выкинуть строку, думаю меня это устроит

вот это последний рабочий вариант:

#define InPin 9
#define OutPin 13
unsigned long ih,il,tx;
bool fl;
void setup() {
  Serial.begin(9600);
 pinMode(InPin, INPUT);
 digitalWrite(OutPin, LOW); 
 pinMode(OutPin, OUTPUT);
 fl=true; 
}
void loop() { 
while(1){
  ih=pulseIn(InPin,HIGH); 
  il=pulseIn(InPin,LOW);
  if ((ih==0) || (il==0)) { fl=true; continue; }; // Движок стоит, заряжаем импульс
  tx=(ih+il) /2;  // Период импульсов 
  Serial.println(tx);
  if ((tx>10000 && tx<10500) && fl ) {  // обороты больше ХХ, дать импульс
  digitalWrite(OutPin, HIGH);   
  delay(500);                  
  digitalWrite(OutPin, LOW);
  fl=false;  //Импульс дали, ждем остановки движка 
  }
  
}
}

 

nik182
Offline
Зарегистрирован: 04.05.2015

А проверить со строкой 15 такого вида можно?

if ((ih==0) || (il==0)) {nn++; if(nn>10)  fl=true; continue; }; // Движок стоит, заряжаем импульс
nn=0;

 

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

А проверить со строкой 15 такого вида можно?

if ((ih==0) || (il==0)) {nn++; if(nn>10)  fl=true; continue; }; // Движок стоит, заряжаем импульс
nn=0;

 

щас проверю...

nik182
Offline
Зарегистрирован: 04.05.2015

И ещё. На больших оборотах сигнал может уменьшаться и pulseIn перестать срабатывать и заряжать ещё раз.   

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

И ещё. На больших оборотах сигнал может уменьшаться и pulseIn перестать срабатывать и заряжать ещё раз.   

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

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

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

nik182
Offline
Зарегистрирован: 04.05.2015

Осталось вывести в сериал nn после плюсования и посмотреть  в как  и когда она будет набираться. Может увеличить сравнение  до сотни и всё пройдёт? 

Да, успеет загрузиться.

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

Осталось вывести в сериал nn после плюсования и посмотреть  в как  и когда она будет набираться. Может увеличить сравнение  до сотни и всё пройдёт? 

Да, успеет загрузиться.

я стер 15 строку как вы и советовали, там уже нету nn

скажите, ресет тиньки через резистор на плюс обязательно надо, или просто оставить в воздухе?

nik182
Offline
Зарегистрирован: 04.05.2015

Х.З. У меня всегда в воздухе висит, проблем пока не было, но гарантировать не могу. Единственное что поддерживает надежду - ногу ресет можно превратить в ногу ввода - вывода и тогда подтягивать её вообще не получится. 

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

Х.З. У меня всегда в воздухе висит, проблем пока не было, но гарантировать не могу. Единственное что поддерживает надежду - ногу ресет можно превратить в ногу ввода - вывода и тогда подтягивать её вообще не получится. 

а как вы контроллер по питанию защищаете? что бы стабильно работал, я имею ввиду кондеры на питание, итд

да, и по кварцу еще вопрос: стоит тиньку разогнать? а то 1мгц маловато шо то

nik182
Offline
Зарегистрирован: 04.05.2015

До 8 МГц разгоняется изменением одного фьюза CKDIV8.

Защита от помех - питание через 100 Ом и почти прямо на ножки 0.1 керамику и 220 кубик танталовый. 

Да вот ещё - условие tx<10500 лишнее!!! Из-за него может задерживаться, когда проскакивает быстро 10500.

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

До 8 МГц разгоняется изменением одного фьюза CKDIV8.

Защита от помех - питание через 100 Ом и почти прямо на ножки 0.1 керамику и 220 кубик танталовый. 

Да вот ещё - условие tx<10500 лишнее!!! Из-за него может задерживаться, когда проскакивает быстро 10500.

спасибо, проверю завтра

nik182
Offline
Зарегистрирован: 04.05.2015

Глядя на ваш сигнал, мне подумалось, что проблема в том, что пик очень узкий и pulseIn может давать ноль на попытке найти время HIGH импульса. Отсюда и проблемы. Может быть вы попробуете выкинуть строку 14 и всё что с ней связано? Мне кажется, что тогда скетч будет работать как задумано - отлавливать остановку двигателя без отключения питания ардуины. Но это важно если вы не отключаете зажигание перед перезапуском. У меня заглохший движок запускается сразу если крутануть стартер. 

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

Глядя на ваш сигнал, мне подумалось, что проблема в том, что пик очень узкий и pulseIn может давать ноль на попытке найти время HIGH импульса. Отсюда и проблемы. Может быть вы попробуете выкинуть строку 14 и всё что с ней связано? Мне кажется, что тогда скетч будет работать как задумано - отлавливать остановку двигателя без отключения питания ардуины. Но это важно если вы не отключаете зажигание перед перезапуском. У меня заглохший движок запускается сразу если крутануть стартер. 

вы смотрели последний скрин который я выложил? Там сплошной меандр, он все равно узкий?

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

я щас думаю как мне тинку запрограммировать, так что бы без бутлоадера было... думаю, я откомпилирую скетч под тиньку, достану .hex файл из папки, и программатором запишу в тиньку. Только вот не знаю запишет ли мой программатор .hex файл... если нет, тогда через ардуину буду лить

nik182
Offline
Зарегистрирован: 04.05.2015

У меня небыло проблем ни с одним програматором. 

Нет. Картинку не видел, но сейчас рассмотрел. Вижу что у вас нет конденсатора. Без него шум в начале LOW скоррее всего и давал ложные срабатывания.

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

У меня небыло проблем ни с одним програматором. 

Нет. Картинку не видел, но сейчас рассмотрел. Вижу что у вас нет конденсатора. Без него шум в начале LOW скоррее всего и давал ложные срабатывания.

в общем новости хорошие, все работает, только пробивает иногда. на uno не пробивала, странно почему на тиньке так себя ведет

вот такая вещь получилась :

nik182
Offline
Зарегистрирован: 04.05.2015

Без емкости от 100 мкф и больше прямо на ноги питания -4 +8 будет глючить. Не вижу емкости 1000пф на входе - без неё тоже будет глючить в машине. Схему всех элементов с платы можно увидеть? 

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

Без емкости от 100 мкф и больше прямо на ноги питания -4 +8 будет глючить. Не вижу емкости 1000пф на входе - без неё тоже будет глючить в машине. Схему всех элементов с платы можно увидеть? 

я выпаял мц для того что бы переписать ее, вернул обратно, ничего не работает (

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

ща разбираюсь

вот скетч, на уно все работале прекрасно, и на тиньке в первы раз тоже (

#define InPin 3
#define OutPin 1
unsigned long ih,il,tx;
bool fl;
void setup() {
 pinMode(InPin, INPUT);
 digitalWrite(OutPin, LOW); 
 pinMode(OutPin, OUTPUT);
 fl=true; 
}
void loop() { 
while(1){
  ih=pulseIn(InPin,HIGH); 
  il=pulseIn(InPin,LOW);
  tx=(ih+il) /2;  // Период импульсов 
  if ((tx>11000) && fl ) {  // обороты больше ХХ, дать импульс
  digitalWrite(OutPin, HIGH);   
  delay(500);                  
  digitalWrite(OutPin, LOW);
  fl=false;  //Импульс дали, ждем остановки движка 
  }
  
}
}

 

nik182
Offline
Зарегистрирован: 04.05.2015

Да. Вобщем всё хорошо, только 10мкф мало и я её не вижу на плате, вижу маленькую керамику - тоже нужна обязательно и её нет на схеме. Та ,что С2 не работает за резистором. И емкость 1000пф параллельно D1 нужна, как фильтр от высокочастотных помех.  

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

Да. Вобщем всё хорошо, только 10мкф мало и я её не вижу на плате, вижу маленькую керамику - тоже нужна обязательно и её нет на схеме. Та ,что С2 не работает за резистором. И емкость 1000пф параллельно D1 нужна, как фильтр от высокочастотных помех.  

эта керамика и есть 10мкф, возле мц стоит

емкость добавлю

но, падение напряжения все равно присутствует, даже когда я сигнал напрямую на тиньку подаю. не париться с этим?

nik182
Offline
Зарегистрирован: 04.05.2015

Падение напряжения где?

 

nik182
Offline
Зарегистрирован: 04.05.2015

Падение напряжения где?

 

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

Падение напряжения где?

 

на выходе с тахометра

nik182
Offline
Зарегистрирован: 04.05.2015

Ну так увеличте резистор раз в 10 

blink_977
Offline
Зарегистрирован: 10.08.2013

nik182 пишет:

Ну так увеличте резистор раз в 10 

я до мегаома доходил, но тогда делитель стоял... щас еще раз попробую

nik182
Offline
Зарегистрирован: 04.05.2015

До мегома перебор, а вот 20 - 50 кОм и за ними обязательно конденсатор  - нормально. Нужно исходить из токов. Если выход тахометра 12 вольт, то ток безболезненно и выше помех это 0.1 - 0.5 мА -  соответственно из этого расчёта и получается резистор.