Добавл. в прошивку возможностей одновременного/моно впрыска

Обсуждаем прошивки, алгоритмы работы в разных режимах (например, алгоритм работы автоподсоса).
Наборы тюнингованых прошивок МПСЗ SECU (заточенных под конкретную конфигурацию двигателя)
User avatar
wunder
Posts: 6406
Joined: 19 Mar 2015, 16:50
Your CAR: 1gr
SECU version: DIY SECU-3i TBZ
Has thanked: 145 times
Been thanked: 998 times
Contact:

Re: Добавл. в прошивку возможностей одновременного/моно впры

Post by wunder »

Faza_888 wrote:Маленький совет по настройке динамической производительности форсунок.

Для примера возьмем 4 цилиндровый двигатель, одновременный впрыск, 2 впрыска за цикл.

Прогреваем двигатель, настраиваем смесь на ХХ. Делаем лямбда контроль "медленным": шаг 0.25%, 50 тактов на шаг.

Смотрим на лямбда коррекцию, например она составляет +2%. Меняем количество впрысков за цикл с 2 на 4, при правильной настройке коррекция останется той же. Если ушла в +, например +15%, значит значение динамической производительности высокое, если в -, то низкое.

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

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

Напряжение бортовой сети меняем отключением / подключением генератора, нагрузок и т.д.
воо хоть один толковый момент!
Геннадий
Posts: 4
Joined: 23 Aug 2015, 13:55
Your CAR: FIAT UNO 1.0
SECU version: official SECU-3T
Has thanked: 8 times

Re: Добавл. в прошивку возможностей одновременного/моно впры

Post by Геннадий »

Добрый день кто знает или встречал где найти производительность форсунки 4850.
Attachments
.Форсунка — № 4850.jpg
Pavel Buyevich
Posts: 30
Joined: 30 Aug 2014, 09:56
Your CAR: I go on foot
SECU version: DIY SECU-3
Been thanked: 4 times
Contact:

Re: Добавл. в прошивку возможностей одновременного/моно впры

Post by Pavel Buyevich »

yuren wrote:
Pavel Buyevich wrote: Сможете реализовать на одном таймере? ;)
Пока не углубился в детали, думаю можно (даже фазированный (таймер ведь не занимается открытием форсунок, он отсчитывает время к их закрытию - процессы условно параллельные, смущает только то что несмотря не легкость решения на первый взгляд, Алексей не пошел по этому пути, короче говоря, нужно еще ресерчить, пока делаю макет в протеусе для того чтобы проверить свою версию решения проблемы))
AlxSh
Posts: 92
Joined: 14 Jul 2014, 12:52
Your CAR: 2141 1.7
SECU version: DIY SECU-3
Location: Ивановская область, Кинешма
Has thanked: 2 times
Been thanked: 25 times
Contact:

Re: Добавл. в прошивку возможностей одновременного/моно впры

Post by AlxSh »

Pavel Buyevich wrote:
yuren wrote:
Pavel Buyevich wrote: Сможете реализовать на одном таймере? ;)
Пока не углубился в детали, думаю можно (даже фазированный (таймер ведь не занимается открытием форсунок, он отсчитывает время к их закрытию - процессы условно параллельные, смущает только то что несмотря не легкость решения на первый взгляд, Алексей не пошел по этому пути, короче говоря, нужно еще ресерчить, пока делаю макет в протеусе для того чтобы проверить свою версию решения проблемы))
Режим Peek&Hold для управления низкоомными форсунками требует более сложного алгоритма управления. Нужно драйвер переключать из режима открытия форсунки в режим удержания ШИМом, а затем в режим быстрого спада тока. Для одной форсунки требуется две ноги управления и один генератор ШИМа на все каналы. У меня другая аппаратная платформа. Данный режим реализован для обычных форсунок и они холодные. Полноценное управление в данном режиме в текущем железе невозможно. Необходим второй контроллер, который будет заниматься этим вопросом.
Москвич 2141 УЗАМ 1.7л. Платформа STM32F103RET6. Идеи secu-3. Peak&Hold. Автоматическое вычисление первого цилиндра. Фазированный впрыск.
User avatar
wunder
Posts: 6406
Joined: 19 Mar 2015, 16:50
Your CAR: 1gr
SECU version: DIY SECU-3i TBZ
Has thanked: 145 times
Been thanked: 998 times
Contact:

Re: Добавл. в прошивку возможностей одновременного/моно впры

