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

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

<<

wunder

User avatar

Posts: 1400

Joined: 19 Mar 2015, 16:50

Location: Ukraine

Your CAR: ВАЗ 2107 1,8L

SECU version: official SECU-3T


Has thanked: 40 times
Been thanked: 131 times

Post 17 Sep 2015, 10:11

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

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

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

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

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

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

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

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

воо хоть один толковый момент!
<<

Геннадий

User avatar

Posts: 4

Joined: 23 Aug 2015, 13:55

Your CAR: FIAT UNO 1.0

SECU version: official SECU-3T


Has thanked: 8 times
Been thanked: 0 time

Post 20 Sep 2015, 21:03

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

Добрый день кто знает или встречал где найти производительность форсунки 4850.
Attachments
<<

Pavel Buyevich

User avatar

Posts: 30

Joined: 30 Aug 2014, 09:56


Has thanked: 0 time
Been thanked: 4 times

Post 21 Sep 2015, 08:48

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

yuren wrote:
Pavel Buyevich wrote:Сможете реализовать на одном таймере? ;)


Пока не углубился в детали, думаю можно (даже фазированный (таймер ведь не занимается открытием форсунок, он отсчитывает время к их закрытию - процессы условно параллельные, смущает только то что несмотря не легкость решения на первый взгляд, Алексей не пошел по этому пути, короче говоря, нужно еще ресерчить, пока делаю макет в протеусе для того чтобы проверить свою версию решения проблемы))
<<

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 21 Sep 2015, 20:53

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

Pavel Buyevich wrote:
yuren wrote:
Pavel Buyevich wrote:Сможете реализовать на одном таймере? ;)


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

Режим Peek&Hold для управления низкоомными форсунками требует более сложного алгоритма управления. Нужно драйвер переключать из режима открытия форсунки в режим удержания ШИМом, а затем в режим быстрого спада тока. Для одной форсунки требуется две ноги управления и один генератор ШИМа на все каналы. У меня другая аппаратная платформа. Данный режим реализован для обычных форсунок и они холодные. Полноценное управление в данном режиме в текущем железе невозможно. Необходим второй контроллер, который будет заниматься этим вопросом.
Москвич 2141 УЗАМ 1.7л. Платформа STM32F103RET6. Идеи secu-3. Peak&Hold. Автоматическое вычисление первого цилиндра. Фазированный впрыск.
<<

wunder

User avatar

Posts: 1400

Joined: 19 Mar 2015, 16:50

Location: Ukraine

Your CAR: ВАЗ 2107 1,8L

SECU version: official SECU-3T


Has thanked: 40 times
Been thanked: 131 times

Post 21 Sep 2015, 21:07

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

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

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 21 Sep 2015, 22:50

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

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

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

Вот моя реализация фазированного впрыска без планировщика, может кому-то что-то не придется придумывать заново:
  Code:
#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. Автоматическое вычисление первого цилиндра. Фазированный впрыск.
<<

STC

User avatar

Posts: 6560

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 21 Sep 2015, 23:43

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

Речь идет про обычное управление форсунками, не 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

User avatar

Posts: 30

Joined: 30 Aug 2014, 09:56


Has thanked: 0 time
Been thanked: 4 times

Post 22 Sep 2015, 11:27

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

AlxSh wrote:Режим Peek&Hold для управления низкоомными форсунками требует более сложного алгоритма управления. Нужно драйвер переключать из режима открытия форсунки в режим удержания ШИМом, а затем в режим быстрого спада тока. Для одной форсунки требуется две ноги управления и один генератор ШИМа на все каналы. У меня другая аппаратная платформа. Данный режим реализован для обычных форсунок и они холодные. Полноценное управление в данном режиме в текущем железе невозможно. Необходим второй контроллер, который будет заниматься этим вопросом.


Занимать эбу расчетами для p&h совершенно ни к чему, с этими задачами отлично справляются аппаратные драйввера, типа lm1949, или в крайнем случае своя реализиция подобного драйвера на той-же тиньке (которая даже выйдет дешевле), а поскольку для непосредственного управления форсунками всеравно нужна плата с силовыми ключами - развести ее для подобного драйвера не составляет никаких проблем.
Пока развиваю мысль в сторону того чтобы TIMER2_COMPB_vect дергался через фиксированные промежутки времени, на(грубый)пример каждые 1ms, и на каждом вызове декрементил счетчики времени открытого состояния (если > 0) для каждой форсунки (если достигли 0 - закарываем). Перспективно ли это направление?
<<

STC

User avatar

Posts: 6560

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 23 Sep 2015, 12:33

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

Пока развиваю мысль в сторону того чтобы 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

User avatar

Posts: 30

Joined: 30 Aug 2014, 09:56


Has thanked: 0 time
Been thanked: 4 times

Post 23 Sep 2015, 19:36

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

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 регистром, тоесть в этом варианте нужно поменяться прерываниями с вентилятором, либо перевести последний на другой таймер, или вообще на программный медленный шим.
Сильно не пинайте, не в курсе всех тонкостей =)
PreviousNext

Return to Прошивки

Who is online

Users browsing this forum: No registered users and 6 guests

Powered by phpBB® Forum Software © phpBB Group.