как выдавать импульсы

Yer
Offline
Зарегистрирован: 12.02.2016

Как видно в графике желтый сигнал у нас импулсь подаваемый на катушки форсунки,синий отображает открытие и закрытие форсунки (пьезо датчик срабатывает по шелчку форсунки).Подаваемый сигнал на ардуино 8мс по графику видно что на 2мс позже закрывается форсунка 

evgta
Offline
Зарегистрирован: 02.09.2016

так всетаки калибровка будет? или все так на глазок?

Yer
Offline
Зарегистрирован: 12.02.2016

Вопрос пожалуйста уточните 

evgta
Offline
Зарегистрирован: 02.09.2016

Yer пишет:

Вопрос пожалуйста уточните 

Калибровка по качеству смеси (т.е. стереохимического соотношения газа и воздуха)

a5021
Offline
Зарегистрирован: 07.07.2013

Чет я не вижу никаких 2мс там. Пьеза начинает регистрировать сильный акустический сигнал сразу по заднему фронту импульса. Стало быть, клапан форсунки пришел в движение.

Yer
Offline
Зарегистрирован: 12.02.2016

самоиндукции в катушке по схеме гасится по диоду,а блоках гбо-4 стаг гасится со вторым прямым транзистором  

Yer
Offline
Зарегистрирован: 12.02.2016

Yer
Offline
Зарегистрирован: 12.02.2016

при резком нажатии на педаль газа обороты с трудом поднимаются заметно что газа не хватает это потверждает и лямбда зонд который показывает бедную смесь.Как видно синий у нас импулсь с блока ECUа желтый с ардуино который подается на форсунки.Если плавно нажимать на педаль газа обороты нормально поднимается без всяких провалов

Yer
Offline
Зарегистрирован: 12.02.2016

Протестировал с осцилографом только на один канал подавал импулсь с частотой который показан на фото ардуино успевает обратывать и выдавть точно такой сигнал на выходе,помоему если подаешь одновременно с большой частотой сразу на шесть входов то тогда ардуино не успеет обработать   

diger67
Offline
Зарегистрирован: 25.07.2015

Yer пишет:

Протестировал с осцилографом только на один канал подавал импулсь с частотой который показан на фото ардуино успевает обратывать и выдавть точно такой сигнал на выходе,помоему если подаешь одновременно с большой частотой сразу на шесть входов то тогда ардуино не успеет обработать   

Ну это можно и так посчитать, максимально возьмем 6000 об/мин, это 600 в секунды. За каждый оборот шесть импульсов, получаем 3600 в сек. 1/3600 =0.00027777 сек, если я не где не ошибся то на обработку одного импульса на максимальных оборотах у вас есть минимум ~277 мксек. Остается определить сколько реально времени выполняется обработка ширины одного импульса.

evgta
Offline
Зарегистрирован: 02.09.2016

Yer пишет:

при резком нажатии на педаль газа обороты с трудом поднимаются заметно что газа не хватает это потверждает и лямбда зонд который показывает бедную смесь.Как видно синий у нас импулсь с блока ECUа желтый с ардуино который подается на форсунки.Если плавно нажимать на педаль газа обороты нормально поднимается без всяких провалов

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

Yer
Offline
Зарегистрирован: 12.02.2016

давление просаживается с 1,20кг/см2 на 1кг/см2, почему у нас импульсы ардуино не успевают за импульсами ЕСU как показана на фото.

Если бы ардуино выдавал точно такие импульсы как ECU я бы точно винил редуктор.Синий у нас ECU сигнал,желтый ардуино 

Yer
Offline
Зарегистрирован: 12.02.2016

давление просаживается с 1,20кг/см2 на 1кг/см2, почему у нас импульсы ардуино не успевают за импульсами ЕСU как показана на фото.

Если бы ардуино выдавал точно такие импульсы как ECU я бы точно винил редуктор.Синий у нас ECU сигнал,желтый ардуино 

diger67
Offline
Зарегистрирован: 25.07.2015