Post by wunder »

Вообщето шла речь о внутреннем таймере меги :lol: для организации фазированного впрыска , если чё 8-). К работе Peek&Hold драйвера это не относитцо ;)
AlxSh
Posts: 92
Joined: 14 Jul 2014, 12:52
Your CAR: 2141 1.7
SECU version: DIY SECU-3
Location: Ивановская область, Кинешма
Has thanked: 2 times
Been thanked: 25 times
Contact:

Re: Добавл. в прошивку возможностей одновременного/моно впры

Post by AlxSh »

wunder wrote:Вообщето шла речь о внутреннем таймере меги :lol: для организации фазированного впрыска , если чё 8-). К работе Peek&Hold драйвера это не относитцо ;)
До тех пор пока Peek&Hold не реализован на этом же таймере. Попытка написать планировщик не привела к желаемым результатам, особенно в момент когда меняется фаза впрыска. Слишком много событий, часть которых должна выдергиваться из очереди и ставиться заново в другое место не допуская пропуска в течении цикла.

Вот моя реализация фазированного впрыска без планировщика, может кому-то что-то не придется придумывать заново:

Code: Select all

#include "hardware.h"
#include "sysclk.h"
#include "ecu.h"
#include "ckps.h"
#include "injectors.h"
#include "magnitude.h"
#include "funconv.h"
#include "timer.h"
#include "debug.h"
#include "injhw.h"

/** Convert injection time to cogs */
#define INJ_TIME_TO_COG         ROUND(INJ_TIME_RESOLUTION/COG_TIME_RESOLUTION)

/** Время до первого впрыска с момента включения зажигания */
#define PP_TIME_TO_SQUIRT       (2*1000/20)

/** Внутренние переменные */
typedef struct {
  uint8_t pp_timer;                 //!< Таймер до первого впрыска
  uint8_t begin_cog[NUM_CYLINDERS]; //!< зуб начала впрыска для безопасного обновления фазы.
} inj_t;

/** Внутренние переменные */
static inj_t inj = {
  .pp_timer = 0,
};

void inj_cog(ecudata_t *d){
  uint32_t inj_mask, cyl_cntr;
  if (d->inj.first_pulse){
    d->inj.first_pulse = 0;
    uint32_t tmp = d->inj.squirt_time;

    d->inj.squirt_time = tmp / 4; //!< Однократно впрыскиваем 1/4 часть дозы при начале вращения КВ
    cyl_cntr = injhw_StartInjection(d, d->inj.on_mask);
#ifdef DEBUG_OUT
    dbg_printf(DBG_INJ, "INJ: PrimePulse:%.4X\n", d->inj.squirt_time);
#endif
    d->inj.fuel_cntr += d->inj.squirt_time * cyl_cntr;
    d->inj.squirt_time = tmp;
    return;
  }

  if (!d->inj.squirt_time) return;

  int32_t full_cog = (d->revolution % 2) ? d->cog + NUM_COGS : d->cog;

  for (uint32_t i=0; i<d->params.cilinder_num; i++){
    if (full_cog == d->cil[i].inj_begin_cog){
      switch (d->inj.mode){
      case INJ_MODE_SEQ:
        switch (i){
        case 0: inj_mask = INJ_OUT_CIL_1; break;
        case 1: inj_mask = INJ_OUT_CIL_3; break;
        case 2: inj_mask = INJ_OUT_CIL_4; break;
        case 3: inj_mask = INJ_OUT_CIL_2; break;
        }
        break;
      case INJ_MODE_DOUBLE:
        inj_mask = (i & 0x1) ? INJ_OUT_CIL_2|INJ_OUT_CIL_3 : INJ_OUT_CIL_1|INJ_OUT_CIL_4;
        break;
      default:
        inj_mask = INJ_OUT_CIL_ALL;
      }
      cyl_cntr = injhw_StartInjection(d, inj_mask);
      d->inj.fuel_cntr += d->inj.squirt_time * cyl_cntr;
    }
    // Обновляем фазу только ели это нужно
    if (d->cil[i].inj_begin_cog != inj.begin_cog[i]){
      int32_t begin_cog_old = d->cil[i].inj_begin_cog;
      int32_t begin_cog_new = inj.begin_cog[i];

      // Нормализация переходов через 0 зуб
      int32_t dc = begin_cog_old - begin_cog_new;
      if ((dc < 0 ? -dc : dc ) > NUM_COGS){
        if (dc < 0) begin_cog_old -= NUM_COGS * 2;
        else begin_cog_new -= NUM_COGS * 2;
      }

      // Обновляем фазу только если обновление пройдет без потерь впрыска
      if (full_cog >= begin_cog_old){
        if (full_cog > begin_cog_new) d->cil[i].inj_begin_cog = inj.begin_cog[i];
      }
      else{
        if (full_cog < begin_cog_new) d->cil[i].inj_begin_cog = inj.begin_cog[i];
      }
    }
  }
}

