Подключение форсунки к порту прерывания

AdDa
Offline
Зарегистрирован: 06.05.2019

Подскажите пожалуйста, как узнать время впрыска по прерыванию,
Определил пин для подключения, дальше не знаю...надо как то через micros ()

attachInterrupt(2, injector,   RISING); 
void injector() {                         //измеряем частоту на форсунке
 micros();
}

 

 

b707
Offline
Зарегистрирован: 26.05.2017

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

Подумайте сначала, как вы сможете отличить начало впрыска от конца (по каким сигналам). а когда придумаете - просто замерьте разницу микрос между этими двумя отметками.

AdDa
Offline
Зарегистрирован: 06.05.2019

вот думаю , не могу придумать )

 

b707
Offline
Зарегистрирован: 26.05.2017

AdDa пишет:

вот думаю , не могу придумать )

я вас не про программирование спрашиваю, а про технику. Как вы на моторе (или где у вас там форсунка) собираетесь засекать моменты начала и конца впрыска?

И какой там, кстати, примерно интервал?

AdDa
Offline
Зарегистрирован: 06.05.2019

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

volatile int  fr;                            //импульсы тахометра
volatile int  fz;                         
unsigned long micros_fr = 0,
void setup() {
attachInterrupt(2, injector,   RISING);
}
void loop() { 
fz = fz - 1;
  if (fz == 0) {
    fr = 0;
  }
}
void injector() {                         //измеряем частоту на форсунке
  fr =  micros() - micros_fr; 
  micros_fr = micros();
}

 

AdDa
Offline
Зарегистрирован: 06.05.2019

спасибо, в коде бы показать ))

b707
Offline
Зарегистрирован: 26.05.2017

код для тахометра нерабочий... ну фиг с ним.

третий (и последний) раз повторяю вопрос

В тахометре вы засекаете время между импульсами. А в форсунке вы что собрались засекать? Так, как в тахометре, для форсунки работать не будет, так вы сможете засечь интервал МЕЖДУ ВПРЫСКАМИ, а не сам впрыск.

Давайте, не ленитесь. попробуйте сделать усилие. Если нет - я спать пойду.

 

 

AdDa
Offline
Зарегистрирован: 06.05.2019

Код для тахометра не рабочий, да, потому что это не весь от него )
в форсунке   хочу замерить время в течении которого форсунка открыта...
 Сигнал поступил fr=1; -> Стартуем micros() , как ток сигнал меняется fr=0; (форсунка закрыта), записываем время  time =  micros(); в течении которого она была открыта.... 
Такая логика? 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

AdDa пишет:
хочу замерить время в течении которого форсунка открыта...

Такая логика? 

Так надо зафиксировать время открытия и время закрытия. разница даст то что Вы хотите. По факту нужно два прерывания.  Вот это поворот!

b707
Offline
Зарегистрирован: 26.05.2017

AdDa пишет:

Сигнал поступил fr=1; -> Стартуем micros() , как ток сигнал меняется fr=0; (форсунка закрыта), записываем время  time =  micros(); в течении которого она была открыта.... 
Такая логика? 

ну почти... Только не "сигнал поступил", а сначала "сигнал изменился вверх" (форсунка открытв), а потом "сигнал изменился вниз" (закрыта). То есть ключевое то, что вы ловите не сам сигнал, а его изменения. И изменения вам нужны два разных, противоположных по знаку. Поэтому одним прерыванием тут не обойтись, нужно два, одно по подьему. другое по спаду.

Правда, посмотрев ваш код тахометра, я не думаю что вы напишете. По крайней мере не сами.

b707
Offline
Зарегистрирован: 26.05.2017

Интересно, а дребезг при включении форсунок бывает?

AdDa
Offline
Зарегистрирован: 06.05.2019

Ладно не ждите, идите спать, я тоже, не могу сообразить.... Как отобразить в коде ...

AdDa
Offline
Зарегистрирован: 06.05.2019

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

b707
Offline
Зарегистрирован: 26.05.2017

AdDa пишет:

Ладно не ждите, идите спать, я тоже, не могу сообразить.... Как отобразить в коде ...

и не сообразите. Вы для себя слишком сложную задачу поставили.

AdDa пишет:

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

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

AdDa
Offline
Зарегистрирован: 06.05.2019

у меня нету таких приборов 

b707
Offline
Зарегистрирован: 26.05.2017

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

http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/chtenie-shim-5-kgts

AdDa
Offline
Зарегистрирован: 06.05.2019

жестко там.... )

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015
volatile uint8_t mode = 0; // 0-ожидание, 1-счет
volatile uint32_t micros_f = 0;
volatile uint32_t micros_tmp = 0;

void injector() {
  if (0 == mode) {
    micros_tmp = micros();
    mode++;
  } else {
    micros_f = micros() - micros_tmp;
    mode--;
  }
}

void setup() {
  Serial.begin(115200);
  attachInterrupt(2, injector, CHANGE);
}


void loop() {
  Serial.print("Duration: "); 
  Serial.println(micros_f);
  delay(500); // чтоб не строчило непрерывно.

}

не знаю будет это работать на ардуине, самому интересно.))

 

p.s. да тут как то надо первый импульс правильно поймать а то мерять будем не то

AdDa
Offline
Зарегистрирован: 06.05.2019

шо то я не пойму, нафига его ловить, как придет сам так и начинать.... ) В смысле что с запуском двигателя появится импульс...  Я не догоняю, что не так с моим вариантом ))

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

void loop() { 

fz = fz - 1;
  if (fz == 0) {
    fr = 0;
  }
}
void injector() {                         //измеряем  
  fr =  micros() - micros_fr; 
  micros_fr = micros();
}

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

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

 

а я исходил из этого

AdDa пишет:

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

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

У stm32 есть режим таймера, когда когда он считает только при разрешении по входу. Этот режим используют для определения времени открытия форсунок. При закрытии входа - пропадании сигнала на форсунке, идёт прерывание, в котром можно считать величину и обнулить счётчик для следующего использования. Опять тема про правильный выбор МК под задачу.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

и называется он pwm input mode, там только таймер правильно настроить и все, потом считывай два регистра с периодом и длительностью, люблю я stm-ки, а вот в отмеге даже не заю отчего таймеры тикают, подозреваю от одного источника.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а проверить пин на сигнал (LOW_HIGH) не вариант?

volatile uint32_t micros_f = 0;
volatile uint32_t micros_tmp = 0;

void injector() {
  if (bitRead(PIND, 2)) {
    micros_tmp = micros();
  } else {
    micros_f = micros() - micros_tmp;
  }
}

void setup() {
  Serial.begin(115200);
  attachInterrupt(2, injector, CHANGE);
}


void loop() {
  Serial.print("Duration: "); 
  Serial.println(micros_f);
  delay(500); // чтоб не строчило непрерывно.

}

 

SAB
Offline
Зарегистрирован: 27.12.2016

Автор, всё конечно хорошо, узнаете вы это время впрыска. Расскажите нам, что дальше вы будете делать с этим временем ? Или это просто хочу увидеть своими глазами который сейчас час)))). Любое измерение нужно, чтобы делать какой то вывод. Какой вывод вы будете делать, и как в дальнейшем будете использовать результат?

b707
Offline
Зарегистрирован: 26.05.2017

AdDa пишет:

 Я не догоняю, что не так с моим вариантом ))

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

вот именно, что не догоняете...

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

 

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

b707
Offline
Зарегистрирован: 26.05.2017

xDriver пишет:

и называется он pwm input mode, там только таймер правильно настроить и все, потом считывай два регистра с периодом и длительностью, люблю я stm-ки, а вот в отмеге даже не заю отчего таймеры тикают, подозреваю от одного источника.

СТМ конечно хорошо, но вообще задачка элементарно решается и на АВР, всего-то надо вовремя переключить прерывание с RAISING на FAILING. Я в #16 дал ссылку на ветку, где мы когда изгалялись, измеряя скважность ШИМ на атмеге. Там кода-то 15 строчек...

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

Правильный вопрос, а что дальше делать? STM не тратит время на измеренее. Сразу имеет ширину впыска и можем с ней работать - рассчитывать что надо и картинки рисовать.

AdDa
Offline
Зарегистрирован: 06.05.2019

У меня arduino mega, необходимо все это для того, чтобы в последующем вычислить расход топлива

AdDa
Offline
Зарегистрирован: 06.05.2019

Хм... за иллюстрацию спасибо , буду думать )

SAB
Offline
Зарегистрирован: 27.12.2016

b707 пишет:

длительность впрыска здесь обозначена как "ширина импульса"

Почему вы решили, что это так? Форсунку можно отнести к механическим устройствам, у которой есть время открытия и время закрытия. Я в своё время смотрел осцилом на бэхах, так там именно периодом была регулировка количества подаваемого топлива. При этом ширина импульса была константой. И разработчиков можно понять, При одинаковой ширине импульса форсунка пропустит выверенный империческим путём объём топлива. А далее всё просто, ну вы поняли. 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Для такой банальной задачи прерывания не нужны - http://arduino.ru/Reference/PulseIn

b707
Offline
Зарегистрирован: 26.05.2017

SAB пишет:

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

тут спорить не буду, может и так. Я просто предположил.

Я ТРИ РАЗА добивался от ТС ответа, как именно он собирается измерять длительность впрыска. То что он в итоге ответил, было ближе к моей трактовке, чем к вашей.

Хотя из диалога очевидно, что ТС сам не знает, как это устроено и доверять ему нельзя

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А ещё не нужно забывать - что мы понятия не имеем о каких именно форсунках речь. Я открыл Гугл и диву дался, насчитал минимум четыре варианта. И везде есть свои особенности, которые важно учитывать для расчета времени впрыска.

AlexTLN
Offline
Зарегистрирован: 14.05.2016

Возможно, это поможет, только это датчик скорости.

 

 

//==========INPUT============================

bool state = HIGH;
bool sig = HIGH;
unsigned long time_IN_LAST=0;
unsigned long time_IN_NOW=0;
//unsigned long timeMID2=4130;//4920 * 0.84 = 4130 micros delay in 180km/h
unsigned long timeMID=500000;

//=====EXEPTIOT===============

unsigned long micros_EXCEPTION=10000000;
unsigned long micros_EXCEPTION2=4294000000;

//==OUT===========================================================================
=========

unsigned long time_OUT_NOW=0;
unsigned long time_OUT_LAST=0;
bool sigOUT=LOW;


void setup() {

//  Serial.begin(115200);
  pinMode(4, OUTPUT);
  pinMode(2, INPUT);
  delay(500);
  sig=digitalRead(2);
  state=sig;

}

void loop() {

  
//======INPUT===================
  
sig=digitalRead(2);


if(state!=sig)
{

  time_IN_NOW=micros();
  timeMID=time_IN_NOW-time_IN_LAST;
  if(timeMID<4920)timeMID=4920; //speed limit
  time_IN_LAST=time_IN_NOW;
  state=sig;
// Serial.print("IN:");
// Serial.println(timeMID);

}

//========OUT============

time_OUT_NOW=micros();

if(time_OUT_NOW<micros_EXCEPTION&&time_OUT_LAST>micros_EXCEPTION2)time_OUT_LAST=0;


if(time_OUT_NOW>time_OUT_LAST+timeMID*0.84) //0.84 correction in %
{
  
  digitalWrite(4, sigOUT);
  sigOUT = !sigOUT;
  
//  Serial.print("OUT:");
//  Serial.println(time_OUT_LAST-time_OUT_NOW);
  time_OUT_LAST=time_OUT_NOW;

  
}


}

MaksVV
Offline
Зарегистрирован: 06.08.2015

Не забываем что форсунка это индуктивность и там не прямоугольные импульсы, а с всплеском до 80...100в из-за самоиндукции. Я к тому что аппаратно нужно это учитывать

SLKH
Offline
Зарегистрирован: 17.08.2015

SAB пишет:

b707 пишет:

длительность впрыска здесь обозначена как "ширина импульса"

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

А период не связан с числом оборотов двигателя?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

SLKH пишет:

А период не связан с числом оборотов двигателя?

 

Период между сериями импульсов связан. А за каждый такт впрыска может выдаваться несколько импульсов на форсунку. 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

MaksVV пишет:
Не забываем что форсунка это индуктивность и там не прямоугольные импульсы, а с всплеском до 80...100в из-за самоиндукции. Я к тому что аппаратно нужно это учитывать

Я детально не разбирался, но по тому что в гугле нашёл - исполнения форсунок есть разные, но учитывать и что вы сказали тоже нужно. Короче тз не полное ))

SAB
Offline
Зарегистрирован: 27.12.2016

AdDa пишет:

У меня arduino mega, необходимо все это для того, чтобы в последующем вычислить расход топлива

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

Расход топлива измеряют ультразвуковыми датчиками. В который раз повторю,- не лезьте в электронику авто, это может приводить к серьёзным авариям. Если хотите что то устанавливать, то только внешнее, максимум напряжение с аккумулятора, а то и он свой.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

MaksVV пишет:
Не забываем что форсунка это индуктивность и там не прямоугольные импульсы, а с всплеском до 80...100в из-за самоиндукции. Я к тому что аппаратно нужно это учитывать

Ну, вообще говоря, форсунка может быть и емкостью. Но в этом случае импульсы все равно не прямоугольные, да и всплески могут быть.