Вы все время исследуете один канал управления. Для полного понимания картины вам надо измерять все шесть каналов. Импульсы поступают со сдвигом, а не следуют по алгоритму закончился один пришел следующий. Если вы используете програмный метод измерения ширины импульса то так и будет работать ваш блок управления. Здесь нужна аппаратная обработка входящего сигнала и это непосильная задача для mega328. Уверен что данный вопрос можно решить применив процессор с необходимым количеством таймеров в режиме захвата и выдающих на выходе ширину импульса по регистру сравнения. Посмотрите схему на 555 которую вы привели как пример. Там на каждую форсунку работает отдельны одновибратор.

Yer
Offline
Зарегистрирован: 12.02.2016

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

Yer
Offline
Зарегистрирован: 12.02.2016

Решил проблему убрав delayMicroseconds теперь сигналы точно совпадают с блоком ECU и никаких провалов при резком нажатий

на газ отсутвует 

a5021
Offline
Зарегистрирован: 07.07.2013

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

Убирать delayMicroseconds по смыслу близко к соединению прямым проводом, минуя ардуину.

Yer
Offline
Зарегистрирован: 12.02.2016

Тогда задержку включение без delayMicroseconds нужно сделать 

a5021
Offline
Зарегистрирован: 07.07.2013

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

ssss
Offline
Зарегистрирован: 01.07.2016

diger67 пишет:

Здесь нужна аппаратная обработка входящего сигнала и это непосильная задача для mega328. Уверен что данный вопрос можно решить применив процессор с необходимым количеством таймеров в режиме захвата и выдающих на выходе ширину импульса по регистру сравнения. Посмотрите схему на 555 которую вы привели как пример. Там на каждую форсунку работает отдельны одновибратор.

Не буду говорить какой именно это МК, это и так уже все знают. )))

ssss
Offline
Зарегистрирован: 01.07.2016

a5021 пишет:

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

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

Ориентироваться на обороты не вопрос. Обороты не имеют мгновенно изменяющейся тенденции.

a5021
Offline
Зарегистрирован: 07.07.2013

ssss пишет:
В первую очередь нужно досконально знать как это всё работает, а не давать кучу глупых советов.

Вы сами с собой разговариваете? Про "кучу глупых советов" и где вы их нашли, даже не спрашиваю. Бестолку.

diger67
Offline
Зарегистрирован: 25.07.2015

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

ssss
Offline
Зарегистрирован: 01.07.2016

a5021 пишет:

Про "кучу глупых советов"

Убейся, дятел! )))))))))

ssss
Offline
Зарегистрирован: 01.07.2016

diger67 пишет:

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

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

diger67
Offline
Зарегистрирован: 25.07.2015

ssss пишет:

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

В данном проекте зти сигналы не фигурируют, а под капотом их до дури. лямбдо зонды, датчик оборотов, датчик детонаций итд. Помнитсяя гдето в начале этой темы меня освистали с гиганьем и улюлюканьем, профри БЛЯ.....

ssss
Offline
Зарегистрирован: 01.07.2016

diger67 пишет:

ssss пишет:

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

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

Дык, даже если обратная связь существует, доступна ли она в прямом виде? Нужна ли ещё обратная связь на уже существующую обратную связь? Можно ли выделить существующую обратную связь на основе существующего сигнала? Если приходящие импульсы уже являются результатом этой обратной связи и нужно просто расширить импульс, то о какой обратной связи мы ещё ведём речь?

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

Ещё одну нормальную тему можно хоронить. И когда уж этого мудака забанят? Ну ни одного вопроса нормально обсудить нельзя.

ssss
Offline
Зарегистрирован: 01.07.2016

 

"Гильотина - лучшее средство от вашей головной боли!"(с).

Прахвэссар, у вас есть что сказать или просто выползли из норки своё лицо показать? )))))))

Ну-ка, вставьте своё умное слово! ("А в ответ - тишина!"(с))

diger67
Offline
Зарегистрирован: 25.07.2015

ssss пишет:

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

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

Yer
Offline
Зарегистрирован: 12.02.2016

гбо-4 поколение stag не использует сигнал оборотов.он расширяет или уменшает приходяший импульс ничего не надо гадать и спорит 

ssss
Offline
Зарегистрирован: 01.07.2016

diger67 пишет:

ssss пишет:

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

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

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

diger67
Offline
Зарегистрирован: 25.07.2015

ssss пишет:

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

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

a5021
Offline
Зарегистрирован: 07.07.2013

Yer пишет:
гбо-4 поколение stag не использует сигнал оборотов.он расширяет или уменшает приходяший импульс ничего не надо гадать и спорит

Вон, что они -- владельцы ГБО-4 -- пишут:

Время впрыска бензина на ХХ 3 мс, на максимальной нагрузке 17-18 мс. Время газового впрыска на ХХ получилось 3,5 мс. По достижении нагрузки 70% (разряжение 0,7 атмосферы) время газового впрыска равняется времени бензинового впрыска, на нагрузке выше 70% время газового впрыска становится меньше бензинового впрыска.

Получается, что у него изначально 3мс + "добавка" в размере 1/6. Размер добавки уменьшается по мере роста нагрузки и на 70% становится равной 0, а дальше  отрицательной. По такой логике "уширение" должно быть не множителем к продлолжительности исходного импульса, а некой функцией от него.

Yer
Offline
Зарегистрирован: 12.02.2016

Меньше чем 5мс не подают на газовые форсунки так как не успеют полностю открытся исключение только hana форсункам можно подавать до 2мс

Yer
Offline
Зарегистрирован: 12.02.2016

Как при росте нагрузки может уменшатся импульс газа так как КПД меньше по сравнению бензина.если получится завтра проверю на осцилограмме stag как работает на разных оборотах

a5021
Offline
Зарегистрирован: 07.07.2013

Я посчитал вашу картинку (осциллограму) и там получается довольно странная вещь:

по синему графику при частоте 15,773 Гц (период 63,4 мс) и коэфф. заполнения 81,3%, длительность управляющего импульса составляет 11,85 миллисекунд. Если импульсы по всем каналам одинаковые, то уложится в 63,4мс они могут только с перекрытием друг друга на  (11,85 * 6 - 63,4) / 6 = 1,3мс. Импульс по следующему каналу приходит за 1.3мс до окончания импульса по текущему каналу.

Если импульсы могут перекрываться, тогда требуется совершенно иной функционал скетча и, соответственно, другой алгоритм.

diger67
Offline
Зарегистрирован: 25.07.2015

a5021 пишет:

Я посчитал вашу картинку (осциллограму) и там получается довольно странная вещь:

по синему графику при частоте 15,773 Гц (период 63,4 мс) и коэфф. заполнения 81,3%, длительность управляющего импульса составляет 11,85 миллисекунд. Если импульсы по всем каналам одинаковые, то уложится в 63,4мс они могут только с перекрытием друг друга на  (11,85 * 6 - 63,4) / 6 = 1,3мс. Импульс по следующему каналу приходит за 1.3мс до окончания импульса по текущему каналу.

Если импульсы могут перекрываться, тогда требуется совершенно иной функционал скетча и, соответственно, другой алгоритм.

А для вас это открытие что впрыск идет с небольшим наложением друг на друга.

a5021
Offline
Зарегистрирован: 07.07.2013

Вы еще не устали тыкать пальцем в небо?

diger67
Offline
Зарегистрирован: 25.07.2015

a5021 пишет:

Вы еще не устали тыкать пальцем в небо?

Судя по твоим постам ты сначала пишешь что думаешь. а потом спохватившись лезишь в википедию и читаешь как есть на самом деле. Так что пальце в носу ковыряешь ты.

a5021
Offline
Зарегистрирован: 07.07.2013

Я правильно понимаю, что вам совершенно все равно о чем галлюцинировать?

Yer
Offline
Зарегистрирован: 12.02.2016

Я переделал скетч так как тот который вы написали имел недостаток если один канал входа будет в обрыве то ардуино ничего не выдаст на выходе.Может даже через чур простой но работает теперь мне нужно каждый каналы выхода сделать задержку.Пока не получается нужно обойтис без delay() может по советуйте.Заранее спасибо

void setup() {  
 DDRB |=(1<<PB0)|(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB4)|(1<<PB5);
}
uint32_t p_start;
void loop() {
  if(PIND & (1<<PD2))//2-vhod
  {
  PORTB &=~(1<<PB0);//8-vihod
  }    
  else 
   PORTB |=(1<<PB0);
 if(PIND & (1<<PD3))//3-vhod
 {
  PORTB &=~(1<<PB1); //9-vihod 
 }
 else 
 PORTB |=(1<<PB1);
 if (PIND & (1<<PD4))//4-vhod
 {PORTB &=~(1<<PB2);//10-vihod
}
else 
PORTB |=(1<<PB2);
if(PIND & (1<<PD5))//5-vhod
{PORTB &=~(1<<PB3);//11-vihod
}
else 
PORTB |=(1<<PB3);
if(PIND & (1<<PD6))//6-vhod
{PORTB &=~(1<<PB4);//12-vihod
}
else 
PORTB |=(1<<PB4);
if(PIND & (1<<PD7))//7-vhod
{PORTB &=~(1<<PB5);//13-vihod
}
else 
PORTB |=(1<<PB5);
}

 

a5021
Offline
Зарегистрирован: 07.07.2013

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

diger67
Offline
Зарегистрирован: 25.07.2015

Yer пишет:

Я переделал скетч так как тот который вы написали имел недостаток если один канал входа будет в обрыве то ардуино ничего не выдаст на выходе.Может даже через чур простой но работает теперь мне нужно каждый каналы выхода сделать задержку.Пока не получается нужно обойтис без delay() может по советуйте.Заранее спасибо.

Интересно, а в вашем алгоритме из чего следует, что при отсутствии сигнала на одном из входов на привязаном к нему выходе будет формироваться импульс?

Писалось не единожды, только аппаратное решение, используйте таймер в режиме сравнения. Можно конечно попробовать milles(). Но это сработает только на низких оборотах. На высоких может не успевать.  И еще вопрос, для вас так принципиально сделать модуль управления впрыском на arduino(на микроконтроллере)? Чем вас неустраивает схема на 555?

Yer
Offline
Зарегистрирован: 12.02.2016

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

diger67
Offline
Зарегистрирован: 25.07.2015

Yer пишет:

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

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

a5021
Offline
Зарегистрирован: 07.07.2013

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

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

Yer пишет:
Пока не получается нужно обойтис без delay() может по советуйте

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

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

/* Main.ino file generated by New Project wizard
 *
 * Processor: ATmega328P
 * Compiler:  Arduino AVR
 */

#define IN_1_PIN	2
#define IN_2_PIN	3
#define IN_3_PIN	4
#define IN_4_PIN	5
#define IN_5_PIN	6
#define IN_6_PIN	7

#define OUT_1_PIN	8
#define OUT_2_PIN	9
#define OUT_3_PIN	10
#define OUT_4_PIN	11
#define OUT_5_PIN	12
#define OUT_6_PIN	13

void setup() {
      // инициализируем выходы
  for (int i = OUT_1_PIN; i < OUT_6_PIN + 1; i++) {
    digitalWrite(i, LOW);
    pinMode(i, OUTPUT);
  }
      // инициализируем входы
  for (int i = IN_1_PIN; i < IN_6_PIN + 1; i++) {
    pinMode(i, INPUT);
  }
}

// p_mul -- массив индивидуальных значений для каждого канала
// сколько длительности добавить к входному мпульсу 
//значения в процентах 33.3%, 66.6%, 99.9% 133.3% и т.п.
uint16_t p_mul[6] = {333, 333, 333, 333, 333, 333};
static uint32_t pulse[6];
uint8_t prev_in_state = 0xFF;

