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; } }
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; }
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)); }
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)); }
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; }
//Реализует функцию коррекции УОЗ по температуре(град. Цельсия) охлаждающей жидкости // Возвращает значение угла опережения в целом виде * 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)); }