Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //#######################################################################
- //############## FDSoftware: https://github.com/FDSoftware ###########
- //##### OpenEFI code snippets: injection calculation test benchmark #####
- //#######################################################################
- int TINY[18][11] = {
- //RPM requerida / carga motor
- //0 ;18;27;36;45;55;64;73;82;91;100 */
- /*800*/{ 2 ,3 ,3 ,3 ,4 ,6 ,6 ,7 ,8 ,8 ,8 },
- /*1000*/{ 2 ,3 ,3 ,4 ,5 ,8 ,8 ,8 ,10,10,10 },
- /*1200*/{ 2 ,5 ,5 ,5 ,6 ,9 ,9 ,10,11,12,12 },
- /*1500*/{ 7 ,8 ,8 ,8 ,8 ,10,10,11,13,14,14 },
- /*1700*/{ 9 ,10,10,10,10,11,11,12,14,15,15 },
- /*2000*/{ 11,12,12,12,12,13,13,14,15,16,16 },
- /*2200*/{ 12,14,14,14,14,15,15,16,17,18,18 },
- /*2500*/{ 14,16,16,16,16,17,17,17,18,19,19 },
- /*2700*/{ 16,18,18,18,18,19,19,19,20,21,21 },
- /*3000*/{ 18,20,20,20,20,21,21,21,22,23,23 },
- /*3200*/{ 20,22,22,22,22,23,23,23,24,25,25 },
- /*3500*/{ 22,24,24,24,24,25,25,25,26,27,27 },
- /*3700*/{ 24,26,26,26,26,27,27,27,28,29,29 },
- /*4000*/{ 25,27,27,27,27,28,28,28,29,30,30 },
- /*4500*/{ 27,28,28,29,29,30,30,30,31,32,32 },
- /*5000*/{ 29,31,32,32,32,33,33,33,34,35,35 },
- /*5500*/{ 31,33,33,33,33,33,33,34,36,37,37 },
- /*6000*/{ 33,34,34,34,34,34,34,35,37,38,38 }
- }; //matriz tabla de inyeccion
- int VE[18][11] = {
- //0 ;18;27;36;45;55;64;73;82;91;100 */
- /*800*/{ 2 ,3 ,3 ,3 ,4 ,6 ,6 ,7 ,8 ,8 ,8 },
- /*1000*/{ 2 ,3 ,3 ,4 ,5 ,8 ,8 ,8 ,10,10,10 },
- /*1200*/{ 2 ,5 ,5 ,5 ,6 ,9 ,9 ,10,11,12,12 },
- /*1500*/{ 7 ,8 ,8 ,8 ,8 ,10,10,11,13,14,14 },
- /*1700*/{ 9 ,10,10,10,10,11,11,12,14,15,15 },
- /*2000*/{ 11,12,12,12,12,13,13,14,15,16,16 },
- /*2200*/{ 12,14,14,14,14,15,15,16,17,18,18 },
- /*2500*/{ 14,16,16,16,16,17,17,17,18,19,19 },
- /*2700*/{ 16,18,18,18,18,19,19,19,20,21,21 },
- /*3000*/{ 18,20,20,20,20,21,21,21,22,23,23 },
- /*3200*/{ 20,22,22,22,22,23,23,23,24,25,25 },
- /*3500*/{ 22,24,24,24,24,25,25,25,26,27,27 },
- /*3700*/{ 24,26,26,26,26,27,27,27,28,29,29 },
- /*4000*/{ 25,27,27,27,27,28,28,28,29,30,30 },
- /*4500*/{ 27,28,28,29,29,30,30,30,31,32,32 },
- /*5000*/{ 29,31,32,32,32,33,33,33,34,35,35 },
- /*5500*/{ 31,33,33,33,33,33,33,34,36,37,37 },
- /*6000*/{ 33,34,34,34,34,34,34,35,37,38,38 }
- }; //matriz tabla de Eficiencia Volumentrica
- int tablaAvance[18][11] = {//0 ;18;27;36;45;55;64;73;82;91;100 */
- /*800*/{ 2 ,3 ,3 ,3 ,4 ,6 ,6 ,7 ,8 ,8 ,8 },
- /*1000*/{ 2 ,3 ,3 ,4 ,5 ,8 ,8 ,8 ,10,10,10 },
- /*1200*/{ 2 ,5 ,5 ,5 ,6 ,9 ,9 ,10,11,12,12 },
- /*1500*/{ 7 ,8 ,8 ,8 ,8 ,10,10,11,13,14,14 },
- /*1700*/{ 9 ,10,10,10,10,11,11,12,14,15,15 },
- /*2000*/{ 11,12,12,12,12,13,13,14,15,16,16 },
- /*2200*/{ 12,14,14,14,14,15,15,16,17,18,18 },
- /*2500*/{ 14,16,16,16,16,17,17,17,18,19,19 },
- /*2700*/{ 16,18,18,18,18,19,19,19,20,21,21 },
- /*3000*/{ 18,20,20,20,20,21,21,21,22,23,23 },
- /*3200*/{ 20,22,22,22,22,23,23,23,24,25,25 },
- /*3500*/{ 22,24,24,24,24,25,25,25,26,27,27 },
- /*3700*/{ 24,26,26,26,26,27,27,27,28,29,29 },
- /*4000*/{ 25,27,27,27,27,28,28,28,29,30,30 },
- /*4500*/{ 27,28,28,29,29,30,30,30,31,32,32 },
- /*5000*/{ 29,31,32,32,32,33,33,33,34,35,35 },
- /*5500*/{ 31,33,33,33,33,33,33,34,36,37,37 },
- /*6000*/{ 33,34,34,34,34,34,34,35,37,38,38 }
- }; //matriz tabla de
- int tinyTEMP[18][11] = {
- //0 ;18;27;36;45;55;64;73;82;91;100 */ Correcion de tiempo de inyeccion por temperatura
- /*800*/{ 2 ,3 ,3 ,3 ,4 ,6 ,6 ,7 ,8 ,8 ,8 },
- /*1000*/{ 2 ,3 ,3 ,4 ,5 ,8 ,8 ,8 ,10,10,10 },
- /*1200*/{ 2 ,5 ,5 ,5 ,6 ,9 ,9 ,10,11,12,12 },
- /*1500*/{ 7 ,8 ,8 ,8 ,8 ,10,10,11,13,14,14 },
- /*1700*/{ 9 ,10,10,10,10,11,11,12,14,15,15 },
- /*2000*/{ 11,12,12,12,12,13,13,14,15,16,16 },
- /*2200*/{ 12,14,14,14,14,15,15,16,17,18,18 },
- /*2500*/{ 14,16,16,16,16,17,17,17,18,19,19 },
- /*2700*/{ 16,18,18,18,18,19,19,19,20,21,21 },
- /*3000*/{ 18,20,20,20,20,21,21,21,22,23,23 },
- /*3200*/{ 20,22,22,22,22,23,23,23,24,25,25 },
- /*3500*/{ 22,24,24,24,24,25,25,25,26,27,27 },
- /*3700*/{ 24,26,26,26,26,27,27,27,28,29,29 },
- /*4000*/{ 25,27,27,27,27,28,28,28,29,30,30 },
- /*4500*/{ 27,28,28,29,29,30,30,30,31,32,32 },
- /*5000*/{ 29,31,32,32,32,33,33,33,34,35,35 },
- /*5500*/{ 31,33,33,33,33,33,33,34,36,37,37 },
- /*6000*/{ 33,34,34,34,34,34,34,35,37,38,38 }
- }; //matriz tabla de avance
- int _RPM = 3500, //las rpm
- _TEMP = 45, //temperatura
- _POS = 0, //posicion del cigueñal (en dientes)
- _AE = 0, //avance de encendido
- dnt = 150, //numero de dientes del cigueñal
- _MAP = 80, //valor en Kpa de presion del multiple de admision
- _MAR = 36, //valor mariposa de admision
- _RLT = 750; //rpm minimas para Ralenti
- bool DET = false, //variable para indicar si el motor esta detenido
- ACL = true, //indica si se esta acelerando
- SINC = true; //indica si se sincronizo el PMS
- /*-----( Variables C_INY )-----*/
- int INY_L = 150, //tiempo de apertura del inyector en microsegundos
- INY_P = 500, //tiempo en uS adicional para acelerar el motor
- INY_C = 250; //Es el valor constante , que determina el tiempo de apertura para que se crea la mezcla estequiométrica (lambda=1 ) , para cilindrada del motor , presión a 100kPa , temperatura del aire a 21ºC y VE 100% .
- byte AF = 147; //mexcla Aire Combustible objetivo numero entero sin coma, para sacar la coma se multiplica por 10, asi que para tener una mexcla de 14,7/1 se escribe 147
- byte TBM = 180; //TBM - Turbo Boost Multiplier (valor multiplicado por 100) boost de 1,2 = 120
- /*-----( Variables _LMB )-----*/
- bool LMBM = true; //en true si se utilizan las dos sondas lambda
- int
- LMBA = A4, //pin sonda lambda A
- LMBB = A5, //pin sonda lambda B
- CTA = 250, //Correcion de tiempo A, mezcla rica, se le sacan X uS
- CTB = 300, //Correcion de tiempo B, mezcla pobre, se le agregan X uS
- P_LMB = 250, //periodo en mS en el que se corrije por sonda lamba
- T_LMB = 45; //temperatura a partir de la cual se intenta correjir el tiempo de inyeccion
- float FLMBA = 1.5, //factor maximo de lambda
- FLMBB = 0.85; //factor minimo de lambda
- unsigned long
- T_LMB_AC = 0, //para saber tiempo actual (Temporizador correccion por sonda lambda)
- T_LMB_A = 0; //para saber tiempo anterior (||)
- unsigned long ANT = 0;
- int var;
- void setup() {
- Serial.begin(19200);
- Serial.println("Iniciando....");
- Serial.println("Correccion por temperatura tarda:");
- ANT = micros();
- var = _Ctemp(1500);
- Serial.print((micros() - ANT));
- Serial.print(" uS, valor devuelto:");
- Serial.println(var);
- //y asi hasta que me aburra viteh'
- Serial.println("BPW:");
- ANT = micros();
- var = _BPW();
- Serial.print((micros() - ANT));
- Serial.print(" uS, valor devuelto:");
- Serial.println(var);
- //y asi hasta que me aburra viteh'
- Serial.println("Alpha-N:");
- ANT = micros();
- var = _APHPLUS();
- Serial.print((micros() - ANT));
- Serial.print(" uS, valor devuelto:");
- Serial.println(var);
- //y asi hasta que me aburra viteh'
- Serial.println("Lambda doble:");
- ANT = micros();
- var = _LMB(1500);
- Serial.print((micros() - ANT));
- Serial.print(" uS, valor devuelto:");
- Serial.println(var);
- }
- void loop() {
- }
- unsigned long _Ctemp(int tin) {
- //esta funcion corrige tiempo de inyeccion dependiendo de la temperatura y rpm
- map(_RPM,800,6000,0,18);
- return tin + (tinyTEMP[map(_TEMP, -15, 125, 0, 11)][map(_RPM, 800, 6000, 0, 18)]);
- }
- unsigned long _BPW() {
- //algoritmo para obtener tiempo base (luego pasar por lambda y correcion de temperatura) usado por General Motors
- /*
- BPW = BPC * MAP * T * A/F * VE * BVC * BLM * DFCO * DE * CLT * TBM
- BPW - Base Pulse Width
- BPC - Base Pulse Constant
- MAP - Manifold Absolute Pressure
- T - Temperature
- A/F - Air Fuel Ratio
- VE - Volumetric Efficiency
- BVC - Battery Voltage Correction
- BLM - Block Learn
- DFCO - Decel Fuel Cutoff
- DE - Decel Enleanment
- CLT - Closed Loop
- TBM - Turbo Boost Multiplier */
- return ((INY_C/10) * _MAP * _TEMP *(AF / 10) * (VE[map(_RPM, 800, 6000, 0, 18)][map(_MAP, 0, 150, 0, 10)] )*0.00001) * (TBM / 10);
- }
- unsigned long _APHPLUS() { //ALPHA-N con MAP
- /*
- PW = [INJ_CONST * VE(tps,rpm) * MAP * AirDensity] + AccEnrich +InjOpeningTime
- PW (pulse width) ---el tiempo final de apertura del inyector .
- INJ_CONST ----Es el valor constante , que determina el tiempo de apertura para que se crea la mezcla estequiométrica (lambda=1 ) , para cilindrada del motor , presión a 100kPa , temperatura del aire a 21ºC y VE 100% .
- VE para Speed Density (map, rpm)----Valor de eficiencia volumétrica tomada de la mapa VE .
- VE para ALPHA-N (tps, rpm)----Valor de eficiencia volumétrica tomada de la mapa VE .
- MAP(manifold absolute pressure)--- Presión tomada en el colector de admisión .
- AirDensity ---- Porcentual diferencia de densidad de aire comparada con la densidad de aire a temperatura 21ºC
- AccEnrich (acceleration enrichment) ---- Enriquecimiento de la mezcla en fase de aceleración .
- InjOpeningTime ---- Tiempo de apertura de inyector hasta el momento de inicio de inyección de combustible ( valor de retardo tomado de la mapa de calibración , INJECTORS CAL. )
- */
- return (INY_C * (VE[map(_RPM, 800, 6000, 0, 18)][map(_MAP, 0, 150, 0, 10)] / 100) * _MAP * 1.20) + INY_P + INY_L;
- }
- unsigned long _LMB(int T) {
- //Esta funcion mide la/s sonda lambda y corrige la mezcla /
- //tiempo de inyeccion
- float _LMB_XA = 800 * (3.3 / 1023); //medimos la sonda A
- float _LMB_XB = 0;
- //V menor a 0.45 = mezcla pobre
- if (_LMB_XA < 0.45) { //aca comparo por Volt pero tendriaaaa que hacerlo con los el factor lamba :S
- T = T + CTB;
- }
- if (_LMB_XA > 0.45) { //V mayor a 0.45 = mezcla rica
- T = T - CTA;
- }
- if (LMBM) {
- _LMB_XB = 300 * (3.3 / 1023); //medimos la sonda B (Si corresponde)
- //V menor a 0.45 = mezcla pobre
- if (_LMB_XB < 0.45) { //aca comparo por Volt pero tendriaaaa que hacerlo con los el factor lamba :S
- T = T + CTB;
- }
- else if (_LMB_XB > 0.45) { //V mayor a 0.45 = mezcla rica
- T = T - CTA;
- }
- }
- return T;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement