воо хоть один толковый момент!Faza_888 wrote:Маленький совет по настройке динамической производительности форсунок.
Для примера возьмем 4 цилиндровый двигатель, одновременный впрыск, 2 впрыска за цикл.
Прогреваем двигатель, настраиваем смесь на ХХ. Делаем лямбда контроль "медленным": шаг 0.25%, 50 тактов на шаг.
Смотрим на лямбда коррекцию, например она составляет +2%. Меняем количество впрысков за цикл с 2 на 4, при правильной настройке коррекция останется той же. Если ушла в +, например +15%, значит значение динамической производительности высокое, если в -, то низкое.
Подбираем значение динамической производительности для данного напряжения такое, чтобы при смене количества впрысков за цикл не менялась лямбда коррекция.
Такую настройку нужно провести для возможно большего количества точек по напряжению.
Напряжение бортовой сети меняем отключением / подключением генератора, нагрузок и т.д.
Добавл. в прошивку возможностей одновременного/моно впрыска
- 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: Добавл. в прошивку возможностей одновременного/моно впры
-
- Posts: 4
- Joined: 23 Aug 2015, 13:55
- Your CAR: FIAT UNO 1.0
- SECU version: official SECU-3T
- Has thanked: 8 times
Re: Добавл. в прошивку возможностей одновременного/моно впры
Добрый день кто знает или встречал где найти производительность форсунки 4850.
-
- 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: Добавл. в прошивку возможностей одновременного/моно впры
Пока не углубился в детали, думаю можно (даже фазированный (таймер ведь не занимается открытием форсунок, он отсчитывает время к их закрытию - процессы условно параллельные, смущает только то что несмотря не легкость решения на первый взгляд, Алексей не пошел по этому пути, короче говоря, нужно еще ресерчить, пока делаю макет в протеусе для того чтобы проверить свою версию решения проблемы))yuren wrote:Pavel Buyevich wrote: Сможете реализовать на одном таймере?
-
- 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: Добавл. в прошивку возможностей одновременного/моно впры
Режим Peek&Hold для управления низкоомными форсунками требует более сложного алгоритма управления. Нужно драйвер переключать из режима открытия форсунки в режим удержания ШИМом, а затем в режим быстрого спада тока. Для одной форсунки требуется две ноги управления и один генератор ШИМа на все каналы. У меня другая аппаратная платформа. Данный режим реализован для обычных форсунок и они холодные. Полноценное управление в данном режиме в текущем железе невозможно. Необходим второй контроллер, который будет заниматься этим вопросом.Pavel Buyevich wrote:Пока не углубился в детали, думаю можно (даже фазированный (таймер ведь не занимается открытием форсунок, он отсчитывает время к их закрытию - процессы условно параллельные, смущает только то что несмотря не легкость решения на первый взгляд, Алексей не пошел по этому пути, короче говоря, нужно еще ресерчить, пока делаю макет в протеусе для того чтобы проверить свою версию решения проблемы))yuren wrote:Pavel Buyevich wrote: Сможете реализовать на одном таймере?
Москвич 2141 УЗАМ 1.7л. Платформа STM32F103RET6. Идеи secu-3. Peak&Hold. Автоматическое вычисление первого цилиндра. Фазированный впрыск.
- 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: Добавл. в прошивку возможностей одновременного/моно впры
Вообщето шла речь о внутреннем таймере меги для организации фазированного впрыска , если чё . К работе Peek&Hold драйвера это не относитцо
-
- 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: Добавл. в прошивку возможностей одновременного/моно впры
До тех пор пока Peek&Hold не реализован на этом же таймере. Попытка написать планировщик не привела к желаемым результатам, особенно в момент когда меняется фаза впрыска. Слишком много событий, часть которых должна выдергиваться из очереди и ставиться заново в другое место не допуская пропуска в течении цикла.wunder wrote:Вообщето шла речь о внутреннем таймере меги для организации фазированного впрыска , если чё . К работе 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. Автоматическое вычисление первого цилиндра. Фазированный впрыск.
- 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: Добавл. в прошивку возможностей одновременного/моно впры
Речь идет про обычное управление форсунками, не 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 (вступаем!)
Клуб проекта в Facebook https://www.facebook.com/groups/secu3club
Клуб проекта ВКонтакте https://vk.com/secu3club (вступаем!)
-
- 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: Добавл. в прошивку возможностей одновременного/моно впры
Занимать эбу расчетами для p&h совершенно ни к чему, с этими задачами отлично справляются аппаратные драйввера, типа lm1949, или в крайнем случае своя реализиция подобного драйвера на той-же тиньке (которая даже выйдет дешевле), а поскольку для непосредственного управления форсунками всеравно нужна плата с силовыми ключами - развести ее для подобного драйвера не составляет никаких проблем.AlxSh wrote: Режим Peek&Hold для управления низкоомными форсунками требует более сложного алгоритма управления. Нужно драйвер переключать из режима открытия форсунки в режим удержания ШИМом, а затем в режим быстрого спада тока. Для одной форсунки требуется две ноги управления и один генератор ШИМа на все каналы. У меня другая аппаратная платформа. Данный режим реализован для обычных форсунок и они холодные. Полноценное управление в данном режиме в текущем железе невозможно. Необходим второй контроллер, который будет заниматься этим вопросом.
Пока развиваю мысль в сторону того чтобы TIMER2_COMPB_vect дергался через фиксированные промежутки времени, на(грубый)пример каждые 1ms, и на каждом вызове декрементил счетчики времени открытого состояния (если > 0) для каждой форсунки (если достигли 0 - закарываем). Перспективно ли это направление?
- 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: Добавл. в прошивку возможностей одновременного/моно впры
Дискретность времени 1мс? Это же слишком много, за 1мс форсунка нальет много топлива.Пока развиваю мысль в сторону того чтобы TIMER2_COMPB_vect дергался через фиксированные промежутки времени, на(грубый)пример каждые 1ms, и на каждом вызове декрементил счетчики времени открытого состояния (если > 0) для каждой форсунки (если достигли 0 - закарываем). Перспективно ли это направление?
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 (вступаем!)
Клуб проекта в Facebook https://www.facebook.com/groups/secu3club
Клуб проекта ВКонтакте https://vk.com/secu3club (вступаем!)
-
- 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: Добавл. в прошивку возможностей одновременного/моно впры
Поэтому я и сказал - "грубый", сугубо для примера =) Отталкиваясь от того как сейчас сконфигурирован таймер, мы можем дергать прерывание TIMER2_COMPB_vect начиная от каждые 6.4 МИКРОсекунды (1 тик таймера), до 1632 (1.6 миллисекунд) микросекунды (1 тик таймера * 255), диапазон частоты довольно широкий. К примеру решили что декрементим счетчик форсунок каждые 100 микросекунд, ближайшее целое которое можем установить в качестве compare match регистра - 15, дает нам дергание прерывания каждые 96 микросекунд, соответсвенно и декрементим счетчики форсунок в прерывании на эти 96 микросекунд.STC wrote:Дискретность времени 1мс? Это же слишком много, за 1мс форсунка нальет много топлива.Пока развиваю мысль в сторону того чтобы TIMER2_COMPB_vect дергался через фиксированные промежутки времени, на(грубый)пример каждые 1ms, и на каждом вызове декрементил счетчики времени открытого состояния (если > 0) для каждой форсунки (если достигли 0 - закарываем). Перспективно ли это направление?
Псевдокод
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 регистром, тоесть в этом варианте нужно поменяться прерываниями с вентилятором, либо перевести последний на другой таймер, или вообще на программный медленный шим.
Сильно не пинайте, не в курсе всех тонкостей =)