Advertisement
Diego_Frenoux

OpenEFI || code snippets 14

Oct 5th, 2018
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.84 KB | None | 0 0
  1. //#######################################################################
  2. //##############  FDSoftware: https://github.com/FDSoftware   ###########
  3. //##### OpenEFI code snippets: injection calculation test benchmark #####
  4. //#######################################################################
  5. int TINY[18][11] = {
  6.     //RPM requerida / carga motor
  7.     //0 ;18;27;36;45;55;64;73;82;91;100 */
  8.     /*800*/{ 2 ,3 ,3 ,3 ,4 ,6 ,6 ,7 ,8 ,8 ,8 },
  9.     /*1000*/{ 2 ,3 ,3 ,4 ,5 ,8 ,8 ,8 ,10,10,10 },
  10.     /*1200*/{ 2 ,5 ,5 ,5 ,6 ,9 ,9 ,10,11,12,12 },
  11.     /*1500*/{ 7 ,8 ,8 ,8 ,8 ,10,10,11,13,14,14 },
  12.     /*1700*/{ 9 ,10,10,10,10,11,11,12,14,15,15 },
  13.     /*2000*/{ 11,12,12,12,12,13,13,14,15,16,16 },
  14.     /*2200*/{ 12,14,14,14,14,15,15,16,17,18,18 },
  15.     /*2500*/{ 14,16,16,16,16,17,17,17,18,19,19 },
  16.     /*2700*/{ 16,18,18,18,18,19,19,19,20,21,21 },
  17.     /*3000*/{ 18,20,20,20,20,21,21,21,22,23,23 },
  18.     /*3200*/{ 20,22,22,22,22,23,23,23,24,25,25 },
  19.     /*3500*/{ 22,24,24,24,24,25,25,25,26,27,27 },
  20.     /*3700*/{ 24,26,26,26,26,27,27,27,28,29,29 },
  21.     /*4000*/{ 25,27,27,27,27,28,28,28,29,30,30 },
  22.     /*4500*/{ 27,28,28,29,29,30,30,30,31,32,32 },
  23.     /*5000*/{ 29,31,32,32,32,33,33,33,34,35,35 },
  24.     /*5500*/{ 31,33,33,33,33,33,33,34,36,37,37 },
  25.     /*6000*/{ 33,34,34,34,34,34,34,35,37,38,38 }
  26. };         //matriz tabla de inyeccion
  27.  
  28. int VE[18][11] = {
  29.     //0 ;18;27;36;45;55;64;73;82;91;100 */
  30.     /*800*/{ 2 ,3 ,3 ,3 ,4 ,6 ,6 ,7 ,8 ,8 ,8 },
  31.     /*1000*/{ 2 ,3 ,3 ,4 ,5 ,8 ,8 ,8 ,10,10,10 },
  32.     /*1200*/{ 2 ,5 ,5 ,5 ,6 ,9 ,9 ,10,11,12,12 },
  33.     /*1500*/{ 7 ,8 ,8 ,8 ,8 ,10,10,11,13,14,14 },
  34.     /*1700*/{ 9 ,10,10,10,10,11,11,12,14,15,15 },
  35.     /*2000*/{ 11,12,12,12,12,13,13,14,15,16,16 },
  36.     /*2200*/{ 12,14,14,14,14,15,15,16,17,18,18 },
  37.     /*2500*/{ 14,16,16,16,16,17,17,17,18,19,19 },
  38.     /*2700*/{ 16,18,18,18,18,19,19,19,20,21,21 },
  39.     /*3000*/{ 18,20,20,20,20,21,21,21,22,23,23 },
  40.     /*3200*/{ 20,22,22,22,22,23,23,23,24,25,25 },
  41.     /*3500*/{ 22,24,24,24,24,25,25,25,26,27,27 },
  42.     /*3700*/{ 24,26,26,26,26,27,27,27,28,29,29 },
  43.     /*4000*/{ 25,27,27,27,27,28,28,28,29,30,30 },
  44.     /*4500*/{ 27,28,28,29,29,30,30,30,31,32,32 },
  45.     /*5000*/{ 29,31,32,32,32,33,33,33,34,35,35 },
  46.     /*5500*/{ 31,33,33,33,33,33,33,34,36,37,37 },
  47.     /*6000*/{ 33,34,34,34,34,34,34,35,37,38,38 }
  48. };         //matriz tabla de Eficiencia Volumentrica
  49.  
  50. int tablaAvance[18][11] = {//0 ;18;27;36;45;55;64;73;82;91;100 */
  51.     /*800*/{ 2 ,3 ,3 ,3 ,4 ,6 ,6 ,7 ,8 ,8 ,8 },
  52.     /*1000*/{ 2 ,3 ,3 ,4 ,5 ,8 ,8 ,8 ,10,10,10 },
  53.     /*1200*/{ 2 ,5 ,5 ,5 ,6 ,9 ,9 ,10,11,12,12 },
  54.     /*1500*/{ 7 ,8 ,8 ,8 ,8 ,10,10,11,13,14,14 },
  55.     /*1700*/{ 9 ,10,10,10,10,11,11,12,14,15,15 },
  56.     /*2000*/{ 11,12,12,12,12,13,13,14,15,16,16 },
  57.     /*2200*/{ 12,14,14,14,14,15,15,16,17,18,18 },
  58.     /*2500*/{ 14,16,16,16,16,17,17,17,18,19,19 },
  59.     /*2700*/{ 16,18,18,18,18,19,19,19,20,21,21 },
  60.     /*3000*/{ 18,20,20,20,20,21,21,21,22,23,23 },
  61.     /*3200*/{ 20,22,22,22,22,23,23,23,24,25,25 },
  62.     /*3500*/{ 22,24,24,24,24,25,25,25,26,27,27 },
  63.     /*3700*/{ 24,26,26,26,26,27,27,27,28,29,29 },
  64.     /*4000*/{ 25,27,27,27,27,28,28,28,29,30,30 },
  65.     /*4500*/{ 27,28,28,29,29,30,30,30,31,32,32 },
  66.     /*5000*/{ 29,31,32,32,32,33,33,33,34,35,35 },
  67.     /*5500*/{ 31,33,33,33,33,33,33,34,36,37,37 },
  68.     /*6000*/{ 33,34,34,34,34,34,34,35,37,38,38 }
  69. };         //matriz tabla de
  70.  
  71. int tinyTEMP[18][11] = {
  72.     //0 ;18;27;36;45;55;64;73;82;91;100 */ Correcion de tiempo de inyeccion por temperatura
  73.     /*800*/{ 2 ,3 ,3 ,3 ,4 ,6 ,6 ,7 ,8 ,8 ,8 },
  74.     /*1000*/{ 2 ,3 ,3 ,4 ,5 ,8 ,8 ,8 ,10,10,10 },
  75.     /*1200*/{ 2 ,5 ,5 ,5 ,6 ,9 ,9 ,10,11,12,12 },
  76.     /*1500*/{ 7 ,8 ,8 ,8 ,8 ,10,10,11,13,14,14 },
  77.     /*1700*/{ 9 ,10,10,10,10,11,11,12,14,15,15 },
  78.     /*2000*/{ 11,12,12,12,12,13,13,14,15,16,16 },
  79.     /*2200*/{ 12,14,14,14,14,15,15,16,17,18,18 },
  80.     /*2500*/{ 14,16,16,16,16,17,17,17,18,19,19 },
  81.     /*2700*/{ 16,18,18,18,18,19,19,19,20,21,21 },
  82.     /*3000*/{ 18,20,20,20,20,21,21,21,22,23,23 },
  83.     /*3200*/{ 20,22,22,22,22,23,23,23,24,25,25 },
  84.     /*3500*/{ 22,24,24,24,24,25,25,25,26,27,27 },
  85.     /*3700*/{ 24,26,26,26,26,27,27,27,28,29,29 },
  86.     /*4000*/{ 25,27,27,27,27,28,28,28,29,30,30 },
  87.     /*4500*/{ 27,28,28,29,29,30,30,30,31,32,32 },
  88.     /*5000*/{ 29,31,32,32,32,33,33,33,34,35,35 },
  89.     /*5500*/{ 31,33,33,33,33,33,33,34,36,37,37 },
  90.     /*6000*/{ 33,34,34,34,34,34,34,35,37,38,38 }
  91. };         //matriz tabla de avance
  92. int _RPM = 3500,       //las rpm
  93. _TEMP = 45,       //temperatura
  94. _POS = 0,       //posicion del cigueñal (en dientes)
  95. _AE = 0,       //avance de encendido
  96. dnt = 150,     //numero de dientes del cigueñal
  97. _MAP = 80,       //valor en Kpa de presion del multiple de admision
  98. _MAR = 36,       //valor mariposa de admision
  99. _RLT = 750;     //rpm minimas para Ralenti
  100. bool DET = false,   //variable para indicar si el motor esta detenido
  101. ACL = true,   //indica si se esta acelerando
  102. SINC = true;   //indica si se sincronizo el PMS
  103.  
  104.                /*-----( Variables C_INY )-----*/
  105. int INY_L = 150,   //tiempo de apertura del inyector en microsegundos
  106. INY_P = 500,   //tiempo en uS adicional para acelerar el motor
  107. 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% .
  108. 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
  109. byte TBM = 180;     //TBM - Turbo Boost Multiplier (valor multiplicado por 100) boost de 1,2 = 120
  110.                     /*-----( Variables _LMB )-----*/
  111. bool LMBM = true; //en true si se utilizan las dos sondas lambda
  112. int
  113. LMBA = A4,  //pin sonda lambda A
  114. LMBB = A5,  //pin sonda lambda B
  115. CTA = 250, //Correcion de tiempo A, mezcla rica, se le sacan X uS
  116. CTB = 300, //Correcion de tiempo B, mezcla pobre, se le agregan X uS
  117. P_LMB = 250, //periodo en mS en el que se corrije por sonda lamba
  118. T_LMB = 45;  //temperatura a partir de la cual se intenta correjir el tiempo de inyeccion
  119.  
  120. float FLMBA = 1.5,  //factor maximo de lambda
  121. FLMBB = 0.85; //factor minimo de lambda
  122.  
  123. unsigned long
  124. T_LMB_AC = 0,  //para saber tiempo actual  (Temporizador correccion por sonda lambda)
  125. T_LMB_A = 0;  //para saber tiempo anterior                     (||)
  126.  
  127. unsigned long ANT = 0;
  128. int var;
  129. void setup() {
  130.     Serial.begin(19200);
  131.     Serial.println("Iniciando....");
  132.     Serial.println("Correccion por temperatura tarda:");
  133.     ANT = micros();
  134.     var = _Ctemp(1500);
  135.     Serial.print((micros() - ANT));
  136.     Serial.print(" uS, valor devuelto:");
  137.     Serial.println(var);
  138.     //y asi hasta que me aburra viteh'
  139.     Serial.println("BPW:");
  140.     ANT = micros();
  141.     var = _BPW();
  142.     Serial.print((micros() - ANT));
  143.     Serial.print(" uS, valor devuelto:");
  144.     Serial.println(var);
  145.     //y asi hasta que me aburra viteh'
  146.     Serial.println("Alpha-N:");
  147.     ANT = micros();
  148.     var = _APHPLUS();
  149.     Serial.print((micros() - ANT));
  150.     Serial.print(" uS, valor devuelto:");
  151.     Serial.println(var);
  152.     //y asi hasta que me aburra viteh'
  153.     Serial.println("Lambda doble:");
  154.     ANT = micros();
  155.     var = _LMB(1500);
  156.     Serial.print((micros() - ANT));
  157.     Serial.print(" uS, valor devuelto:");
  158.     Serial.println(var);
  159. }
  160. void loop() {
  161.  
  162. }
  163.  
  164. unsigned long _Ctemp(int tin) {
  165. //esta funcion corrige tiempo de inyeccion dependiendo de la temperatura y rpm
  166.     map(_RPM,800,6000,0,18);
  167. return tin + (tinyTEMP[map(_TEMP, -15, 125, 0, 11)][map(_RPM, 800, 6000, 0, 18)]);
  168. }
  169. unsigned long _BPW() {
  170.     //algoritmo para obtener tiempo base (luego pasar por lambda y correcion de temperatura) usado por General Motors
  171.     /*
  172.     BPW = BPC * MAP * T * A/F * VE * BVC * BLM * DFCO * DE * CLT * TBM
  173.     BPW - Base Pulse Width
  174.     BPC - Base Pulse Constant
  175.     MAP - Manifold Absolute Pressure
  176.     T - Temperature
  177.     A/F - Air Fuel Ratio
  178.     VE - Volumetric Efficiency
  179.     BVC - Battery Voltage Correction
  180.     BLM - Block Learn
  181.     DFCO - Decel Fuel Cutoff
  182.     DE - Decel Enleanment
  183.     CLT - Closed Loop
  184.     TBM - Turbo Boost Multiplier */
  185.     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);
  186.  
  187. }
  188.  
  189. unsigned long _APHPLUS() { //ALPHA-N con MAP
  190.                  /*
  191.                  PW = [INJ_CONST * VE(tps,rpm) * MAP * AirDensity] + AccEnrich +InjOpeningTime
  192.  
  193.                  PW (pulse width) ---el tiempo final de apertura del inyector .
  194.  
  195.                  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% .
  196.  
  197.                  VE para Speed Density (map, rpm)----Valor de eficiencia volumétrica tomada de la mapa VE .
  198.  
  199.                  VE para ALPHA-N (tps, rpm)----Valor de eficiencia volumétrica tomada de la mapa VE .
  200.  
  201.                  MAP(manifold absolute pressure)--- Presión tomada en el colector de admisión .
  202.  
  203.                  AirDensity ---- Porcentual diferencia de densidad de aire comparada con la densidad de aire a temperatura 21ºC
  204.  
  205.                  AccEnrich (acceleration enrichment) ---- Enriquecimiento de la mezcla en fase de aceleración .
  206.  
  207.                  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. )
  208.                  */
  209.     return (INY_C * (VE[map(_RPM, 800, 6000, 0, 18)][map(_MAP, 0, 150, 0, 10)] / 100) * _MAP * 1.20) + INY_P + INY_L;
  210. }
  211. unsigned long _LMB(int T) {
  212.     //Esta funcion mide la/s sonda lambda y corrige la mezcla /
  213.     //tiempo de inyeccion
  214.     float _LMB_XA = 800 * (3.3 / 1023); //medimos la sonda A
  215.     float _LMB_XB = 0;
  216.     //V menor a 0.45 = mezcla pobre
  217.     if (_LMB_XA < 0.45) { //aca comparo por Volt pero tendriaaaa que hacerlo con los el factor lamba :S
  218.         T = T + CTB;
  219.     }
  220.     if (_LMB_XA > 0.45) { //V mayor a 0.45 = mezcla rica
  221.         T = T - CTA;
  222.     }
  223.     if (LMBM) {
  224.         _LMB_XB = 300 * (3.3 / 1023); //medimos la sonda B (Si corresponde)
  225.                                                    //V menor a 0.45 = mezcla pobre
  226.         if (_LMB_XB < 0.45) { //aca comparo por Volt pero tendriaaaa que hacerlo con los el factor lamba :S
  227.             T = T + CTB;
  228.         }
  229.         else if (_LMB_XB > 0.45) { //V mayor a 0.45 = mezcla rica
  230.             T = T - CTA;
  231.         }
  232.     }
  233.     return T;
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement