Алгоритмы РХХ и не только (Algorithms of idling regulators)

Обсуждение прошивок SECU-3. Discussion of SECU-3 firmware.

Moderator: STC

Stranger21
LQFP144 - On Top Of The Game
Posts: 1664
Joined: Fri Jul 01, 2011 2:10 pm
Location: г Уфа

Re: Алгоритмы РХХ и не только

Post by Stranger21 »

напишу тут , так как ближе сюда

предлагаю

так как система стремится к инжектору .
сделать еще одну таблицу , имеющуюся в любом инжекторе
а именно - обороты , от температуры
просто таблица оборотов ХХ для разной температуры
сейчас ее значения будут использованы в РХХ по уоз . как целевые обороты . правда много не поставиш . но если например карб с авто заслонкой , то у него есть некая характеристика регулирования оборотов . и если заложить ее в таблицу . мы получим потдержку по УОЗ этих оборотов и на режиме прогрева - как делает любой инжектор .
а потом добавиться просто сам рхх в алгоритм , когда будет инжектор.
сам я такое пожалуй не осилю .так как с менеждером не дружу вообще пока . да в Си . только "плаваю"
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
Stranger21
LQFP144 - On Top Of The Game
Posts: 1664
Joined: Fri Jul 01, 2011 2:10 pm
Location: г Уфа

Re: Алгоритмы РХХ и не только

Post by Stranger21 »

