American English British English Български Čeština Français Deutsch (Du) Magyar Italiano 日本語 Lietuvių Polski Српски Slovenčina Español (Tú) Türkçe Українська
Select language:

Алгоритм управления РХХ (клапан добавочного воздуха)

<<

AlxSh

User avatar

Posts: 92

Joined: 14 Jul 2014, 12:52

Location: Ивановская область, Кинешма

Your CAR: 2141 1.7

SECU version: DIY SECU-3


Has thanked: 2 times
Been thanked: 24 times

Post 29 Jan 2017, 19:09

Re: Алгоритм управления РХХ (клапан добавочного воздуха)

STC wrote:С удовольствием выслушаю ваши мысли и пожелания по поводу алгоритма.


У меня сейчас сделано так:
  Code:
void idlreg_iac(ecudata_t *d){
  static int16_t iac_pos = 0;
  static uint8_t cntr = 0, state = 0;
  int32_t new_pos = d->iac_pos;

  if (d->engine_mode == EM_START){
    state = 0;
  }

  switch (state){
  case 0:
    new_pos = static_iac_pos_lookup(d, &idlreg.prev_temp, 0);
    if (d->engine_mode != EM_START){
      cntr = 0;
      idlreg.active = 0;
      state = (d->params.idlreg.use_pi) ? 2 : 1;
    }
    break;
  case 1:
    if (++cntr < d->params.cranktorun_time){
      int32_t crank_pos = static_iac_pos_lookup(d, &idlreg.prev_temp, 0);
      int32_t run_pos = static_iac_pos_lookup(d, &idlreg.prev_temp, 1);
      new_pos = crank_pos + ((run_pos-crank_pos) * cntr) / d->params.cranktorun_time;
      break;
    }
    else state = 3;
  case 2:
    if ((d->sens.cool_temp >= d->params.idlreg.temp_cold_start) || (d->sens.frequen >= idlreg.rpm))
      state = 3;
  case 3:
    if (!d->params.idlreg.use_pi){
      new_pos = static_iac_pos_lookup(d, &idlreg.prev_temp, 1);
    }
    else {
      idle_rpm(d);
      // Вход в режим регулирования
      if (!idlreg.active && (d->engine_mode == EM_IDLE) && (d->sens.inst_frq < idlreg.jfrxx1)){
        iac_pos = d->iac_pos * 64;
        idlreg.active = 1;
      }
      // Выход из режима регулирования
      else if (idlreg.active && ((d->engine_mode != EM_IDLE) || (d->sens.inst_frq >= idlreg.jfrxx2))){
        new_pos += d->params.idlreg.iac_idle_to_run_add;
        idlreg.active = 0;
      }
      if (idlreg.active){
        int32_t tmfr = idle_tmfr(d);
        int32_t error = (int32_t)idlreg.rpm - d->sens.frequen;
        int32_t derror = error - idlreg.prev_rpm_error;
        // Если температура ниже температуры холодного пуска и обороты не достигли, не используем интегральную часть
        if (state == 2){
          if ((error > 0) && (derror > 0)){ // Работает только если ошибки положительные
            iac_pos += (tmfr * derror * d->params.idlreg.kfr) / 256 / 64;
          }
        }
        else { // Нормальный режим работы
          iac_pos += (tmfr * (derror * d->params.idlreg.kfr + error * d->params.idlreg.kfri)) / 256 / 64;
        }
        idlreg.prev_rpm_error = error;
        iac_pos = restrict_value(iac_pos, 0, d->params.idlreg.steps*64);
        new_pos = iac_pos / 64;
      }
    }
    break;
  }
  d->iac_pos = restrict_value(new_pos, 0, d->params.idlreg.steps);
}


Оставлена возможность работать жестко по таблицам. Как только перешел на ПИ-регулирование, на статическое положение больше не возвращался.
Алгоритм из help'а от CTP.
Там много чего интересного есть!
Москвич 2141 УЗАМ 1.7л. Платформа STM32F103RET6. Идеи secu-3. Peak&Hold. Автоматическое вычисление первого цилиндра. Фазированный впрыск.
<<

STC

User avatar

Posts: 6557

Joined: 30 Apr 2013, 23:41

Location: Ukraine

Your CAR: AZLK 2140