void loop(){

  while (1) {
    uint8_t in_state = PIND;              // фиксируем состояние всех 6-х входов
    uint32_t currMicros =  micros();      // запоминаем текущее время
  
    uint8_t currBit = 2;                  // бит вх. порта, минус один
    for (int i = 0; i < 6; i++) {         // сканируем все каналы
      currBit <<= 1;                      // бит влево к тек. каналу
      if ((in_state & currBit) != currBit) { // если на канале низкий уровень
        if ((prev_in_state & currBit) == currBit) { // если в прошлый раз был высокий
          pulse[i] = currMicros;          // фиксируем начало импульса по каналу     
          PORTB |= (1 << i);              // ставим высокий уровень на соотв. выходе
        } 
      } else if ((prev_in_state & currBit) != currBit) { // вх. импульс закончился ?
        // вычисляем, при каком знач.счетчика micros надо гасить соотв. выход
        pulse[i] = ((currMicros - pulse[i]) * p_mul[i] / 1000) + currMicros;
      } else if (currMicros >= pulse[i]) { // не надо ли гасить выход?
        PORTB &= ~(1 << i);   // гасим выход
      }
    }
    prev_in_state = in_state; // сохраняем текущее состояние входов
  }
}

В качестве начальных условий считаем максимальную оборотистость двигателя равной 5500 об/мин. Распредвал вращается в два раза медленне коленчатого вала, стало быть на нем обороты будут 2750 об/мин. или 45,83 об/сек. Отсюда период вращения составляет 1/45,83 = 21,8мс. Так как цилиндров шесть, то импульсы на форсунки при таких оборотах будут следовать через 21,8/6 = 3,6мс. Длительность входного импульса примем за 15мс, а уширение на 1/3.

Моделирование в протеусе показывает, что даже 8мгц ардуино справляется с поставленной задачей. Протеусу, разумеется верить можно не всегда, но в качестве прикидочного подхода он годится. Вот такую картинку он рисует в логическом анализаторе (диаграммы А0-А5 -- это входы, А6-А11 -- выходы):

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

Yer
Offline
Зарегистрирован: 12.02.2016

Большое спасибо за скетч все отлично работает.Вы импульсы увеличиваете в процентных соотношениях при резко нажатии на педаль газа импульс ECU становится где то 15мс тогда в процентных соотношениях у нас на газ поступает уже больше 20мс что приводит к перерасходу газа.В холостом ходу когда у нас импульс ECU 3мс на газ должно поступат 5мс.Увеличение должно быть все лишь на 2-2,5мс, во всех режимах двигателя.Если такое возможно сделать буду признателень с уважением Yer

   

a5021
Offline
Зарегистрирован: 07.07.2013

Сколько времени импульс должен продолжаться на выходе, после того, как входящий импульс уже прекратился, задается в строке №56 вышеприведенного скетча. Если нужно, чтобы независимо ни от чего ширина импульса просто увеличивалась на какую-то фиксированную величину, то строка 56 должна выглядеть как-то так:

pulse[i] = (currMicros - pulse[i]) + PULSE_EXT + currMicros;

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

pulse[i] = (currMicros - pulse[i]) + 2200 + currMicros;

"расширит" импульс на 2,2 миллисекунды.

В таком виде длительность импульсов увеличивается на одну и ту же величину для всех каналов. Если "добавка" должна быть для каждого канала индивидуальной, то можно использовать "освободившийся" массив p_mul, хотя лучше бы его назвать теперь по другому, чтобы не путал. Строка № 36 может приобрести такой вид:

uint16_t p_ext[6] = {2200, 2200, 2200, 2100, 2300, 2500};

а строка № 56 такой:

pulse[i] = (currMicros - pulse[i]) + p_ext[i] + currMicros;

 

 

Yer
Offline
Зарегистрирован: 12.02.2016

Большое спасибо завтра попробую загрузит и проверит