Коррекция смеси по МАП сенсору ГБО

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

Здравствуйте всем, написали скетч для для управления двигателя мерседес w210 104 мотором газовой форсунок.Все отлично работает,теперь хочу подключит МАП(датчик разрежения) сенсор для более точной коррекции газового впрыска.Проверка впрыска с начала проводилась когда еду на бензине при 1500 оборотах скорость составляла 50км/час время впрыска бензина 4,5-5мс МАП сенсор показывал 40кПа,после проехал на газу на тех же оборотах и скоросте время впрыска увеличилась на 6,5-7мс а МАП показал 60кПа. Это показывает что смесь обедняется при нагрузке на двигатель. Теперь нужно написать скетч чтобы с начала можно было бы запомнит время впрыска по разрежению на бензина и когда переключаешь на газ эту разницу добавлял.

_mikka
Offline
Зарегистрирован: 01.11.2015

Привет, а вы не хотелибы привести свои наработки ? Тогда может быть у кого нибудь и идеи возникнут ?

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

#include <EEPROM.h>

#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
#define OUT_1_PORT  PORTB0
#define OUT_2_PORT  PORTB1
#define OUT_3_PORT  PORTB2
#define OUT_4_PORT  PORTB3
#define OUT_5_PORT  PORTB4
#define OUT_6_PORT  PORTB5

void setup() {

// инициализируем входы
  for (int i = IN_1_PIN; i < IN_6_PIN + 1; i++) {
    pinMode(i, INPUT);
  }
      // инициализируем выходы
  for (int i = OUT_1_PIN; i < OUT_6_PIN + 1; i++) {
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
  }
}
  // p_ext -- знач. в мкс. доб. времени для каждого канала
uint16_t p_ext[6] = {1800, 1800, 1800, 1800, 1800, 1800};
static uint32_t pulse[6];
uint8_t prev_in_state = 0xFF;

void loop() {
  int temp=analogRead(A1);
  if(temp>940){
  PORTC |=(1<<PC2);//включит реле на форсунки и на газ клапан
  while (1) {
  uint8_t in_state = PIND;              // фиксируем состояние всех 6-х входов
  uint8_t currBit = 2;                  // бит вх. порта, минус один
  for (int i = 0; i < 6; i++) {         // сканируем все каналы
  currBit <<= 1;                      // бит влево к тек. каналу
  if ((in_state & currBit) != currBit) { // если на канале низкий уровень
  if ((prev_in_state & currBit) == currBit) { // если в прошлый раз был высокий    
  PORTB |= (1 << i);              // ставим высокий уровень на соотв. выходе
   }
  }
  else if ((prev_in_state & currBit) != currBit) { // вх. импульс закончился ?
        // вычисляем, при каком знач.счетчика micros надо гасить соотв. выход
  pulse[i] = p_ext[i] + micros();
 }
 else if ((signed long int)(pulse[i] - micros()) <= 0) { // не надо ли гасить выход?
  PORTB &= ~(1 << i);   // гасим выход
      }
    }
  prev_in_state = in_state; // сохраняем текущее состояние входов
  }
  }
else 
{ PORTC &=~(1<<PC2);PORTB=0x00;
  }
  
}

 

_mikka
Offline
Зарегистрирован: 01.11.2015

А хотябы блочную схему того, чем управляете ?

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

Как видно в скетче импульс пришел включаем соответсвуюший выход и добавляем задержку p_ext 1800 это у нас 1,8мс. Но это добавка к выходу не хватает когда идет нагрузка на двигатель. МАП сенсор работает как потонциометр средней ноги идет сигнал соответсвуюшей разрежение в коллекторе. При холостом ходу разрежение составляет 40кПА это у нас 1,55Вольт идет средней ноги, когда идет нагрузка разрежение увличивается. Теперь можно подать на ардуино  вход А1 сигнал с МАП сенора (1,5Вольт это 40кПА - 4,5Вольт 100кПА) так мы можем определить какая нагрузка идет на двигатель. Чтобы определить на газу какая нагрузка идет на двигатель с начала  проехал на бензине и проехал на газу сравнил.   

_mikka
Offline
Зарегистрирован: 01.11.2015

Ага, понять принцип всей схемы сложно...

1. Я правильно понял, что от длительности открытия форсунок и от оборотов двигателя зависит давление во впускном коллекторе, которое показывает МАП сенсор ?

2. Т.е. чем больше давление, тем дольше должны быть открыты форсунки, но не выходить за рамки определенных пределов?

3. Как должно меняться вермя открытия в зависимости от давления ? Закон или табличка ?

п.с. Как я это пинимаю )))

 

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

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

_mikka
Offline
Зарегистрирован: 01.11.2015

А давление в коллекторе показывает у нас МАП сенсор ?

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

 

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

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

Yer
Offline
Зарегистрирован: 12.02.2016
long p_dobavka;
int MAP;
void setup() {
 
}

void loop() {
 if(1.55<MAP>0.85)//если МАП больше 0,85 бар и меньше 1,55 бар
{
  p_dobavka=2.5;//2.5 милисекунд
}
else 
p_dobavka=0;
}

Может так он заработает 

_mikka
Offline
Зарегистрирован: 01.11.2015

Yer пишет:

long p_dobavka;
int MAP;
void setup() {
 
}

void loop() {
 if(1.55<MAP>0.85)//если МАП больше 0,85 бар и меньше 1,55 бар
{
  p_dobavka=2.5;//2.5 милисекунд
}
else 
p_dobavka=0;
}

Может так он заработает 

Очень интересно, может расскажите подробней о Ваших изысканиях ?