SECU version: DIY SECU-3


Has thanked: 804 times
Been thanked: 1321 times

Post 29 Jan 2017, 20:56

Re: Алгоритм управления РХХ (клапан добавочного воздуха)

AlxSh, спасибо. Можешь сюда этот кусок хелпа скинуть?
Author of the SECU-3™ project http://SECU-3.org. An open source engine control unit / Ignition control system, (C) 2007.
Клуб проекта в Facebook https://www.facebook.com/groups/secu3club
Клуб проекта ВКонтакте https://vk.com/secu3club (вступаем!)
<<

darxfame

User avatar

Posts: 859

Joined: 10 Jul 2015, 19:12

Location: Москва

Your CAR: ИЖ 2126 УМПО 1,7

SECU version: official SECU-3T


Has thanked: 118 times
Been thanked: 125 times

Post 29 Jan 2017, 21:45

Re: Алгоритм управления РХХ (клапан добавочного воздуха)

AlxSh wrote:
STC wrote:С удовольствием выслушаю ваши мысли и пожелания по поводу алгоритма.


У меня сейчас сделано так:
  Code:
void idlreg_iac(ecudata_t *d){
  static int16_t iac_pos = 0;
  static uint8_t cntr = 0, state = 0;
  int32_t new_pos = d->iac_pos;

  if (d->engine_mode == EM_START){
    state = 0;
  }

  switch (state){
  case 0:
    new_pos = static_iac_pos_lookup(d, &idlreg.prev_temp, 0);
    if (d->engine_mode != EM_START){
      cntr = 0;
      idlreg.active = 0;
      state = (d->params.idlreg.use_pi) ? 2 : 1;
    }
    break;
  case 1:
    if (++cntr < d->params.cranktorun_time){
      int32_t crank_pos = static_iac_pos_lookup(d, &idlreg.prev_temp, 0);
      int32_t run_pos = static_iac_pos_lookup(d, &idlreg.prev_temp, 1);
      new_pos = crank_pos + ((run_pos-crank_pos) * cntr) / d->params.cranktorun_time;
      break;
    }
    else state = 3;
  case 2:
    if ((d->sens.cool_temp >= d->params.idlreg.temp_cold_start) || (d->sens.frequen >= idlreg.rpm))
      state = 3;
  case 3:
    if (!d->params.idlreg.use_pi){
      new_pos = static_iac_pos_lookup(d, &idlreg.prev_temp, 1);
    }
    else {
      idle_rpm(d);
      // Вход в режим регулирования
      if (!idlreg.active && (d->engine_mode == EM_IDLE) && (d->sens.inst_frq < idlreg.jfrxx1)){
        iac_pos = d->iac_pos * 64;
        idlreg.active = 1;
      }
      // Выход из режима регулирования
      else if (idlreg.active && ((d->engine_mode != EM_IDLE) || (d->sens.inst_frq >= idlreg.jfrxx2))){
        new_pos += d->params.idlreg.iac_idle_to_run_add;
        idlreg.active = 0;
      }
      if (idlreg.active){
        int32_t tmfr = idle_tmfr(d);
        int32_t error = (int32_t)idlreg.rpm - d->sens.frequen;
        int32_t derror = error - idlreg.prev_rpm_error;
        // Если температура ниже температуры холодного пуска и обороты не достигли, не используем интегральную часть
        if (state == 2){
          if ((error > 0) && (derror > 0)){ // Работает только если ошибки положительные
            iac_pos += (tmfr * derror * d->params.idlreg.kfr) / 256 / 64;
          }
        }
        else { // Нормальный режим работы
          iac_pos += (tmfr * (derror * d->params.idlreg.kfr + error * d->params.idlreg.kfri)) / 256 / 64;
        }
        idlreg.prev_rpm_error = error;
        iac_pos = restrict_value(iac_pos, 0, d->params.idlreg.steps*64);
        new_pos = iac_pos / 64;
      }
    }
    break;
  }
  d->iac_pos = restrict_value(new_pos, 0, d->params.idlreg.steps);
}


Оставлена возможность работать жестко по таблицам. Как только перешел на ПИ-регулирование, на статическое положение больше не возвращался.
Алгоритм из help'а от CTP.
Там много чего интересного есть!

Это у тебя на секу? А потестить можно?

Отправлено с моего PRO 6 через Tapatalk
VETune - Тюнер таблиц VE - http://secu-3.org/forum/viewtopic.php?f=9&t=753
S3Emul - Secu3/MS Bridge(онлайн откатка VE) - http://secu-3.org/forum/viewtopic.php?f=9&t=1089
ИЖ 2126 Ода, УМПО 3317, Secu-3T M644, Моновпрыск C16NZ
<<

AlxSh

User avatar

Posts: 92

Joined: 14 Jul 2014, 12:52

Location: Ивановская область, Кинешма

Your CAR: 2141 1.7

SECU version: DIY SECU-3


Has thanked: 2 times
Been thanked: 24 times

Post 30 Jan 2017, 09:03

Re: Алгоритм управления РХХ (клапан добавочного воздуха)

darxfame wrote:
AlxSh wrote:
STC wrote:С удовольствием выслушаю ваши мысли и пожелания по поводу алгоритма.


У меня сейчас сделано так:
  Code:
void idlreg_iac(ecudata_t *d){
  static int16_t iac_pos = 0;
  ...
}


Оставлена возможность работать жестко по таблицам. Как только перешел на ПИ-регулирование, на статическое положение больше не возвращался.
Алгоритм из help'а от CTP.
Там много чего интересного есть!

Это у тебя на секу? А потестить можно?

От секу только часть кода. У меня железо на stm32f103.
Москвич 2141 УЗАМ 1.7л. Платформа STM32F103RET6. Идеи secu-3. Peak&Hold. Автоматическое вычисление первого цилиндра. Фазированный впрыск.
<<

STC

User avatar

Posts: 6557

Joined: 30 Apr 2013, 23:41

Location: Ukraine

Your CAR: AZLK 2140

SECU version: DIY SECU-3


Has thanked: 804 times
Been thanked: 1321 times

Post 31 Jan 2017, 01:06

Re: Алгоритм управления РХХ (клапан добавочного воздуха)

AlzSh, а что дает вызов функций idle_rpm(d) и idle_tmfr(d) в твоем коде?
Author of the SECU-3™ project http://SECU-3.org. An open source engine control unit / Ignition control system, (C) 2007.
Клуб проекта в Facebook https://www.facebook.com/groups/secu3club
Клуб проекта ВКонтакте https://vk.com/secu3club (вступаем!)
<<

AlxSh

User avatar

Posts: 92

Joined: 14 Jul 2014, 12:52

Location: Ивановская область, Кинешма

Your CAR: 2141 1.7

SECU version: DIY SECU-3


Has thanked: 2 times
Been thanked: 24 times

Post 02 Feb 2017, 12:56

Re: Алгоритм управления РХХ (клапан добавочного воздуха)

STC wrote:AlzSh, а что дает вызов функций idle_rpm(d) и idle_tmfr(d) в твоем коде?

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

  Code:
void idle_rpm(ecudata_t *d){
  int32_t i, i1, t = d->sens.cool_temp;
  if (t < TEMPERATURE_MAGNITUDE(-30)) t = TEMPERATURE_MAGNITUDE(-30);
  i = (t - TEMPERATURE_MAGNITUDE(-30)) / TEMPERATURE_MAGNITUDE(10);

  if (i >= INJ_IDLE_RPM_LOOKUP_TABLE_SIZE-1) i = i1 = INJ_IDLE_RPM_LOOKUP_TABLE_SIZE-1;
  else i1 = i + 1;

  uint32_t rpm = simple_interpolation(t, efi.ttbl.inj_idle_rpm[i],
                                      efi.ttbl.inj_idle_rpm[i1],
                                      (i * TEMPERATURE_MAGNITUDE(10)) + TEMPERATURE_MAGNITUDE(-30),
                                      TEMPERATURE_MAGNITUDE(10), 16)>>4;

  if (((d->errors & ERROR_SPEED) == 0) && (d->sens.speed >= 3))
    rpm += d->params.idlreg.add_rpm_on_go;

  idlreg.rpm = rpm;

  // Вычисляем пороги режимных переходов
  idlreg.jfrxx1 = idlreg.rpm + (((uint32_t)idlreg.rpm * d->params.idlreg.kmm1)>>8);
  idlreg.jfrxx2 = idlreg.jfrxx1 + (((uint32_t)idlreg.jfrxx1 * d->params.idlreg.kmm2)>>8);
}