подниму тему .. ребят .... я пока ваще не сильно разобрался с Си ((( что печально .... не мог бы кто помочь немнооожко совсем для реализации вышеописаной функции , хотябы чисто в единичном экземпляре и как угодно криво косо ...
я совершенно не понял как создаються таблицы в секу3 и как с ними работать (((
также я несовсем понял как температура там представлена ...
не мог бы кто помочь
мне нужно сделать одномерный масиив данных по типу [1300,1200,1100,1000,900,800] ну если сделать шаг 50 то еще лучше но хотябы так , и выбирать эти числа от температуры ...
можно даже просто расказать мне как сделать правильно формулу вида --- обороты= Тдивгателя* коэфициент преобразования , так будет даже лучше ....
куда поставлять обороты в алгоритме РХХ я понял , где это все писать тоже ... но вот с переводом температуры ничего не понятно .... ((((она там в какихто хитрых величинах!!!! ....
просто очень хочу делсть наконец нормальную потдежку оборотов на прогреве .. как в моновпрыске!!! .. иначе плавает балин и все тут (((
я еще даже точно угол на прогреве не выставил (

самое верное было еще один график оборотов иметь ... ну или както брать числа из графика УОЗ от т умножать на коэфициент и получать обороты ....

например так , coolant_function(d) дает число с графика Уоз от Т умноженом на 32 так?
param.idling_rpm это у нас дает обороты те что задал пользователь в РХХ в менаджере
тогда я переписываю РХХ так , что везьде где у нас есть param.idling_rpm я добавляю свою переменную
например idl_coolant_rpm
а ее высчитываю так
idl_coolant_rpm = coolant_function(d) / 32 *100
получим если на графике уоз стоит 6 , то я получу 600 тоесть целевые обороты буду 800 +600 =1400 .. что и требоволоась доказать!!!
я прав?
ну и конечно же в рхх нужно будет убрать граничения по оборотам и темерературе на включение ...

пока писал кажетсья понял что я прав )
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
Stranger21
LQFP144 - On Top Of The Game
Posts: 1664
Joined: Fri Jul 01, 2011 2:10 pm
Location: г Уфа

Re: Алгоритмы РХХ и не только

Post by Stranger21 »

Code: Select all

//Пропорциональный регулятор для регулирования оборотов ХХ углом опережения зажигания
// Возвращает значение угла опережения в целом виде * 32.
int16_t idling_pregulator(struct ecudata_t* d, volatile s_timer8_t* io_timer)
{
 int16_t error,factor,idl_coolant_rpm;
 //зона "подхвата" регулятора при возвращени двигателя из рабочего режима в ХХ
 uint16_t capture_range = 100;

//вычисляем добавку к целевым оборотам по графику УОЗ от Т
idl_coolant_rpm = coolant_function(d)/32 * 100;
 
 //если PXX отключен или обороты значительно выше от нормальных холостых оборотов
 // или обороты не упали ниже целевые +10 первый раз после выхода с рабочего режима , то выходим  с нулевой корректировкой

  if ((d->sens.frequen >(d->param.idling_rpm + idl_coolant_rpm + 10)) && !idl_enable.output_state) 
    return 0;
  else 
    idl_enable.output_state = 1;
    
  if (!d->param.idl_regul || (d->sens.frequen >(d->param.idling_rpm + idl_coolant_rpm + capture_range)))
    return 0;
 
 //вычисляем значение ошибки, ограничиваем ошибку (если нужно), а также, если мы в зоне
 //нечувствительности, то используем расчитанную ранее коррекцию.
 error = d->param.idling_rpm + idl_coolant_rpm - d->sens.frequen;
 restrict_value_to(&error, -200, 100);
 if (abs(error) <= d->param.MINEFR)
  return idl_prstate.output_state;

 //выбираем необходимый коэффициент регулятора, в зависимости от знака ошибки
 if (error > 0)
  factor = d->param.ifac1;
 else
  factor = d->param.ifac2;

 //изменяем значение коррекции только по таймеру idle_period_time_counter
 //if (s_timer_is_action(*io_timer))
 {
  //s_timer_set(*io_timer,IDLE_PERIOD_TIME_VALUE);
   
// функция реализации П регулятора   
  idl_prstate.output_state = (error * factor) / 4;
 }
 //ограничиваем коррекцию нижним и верхним пределами регулирования
 restrict_value_to(&idl_prstate.output_state, d->param.idlreg_min_angle, d->param.idlreg_max_angle);

 return idl_prstate.output_state;
}
посмотрите пожайлуйста ... правильно ли я сделал? .. имеюю виду перевод величин ..
и как бы выяснить уже где какая переменая в чем храниться .. с температурой неопнтно совсем чтото мне (

тут уже реализован функция , если после перехода от рабочего режима к холостым обороты не упали ниже целевые +10 то не включать РХХ . как только обороты упадут , то рхх включается . сделано так для того чтобы не иметь скачок оборотов при переходе от рабочего к хх , как было До этого . на моновпрыске это очень заметно ... теперь все плавно и чудно .... могу привести все вкрапления кода для реализации этой функции ...
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
User avatar
STC
LQFP144 - On Top Of The Game
Posts: 2420
Joined: Fri Oct 22, 2010 10:47 pm
Location: Ukraine, Kiev
Contact:

Re: Алгоритмы РХХ и не только

Post by STC »

Так как используемый процессор не имеет поддержки чисел с плавающей точкой, а вычисления нужно проводить быстро, то используются целые числа. Если нужно представить дробное число, то оно умножается на определенное число (в зависимости от того, какую точность нужно получить). Все расчеты проводятся с числами в таком формате, а на выходе происходит деление.
Еще посмотри макросы в файле magnitude.h

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

coolant_function(d) возвращает УОЗ умноженный на 32.
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
Stranger21
LQFP144 - On Top Of The Game
Posts: 1664
Joined: Fri Jul 01, 2011 2:10 pm
Location: г Уфа

Re: Алгоритмы РХХ и не только

Post by Stranger21 »

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

тоесть я правильно понял если я хочу получить из d->sens.temperat текущуюю температуру в градусах как положено я должен ее обработать в ROUND(d->sens.temperat) ?
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
User avatar
STC
LQFP144 - On Top Of The Game
Posts: 2420
Joined: Fri Oct 22, 2010 10:47 pm
Location: Ukraine, Kiev
Contact:

Re: Алгоритмы РХХ и не только

Post by STC »

Так как ты работаешь с исходными текстами проекта, то тебя это тоже касается viewtopic.php?f=52&t=1325&p=18278#p18278
тоесть я правильно понял если я хочу получить из d->sens.temperat текущуюю температуру в градусах как положено я должен ее обработать в ROUND(d->sens.temperat) ?
Нет. ROUND только округляет, он не преобразовывает.
Тебе не нужно получать текущую температуру в градусах (она и так в градусах, только умножена на число). В пределах прошивки работай непосредственно с этим значением (d->sens.temperat), без всяких преобразований.

Если тебе например нужно сравнить текущую температуру с 70-ю градусами, то это будет выглядеть так:
if (d->sens.temperat > TEMPERATURE_MAGNITUDE(70))
{
температура больше 70-ти градусов.
}

макрос TEMPERATURE_MAGNITUDE(x) просто умножает входное значение на число и округляет до ближайшего целого.

В пределах кода прошивки вообще не возникает необходимость манипулировать с дробным представлением чисел. Все в целом виде с умножением на число. Все что приходит из менеджера или хранится в EEPROM уже заведомо умножено на число.
Например. В окне менеджера ты меняешь температуру с точностью до десятых долей градуса, каждый раз перед тем как полылать значение в SECU-3 менеджер переводит значение в целочисленный вид путем умножения на число. И наоборот, если менеджер получает значание из SECU-3, то он делит его на число.
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
Stranger21
LQFP144 - On Top Of The Game
Posts: 1664
Joined: Fri Jul 01, 2011 2:10 pm
Location: г Уфа

Re: Алгоритмы РХХ и не только

Post by Stranger21 »

это я понял , но вот пример , я хочу в формулу подставить именно текущую Т в градусах . ну например Т*10 = переменная . то вот как тогда ? если я просто подставлю d->sens.temperat то она будет в какойто величине , но не 70 градусов , и вместо ожидаемого 700 и получу что то ... вот в этом я и запутался ....

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

по поводу Git я постараюсь почитать на работе когда будет время , если разберусь , то попробую поработать через него .
но мне пока проще только тут писать что я хочу , что думаю , что пытаюсь програмировать . так как в Сия пока еще полный ноль (
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
User avatar
STC
LQFP144 - On Top Of The Game
Posts: 2420
Joined: Fri Oct 22, 2010 10:47 pm
Location: Ukraine, Kiev
Contact:

Re: Алгоритмы РХХ и не только

Post by STC »

ну например Т*10 = переменная . то вот как тогда ? если я просто подставлю d->sens.temperat то она будет в какойто величине , но не 70 градусов , и вместо ожидаемого 700 и получу что то ... вот в этом я и запутался ....
Вместо 700 получишь 700 * число, но тебе не нужно заморачиваться по этому поводу. Я тебе уже приводил пример.
Это как две части уравнения - если умножить 2 части уравнения на число, то ничего не поменяется.

Да, если например T*70 = 7000 а не 700, то это не проблема, так как ты будешь сравнивать не с 700, а с 7000 (используя макрос).
Это элементарно!

Это как преобразование валют! Скажем 1 доллар = 40 рублей.
1 доллар это 1 градус Цельсия, 1 рубль это 0.025 градуса Цельсия :lol:
Вообразим что SECU-3 это банк, который берет депозиты только рублями, а ты приехал из Америки и у тебя только доллары. Перед тем как ложить деньги на депозит, ты меняешь доллары на рубли и несешь в банк. Через год ты приходишь и забираешь рубли и сразу меняешь их на доллары.
:lol2:

Сколько по математике было в 6-м классе?

Все вопросы по Git задавать в той теме, обещаю помочь!
Author of the SECU-3 project. SECU-3 Engine control unit / Ignition control system
SECU-3.org (Русский)
SECU-3.org (English)
SECU-3 Club ВКонтакте
SECU-3 EMS Project Facebook
Stranger21
LQFP144 - On Top Of The Game
Posts: 1664
Joined: Fri Jul 01, 2011 2:10 pm
Location: г Уфа

Re: Алгоритмы РХХ и не только

Post by Stranger21 »

блин ... чтото мы обо одном , но на разных ...

смотри

у меня предположим , получилась формула , что мне нужно текущую Т умножить на 10 и получить переменную . переменнная должна подставится в следующее выражение математическое имено в виде числа , тоесть Т=70 , переменная равна 700 , не 7000 и не 70 а именно 700 . как быть тогда ?
как узнать чему равно это число на которое умножено d->sens.temperat ?

вот тоже пример мне нужно к 800 прибавить 600 чтобы получить 1400 , 600 я должен получить исходя из температуры , тоесть из d->sens.temperat как тогда то быть?

то что умножено , например на 32 , я уже учел в выше приведенном коде , вот я хочу также узнавать реальную Т ) или просто знать на сколько она умножена чтобы коректировать расчеты все

по математике было нормально ) но очень давно(
WAZ21051 gti 1.7i SECU3Ts + mm1.2.3(1)
ВАЗ21310 1.7i Я7.2 2001г
Dmitrich2
LQFP112 - Up with the play
Posts: 248
Joined: Tue Dec 07, 2010 9:36 am

Re: Алгоритмы РХХ и не только

Post by Dmitrich2 »

Stranger21
Не так давно осваивал СИ в начале пользовался информацией http://www.avr123.nm.ru/05.htm все очень доступно и понятно.
Post Reply