Files
hpsg5-controller-stm32g4/Core/Src/pre_injection.c

94 lines
2.1 KiB
C

/*
* pre_injection.c
*
* Created on: Sep 16, 2025
* Author: herli
*/
#include <id.h>
#include "pre_injection.h"
#include "main.h"
#include "toothed_wheel.h"
#include "tein_detection.h"
#include "fuel_map.h"
#include "temperature.h"
#include "timeouts.h"
uint8_t active_PI = 0;
float dT_Tein = 90;
float PI_PHIAD = 0.0;
void PI_EVAL(float RPM, float ME, float MEPI){
active_PI = RPM < 1500 && RPM > 3 && ME > 0.031 && MEPI > 0.031;
}
void PI_UPDATE_PHIAD(){
if(active_PI){
PI_PHIAD = FM_GET_PHIAD(RPM, MEPI, Temp); //PHIAD map
PI_PHIAD = PI_PHIAD < 0.1 ? 0 : PI_PHIAD;
}else{
PI_PHIAD = 0;
}
}
extern uint8_t InjectionPrescaler;
//should be called just as the injection is ending
void PI_Start(){
TIM1->EGR = TIM_EGR_UG;
TIM1->CR1 = TIM_CR1_CEN|TIM_CR1_OPM; //COUNTER ENABLE (CEN) AND ONEPULSEMODE (OPM)
float T_on = DEGTOTIME(PI_PHIAD, TEETH_RPM) - T_ein + dT_Tein;
float T_delayFI = 300; //antes estaba con las mt_rpm
float T_hold = 0;
float T_peak = 0;
if(!T_on){
T_peak = 174;
T_hold = 0;
blankInj = 1;
compensatingEOI = 0;
T_ein_filtered = 800;
//Send error solenoid CAN
}else if(T_on < 860){
T_peak = 600;
T_hold = 270;
T_ein_filtered = 800;
blankInj = 0;
compensatingEOI = 0;
}else{
blankInj = 0;
if(CompensateTein){
T_peak = (T_ein > 800) ? T_ein - 200 : PH_PEAK_DEF;
}else{
T_peak = PH_PEAK_DEF;
T_ein_filtered = 800;
}
T_hold = T_on > T_peak ? T_on - T_peak : 0;
}
uint32_t t1 = T_delayFI * InjectionPrescaler;//+1
t1 = !t1 ? 1 : t1;
if(blankInj){
TIM1->CCR1 = t1;
TIM1->CCR4 = t1 + T_peak * InjectionPrescaler;
}else{
uint32_t t2 = t1 + T_peak * InjectionPrescaler;
uint32_t t4 = t2 + (T_hold + INJ_CLOSING_MARGIN) * InjectionPrescaler; //los 25 es por el cambio de topologia, para que cierre al mismo tiempo
if(t1 && t2 && t4){
if(t1 < t2 && t2 <= t4){
TIM1->CCR1 = t1;
TIM1->CCR2 = t2;
//TIM1->CCR4 = compensatingEOI ? 65535 : t4;
TIM1->CCR4 = t4;
TIM1->CCR3 = t1 + AcquisitionTime * InjectionPrescaler; // End time (sampling end)
}
}
}
TIM1->CNT = 0;
TIM1->EGR = TIM_EGR_UG;
TIM1->CR1 = TIM_CR1_OPM | TIM_CR1_CEN;
}