static void inj_phase_update(ecudata_t *d, uint32_t update_work){
  uint32_t i = d->precalc.rpm.tbl_idx;
  if (d->engine_mode == EM_START){
    d->inj.phase_cog = d->params.inj.start_phase;
  }
  else {
    d->inj.phase_cog = simple_interpolation(d->precalc.rpm.limited_rpm, efi.ttbl.inj_phase[i], efi.ttbl.inj_phase[i+1],
                                            efi.ttbl.rpm_grid_points[i], efi.rpm_grid_sizes[i], 16)>>4;
  }
  int32_t inj_time_cogs = (((uint32_t)d->inj.squirt_time + d->inj.lag_corr_time) * INJ_TIME_TO_COG) / d->cog_time;
  int32_t inj_begin_cog = (int32_t)d->inj.phase_cog - inj_time_cogs;
  while (inj_begin_cog < 0) inj_begin_cog += NUM_COGS * 2;
  for (uint32_t i=0; i < d->params.cilinder_num; i++){
    int32_t cog = (int32_t)d->cil[i].cog_pos + inj_begin_cog;
    while (cog >= NUM_COGS*2) cog -= NUM_COGS * 2;
    if (update_work) d->cil[i].inj_begin_cog = cog;
    else inj.begin_cog[i] = cog;
  }
}

void inj_phase(ecudata_t *d){
  inj_phase_update(d, 0);
}

void inj_Event20mS(void){
  ecudata_t *d = &edat;
  static uint8_t last_cog = 0;
  static uint16_t time = 0;

  if (d->engine_mode != EM_START)
    return;

  if (d->cog != last_cog){
    last_cog = d->cog;
    time = 0;
  }
  else if (!d->inj.first_pulse && (++time >= 25)){
    d->inj.first_pulse = 1;
  }

  if (inj.pp_timer && !--inj.pp_timer){
    uint32_t tmp = d->inj.squirt_time;
    d->inj.squirt_time = inj_prime_pulse(d);
    uint32_t cyl_cntr = injhw_StartInjection(d, d->inj.on_mask);
    d->inj.fuel_cntr += d->inj.squirt_time * cyl_cntr;
    d->inj.squirt_time = tmp;
  }
}

void inj_Init(void){
  inj.pp_timer = PP_TIME_TO_SQUIRT;
  inj_phase_update(&edat, 1);
  injhw_Init();
}

Москвич 2141 УЗАМ 1.7л. Платформа STM32F103RET6. Идеи secu-3. Peak&Hold. Автоматическое вычисление первого цилиндра. Фазированный впрыск.
User avatar
STC
Posts: 13843
Joined: 30 Apr 2013, 23:41
Your CAR: AZLK 2140
SECU version: DIY SECU-3
Location: North Korea
Has thanked: 2160 times
Been thanked: 4335 times
Contact:

Re: Добавл. в прошивку возможностей одновременного/моно впры

Post by STC »

Речь идет про обычное управление форсунками, не P&H. Но планировщик все равно скушает много ресурсов.
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 (вступаем!)
Pavel Buyevich
Posts: 30
Joined: 30 Aug 2014, 09:56
Your CAR: I go on foot
SECU version: DIY SECU-3
Been thanked: 4 times
Contact:

Re: Добавл. в прошивку возможностей одновременного/моно впры

Post by Pavel Buyevich »