uint16_t idle_tmfr(ecudata_t *d){
  int32_t  gradient, charge, rpm = d->sens.inst_frq, l;
  int32_t f, fp1, lp1;

  //calculate lookup table indexes.
  charge = (int32_t)d->sens.map - d->params.map.lower_pressure;
  if (charge < 0) charge = 0;
  if (charge > d->params.map.upper_pressure) charge = d->params.map.upper_pressure;

  gradient = (d->params.map.upper_pressure - d->params.map.lower_pressure) / (INJ_IDLE_TMFR_LOOKUP_TABLE_SIZE-1);
  if (gradient < 1)
    gradient = 1;
  l = (charge / gradient);

  if (l >= (INJ_RPM_LOOKUP_TABLE_SIZE - 1))
    lp1 = l = INJ_RPM_LOOKUP_TABLE_SIZE - 1;
  else
    lp1 = l + 1;

  for(f = RPM_GRID_SIZE-2; f >= 0; f--)
    if (rpm >= efi.ttbl.rpm_grid_points[f]) break;

  if (f < 0){ f = 0; rpm = efi.ttbl.rpm_grid_points[0]; }
  fp1 = f + 1;

  return bilinear_interpolation(rpm, charge,
                                efi.ttbl.inj_idle_tmfr[l][f],
                                efi.ttbl.inj_idle_tmfr[lp1][f],
                                efi.ttbl.inj_idle_tmfr[lp1][fp1],
                                efi.ttbl.inj_idle_tmfr[l][fp1],
                                efi.ttbl.rpm_grid_points[f],
                                (gradient * l),
                                efi.rpm_grid_sizes[f],
                                gradient)>>4;
}

Москвич 2141 УЗАМ 1.7л. Платформа STM32F103RET6. Идеи secu-3. Peak&Hold. Автоматическое вычисление первого цилиндра. Фазированный впрыск.
<<

STC

User avatar

Posts: 6557

Joined: 30 Apr 2013, 23:41

Location: Ukraine

Your CAR: AZLK 2140

SECU version: DIY SECU-3


Has thanked: 804 times
Been thanked: 1321 times

Post 02 Feb 2017, 13:06

Re: Алгоритм управления РХХ (клапан добавочного воздуха)

Спасибо.
Понятно, ты сделал как в Январе. Таблица жесткости регулятора у тебя в виде чаши? Она видимо у всех одинаковая, думаю, что можно обойтись без этой таблицы, а значение просто вычислять или не выносить эту таблицу в менеджер для редактирования(оставить в коде прошивки).
kmm1, kmm2 просто кэффициенты для привязки к оборотам ХХ из таблицы?
Author of the SECU-3™ project http://SECU-3.org. An open source engine control unit / Ignition control system, (C) 2007.
Клуб проекта в Facebook https://www.facebook.com/groups/secu3club
Клуб проекта ВКонтакте https://vk.com/secu3club (вступаем!)
<<

AlxSh

User avatar

Posts: 92

Joined: 14 Jul 2014, 12:52

Location: Ивановская область, Кинешма

Your CAR: 2141 1.7

SECU version: DIY SECU-3


Has thanked: 2 times
Been thanked: 24 times

Post 02 Feb 2017, 21:35

Re: Алгоритм управления РХХ (клапан добавочного воздуха)

STC wrote:Спасибо.
Понятно, ты сделал как в Январе. Таблица жесткости регулятора у тебя в виде чаши? Она видимо у всех одинаковая, думаю, что можно обойтись без этой таблицы, а значение просто вычислять или не выносить эту таблицу в менеджер для редактирования(оставить в коде прошивки).
kmm1, kmm2 просто кэффициенты для привязки к оборотам ХХ из таблицы?


Да. Таблица жесткости в виде чаши. Не совсем понял ее смысл при не номинальной температуре. В этом случае обороты ХХ не соответстсвуют положению впадины. Скорее, она должна быть нормированной относительно текущих оборотов ХХ.

