Esempio n. 1
0
void intkheat_control(struct ecudata_t *d)
{
 if (!d->param.tmp_use)
 {
  IOCFG_INIT(IOP_INTK_HEAT, 0);
  return;
 }

 switch(ih.state)
 {
  case 0: //turn on heating and start timer
   IOCFG_SET(IOP_INTK_HEAT, (d->sens.temperat < TEMPERATURE_MAGNITUDE(HEATING_T_OFF)));   // control heating
   ih.strt_t1 = s_timer_gtc();
   ih.state = 1;
   break;

  case 1: //wait 10 minutes and turn off heating or it will be turned off immediatelly if crankshaft begin to revolve
   if (((s_timer_gtc() - ih.strt_t1) >= HEATING_TIME) || ckps_is_cog_changed())
   {
    IOCFG_SET(IOP_INTK_HEAT, 0);                                                          // turn off heating
    ih.state = 2;
   }
   break;

  case 2: //control heating if engine is running, otherwise turn it off
   if (d->st_block)
   { //engine is running
    IOCFG_SET(IOP_INTK_HEAT, (d->sens.temperat < TEMPERATURE_MAGNITUDE(HEATING_T_OFF)));  // control heating
   }
   else
    IOCFG_SET(IOP_INTK_HEAT, 0);
   break;
 }
}
Esempio n. 2
0
uint8_t knklogic_detect(struct ecudata_t* d, retard_state_t* p_rs)
{
 if (d->sens.frequen > d->param.starter_off && d->sens.temperat > TEMPERATURE_MAGNITUDE(70.0))
 {
  if (0==p_rs->sd_counter)
  {
   //This is a very simple algorithm to determine is knock present. We must
   //improve it in the nearest future.
   p_rs->knock_flag = (d->sens.knock_k > d->param.knock_threshold);
  }
  else
   --p_rs->sd_counter;
 }
 else
  p_rs->knock_flag = 0; //Do not detect knock at the startup of engine


 //if knock detected set corresponding CE error
 if (p_rs->knock_flag)
  ce_set_error(ECUERROR_KNOCK_DETECTED);
 else
  ce_clear_error(ECUERROR_KNOCK_DETECTED);

 return p_rs->knock_flag;
}
Esempio n. 3
0
void pwrrelay_control(struct ecudata_t* d)
{
//if this feature is disabled, then do nothing
    if (!IOCFG_CHECK(IOP_PWRRELAY))
        return;

//apply power management logic
    if (pwrs.pwrdown)
    {   //ignition is off

        //We will wait while temperature is high only if temperature sensor is enabled
        //and control of electric cooling fan is used.
        uint8_t temperature_ok = 1;
        if (d->param.tmp_use && IOCFG_CHECK(IOP_ECF))
        {
#ifdef COOLINGFAN_PWM
            if (d->param.vent_pwm) //PWM is available and enabled
                temperature_ok = (d->sens.temperat <= (d->param.vent_on - TEMPERATURE_MAGNITUDE(2.0)));
            else //PWM is available, but disabled
                temperature_ok = (d->sens.temperat <= (d->param.vent_off));
#else
            //PWM is not available
            temperature_ok = (d->sens.temperat <= (d->param.vent_off));
#endif

            //set timeout
            if (0==pwrs.state)
            {
                pwrs.state = 1;
                s_timer16_set(powerdown_timeout_counter, 6000); //60 sec.
            }
        }

        if ((temperature_ok && eeprom_is_idle()
#ifdef SM_CONTROL
                && choke_is_ready()
#endif
            ) || s_timer16_is_action(powerdown_timeout_counter))
            IOCFG_SET(IOP_PWRRELAY, 0); //turn off relay
    }
    else
        pwrs.state = 0;

//if IGN input is not available, then we will check board voltage
    pwrs.pwrdown = IOCFG_CHECK(IOP_IGN) ? (!IOCFG_GET(IOP_IGN)) : (d->sens.voltage < VOLTAGE_MAGNITUDE(4.5));
}
Esempio n. 4
0
int16_t idl_coolant_rpm_function(struct ecudata_t* d)
{
int16_t i, i1, t = d->sens.temperat;

if (!d->param.tmp_use)
  return d->param.idling_rpm*16;   //обороты хх = тем что заданы в окне оборотов РХХ, если блок неукомплектован ДТОЖ-ом

//-30 - минимальное значение температуры
if (t < TEMPERATURE_MAGNITUDE(-30))
  t = TEMPERATURE_MAGNITUDE(-30);

//10 - шаг между узлами интерполяции по температуре
i = (t - TEMPERATURE_MAGNITUDE(-30)) / TEMPERATURE_MAGNITUDE(10);

if (i >= 15) i = i1 = 15;
else i1 = i + 1;

return simple_interpolation(t, idl_collant_rpm_t[i], idl_collant_rpm_t[i1],
(i * TEMPERATURE_MAGNITUDE(10)) + TEMPERATURE_MAGNITUDE(-30), TEMPERATURE_MAGNITUDE(10));
}
Esempio n. 5
0
uint8_t choke_closing_lookup(struct ecudata_t* d)
{
 int16_t i, i1, t = d->sens.temperat;

 if (!d->param.tmp_use)
  return 0;   //блок не укомплектован ДТОЖ-ом

 //-5 - минимальное значение температуры
 if (t < TEMPERATURE_MAGNITUDE(-5))
  t = TEMPERATURE_MAGNITUDE(-5);

 //5 - шаг между узлами интерполяции по температуре
 i = (t - TEMPERATURE_MAGNITUDE(-5)) / TEMPERATURE_MAGNITUDE(5);

 if (i >= 15) i = i1 = 15;
 else i1 = i + 1;

 return simple_interpolation(t, _GB(&fw_data.exdata.choke_closing[i]), _GB(&fw_data.exdata.choke_closing[i1]),
 (i * TEMPERATURE_MAGNITUDE(5)) + TEMPERATURE_MAGNITUDE(-5), TEMPERATURE_MAGNITUDE(5)) >> 4;
}
Esempio n. 6
0
//Реализует функцию коррекции УОЗ по температуре(град. Цельсия) охлаждающей жидкости
// Возвращает значение угла опережения в целом виде * 32, 2 * 16 = 32.
int16_t coolant_function(struct ecudata_t* d)
{
 int16_t i, i1, t = d->sens.temperat;

 if (!d->param.tmp_use)
  return 0;   //нет коррекции, если блок неукомплектован ДТОЖ-ом

 //-30 - минимальное значение температуры
 if (t < TEMPERATURE_MAGNITUDE(-30))
  t = TEMPERATURE_MAGNITUDE(-30);

 //10 - шаг между узлами интерполяции по температуре
 i = (t - TEMPERATURE_MAGNITUDE(-30)) / TEMPERATURE_MAGNITUDE(10);

 if (i >= 15) i = i1 = 15;
 else i1 = i + 1;

 return simple_interpolation(t, _GB(&d->fn_dat->f_tmp[i]), _GB(&d->fn_dat->f_tmp[i1]),
 (i * TEMPERATURE_MAGNITUDE(10)) + TEMPERATURE_MAGNITUDE(-30), TEMPERATURE_MAGNITUDE(10));
}