AlxSh wrote: Режим Peek&Hold для управления низкоомными форсунками требует более сложного алгоритма управления. Нужно драйвер переключать из режима открытия форсунки в режим удержания ШИМом, а затем в режим быстрого спада тока. Для одной форсунки требуется две ноги управления и один генератор ШИМа на все каналы. У меня другая аппаратная платформа. Данный режим реализован для обычных форсунок и они холодные. Полноценное управление в данном режиме в текущем железе невозможно. Необходим второй контроллер, который будет заниматься этим вопросом.
Занимать эбу расчетами для p&h совершенно ни к чему, с этими задачами отлично справляются аппаратные драйввера, типа lm1949, или в крайнем случае своя реализиция подобного драйвера на той-же тиньке (которая даже выйдет дешевле), а поскольку для непосредственного управления форсунками всеравно нужна плата с силовыми ключами - развести ее для подобного драйвера не составляет никаких проблем.
Пока развиваю мысль в сторону того чтобы TIMER2_COMPB_vect дергался через фиксированные промежутки времени, на(грубый)пример каждые 1ms, и на каждом вызове декрементил счетчики времени открытого состояния (если > 0) для каждой форсунки (если достигли 0 - закарываем). Перспективно ли это направление?
User avatar
STC
Posts: 13843
Joined: 30 Apr 2013, 23:41
Your CAR: AZLK 2140
SECU version: DIY SECU-3
Location: North Korea
Has thanked: 2160 times
Been thanked: 4335 times
Contact:

Re: Добавл. в прошивку возможностей одновременного/моно впры

Post by STC »

Пока развиваю мысль в сторону того чтобы TIMER2_COMPB_vect дергался через фиксированные промежутки времени, на(грубый)пример каждые 1ms, и на каждом вызове декрементил счетчики времени открытого состояния (если > 0) для каждой форсунки (если достигли 0 - закарываем). Перспективно ли это направление?
Дискретность времени 1мс? Это же слишком много, за 1мс форсунка нальет много топлива.
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 (вступаем!)
Pavel Buyevich
Posts: 30
Joined: 30 Aug 2014, 09:56
Your CAR: I go on foot
SECU version: DIY SECU-3
Been thanked: 4 times
Contact:

Re: Добавл. в прошивку возможностей одновременного/моно впры

Post by Pavel Buyevich »

STC wrote:
Пока развиваю мысль в сторону того чтобы TIMER2_COMPB_vect дергался через фиксированные промежутки времени, на(грубый)пример каждые 1ms, и на каждом вызове декрементил счетчики времени открытого состояния (если > 0) для каждой форсунки (если достигли 0 - закарываем). Перспективно ли это направление?
Дискретность времени 1мс? Это же слишком много, за 1мс форсунка нальет много топлива.
Поэтому я и сказал - "грубый", сугубо для примера =) Отталкиваясь от того как сейчас сконфигурирован таймер, мы можем дергать прерывание TIMER2_COMPB_vect начиная от каждые 6.4 МИКРОсекунды (1 тик таймера), до 1632 (1.6 миллисекунд) микросекунды (1 тик таймера * 255), диапазон частоты довольно широкий. К примеру решили что декрементим счетчик форсунок каждые 100 микросекунд, ближайшее целое которое можем установить в качестве compare match регистра - 15, дает нам дергание прерывания каждые 96 микросекунд, соответсвенно и декрементим счетчики форсунок в прерывании на эти 96 микросекунд.

Псевдокод
void inject_init_ports(void)
{
IOCFG_INIT(IOP_INJ_OUT0, INJ_OFF); //injector 1 is turned off
IOCFG_INIT(IOP_INJ_OUT1, INJ_OFF); //injector 2 is turned off
IOCFG_INIT(IOP_INJ_OUT2, INJ_OFF); //injector 3 is turned off
IOCFG_INIT(IOP_INJ_OUT3, INJ_OFF); //injector 4 is turned off

OCR2B = 15; // 6.4*15 дает нам прерывание каждые 96микросекунд
}

void inject_start_inj(int cyl)
{
injectors_timeout[cyl] = inj.inj_time; //условно в микросекундах
IOCFG_SET(IOP_INJ_OUT[cyl], INJ_ON); //turn on injector
}

ISR(TIMER2_COMPB_vect) // вызывается каждые 96микросекунд
{
foreach(cylinder) {
injectors_timeout[cylinder] -= 96;
if(injectors_timeout[cylinder] <= 0) {
IOCFG_SET(IOP_INJ_OUT[cylinder], INJ_OFF);
}
}
}

Как-то так. Таймер естественно должен работать в CTC режиме (Clear Timer on Compare Match), который работает только с OCR2A регистром, тоесть в этом варианте нужно поменяться прерываниями с вентилятором, либо перевести последний на другой таймер, или вообще на программный медленный шим.
Сильно не пинайте, не в курсе всех тонкостей =)
Post Reply

Return to “Прошивки”