JFRXX1 = JUFRXX + KMM1 * JUFRXX
JFRXX2 = JFRXX1 + KMM2 * JFRXX1

JUFRXX - Желаемые оборота ХХ, выбранные из таблицы.
JFRXX1 - порог оборотов первого переходного режима.
JFRXX2 - порог оборотов второго переходного режима.
KMM1 - Коэффициент начала первого переходного режима
KMM2 - Коэффициент начала второго переходного режима

В данный момент kmm1 = 0.5, kmm2 = 0.25
Москвич 2141 УЗАМ 1.7л. Платформа STM32F103RET6. Идеи secu-3. Peak&Hold. Автоматическое вычисление первого цилиндра. Фазированный впрыск.
<<

STC

User avatar

Posts: 6557

Joined: 30 Apr 2013, 23:41

Location: Ukraine

Your CAR: AZLK 2140

SECU version: DIY SECU-3


Has thanked: 804 times
Been thanked: 1321 times

Post 04 Feb 2017, 22:26

Re: Алгоритм управления РХХ (клапан добавочного воздуха)

Да. Таблица жесткости в виде чаши. Не совсем понял ее смысл при не номинальной температуре. В этом случае обороты ХХ не соответстсвуют положению впадины. Скорее, она должна быть нормированной относительно текущих оборотов ХХ.

Я хочу попробовать сделать жесткость регулятора в виде S-функции (сигмоида). Задать ее одномерной таблицей из 16 значений. Эту функцию "закрутить" вокруг режимной точки (обороты, нагрузка) при помощи уравнения окружности.
Грубо говоря R = SQRT(обороты^2, нагрузка^2). R будет аргументом в таблице S-функции.
Author of the SECU-3™ project http://SECU-3.org. An open source engine control unit / Ignition control system, (C) 2007.
Клуб проекта в Facebook https://www.facebook.com/groups/secu3club
Клуб проекта ВКонтакте https://vk.com/secu3club (вступаем!)
<<

darxfame

User avatar

Posts: 859

Joined: 10 Jul 2015, 19:12

Location: Москва

Your CAR: ИЖ 2126 УМПО 1,7

SECU version: official SECU-3T


Has thanked: 118 times
Been thanked: 125 times

Post 05 Feb 2017, 00:26

Re: Алгоритм управления РХХ (клапан добавочного воздуха)

STC wrote:
Да. Таблица жесткости в виде чаши. Не совсем понял ее смысл при не номинальной температуре. В этом случае обороты ХХ не соответстсвуют положению впадины. Скорее, она должна быть нормированной относительно текущих оборотов ХХ.

Я хочу попробовать сделать жесткость регулятора в виде S-функции (сигмоида). Задать ее одномерной таблицей из 16 значений. Эту функцию "закрутить" вокруг режимной точки (обороты, нагрузка) при помощи уравнения окружности.
Грубо говоря R = SQRT(обороты^2, нагрузка^2). R будет аргументом в таблице S-функции.

Я конечно не спец, но чем плох алгоритм января? Ну я понимаю, надо что то свое сделать, но там уже откатанный алгоритм.. тут же придется поколупаться, ну и ты будешь всё это писать очень долго, а люди ждут решения, какого никакого. Может стоит пока например внедрить такой вариант, а в качестве теста разрабатывать свой и потом его применить в случае успеха? По крайней мере ничего плохого в алгоритме января я не вижу. Да и пора уже доработать менеджер для впрыска и алгоритм откатки ve, мой конечно рабочий но не особо хорош, так как нет градуировки УДК по напряжению, а центральную точку регулятор твой пролетает, как не настраивай мертвую зону. У меня всегда удк падает в 0,2-0,3 а это мало, это что то около 20 АФР

Отправлено с моего PRO 6 через Tapatalk
VETune - Тюнер таблиц VE - http://secu-3.org/forum/viewtopic.php?f=9&t=753
S3Emul - Secu3/MS Bridge(онлайн откатка VE) - http://secu-3.org/forum/viewtopic.php?f=9&t=1089
ИЖ 2126 Ода, УМПО 3317, Secu-3T M644, Моновпрыск C16NZ
PreviousNext

Return to Прошивки

Who is online

Users browsing this forum: No registered users and 1 guest

Powered by phpBB® Forum Software © phpBB Group.