/*
*/
//Definicion de pines para la entrda de señal:
#define Iny_1_in 4
#define Iny_2_in 5
#define Iny_3_in 6
#define Iny_4_in 7
//Definicion de pines para la salida de señal:
#define Iny_1 8
#define Iny_2 9
#define Iny_3 10
#define Iny_4 11
//Definicion del pin de entrada de señal CKP:
#define Sensor_CKP 12
#define Led 2
#define Led1 13
//Constantes de inyeccion y RPM:
float Const_iny_2 = 2.795;
double Const_Conv_RPM = 60000000;
double Const_Tcorr_RPM = 210;
double Const_No_muestras_RPM = 60000000;
double Fact_corr = Const_Conv_RPM/(Const_Tcorr_RPM*Const_No_muestras_RPM);
double Const_RPM = 20.02;
bool LED_STATE1 = true;
//Constantes para el manejo de la inyeccion en diferentes estados:
//NOTA: si sigue la ecuacion mantener en 10
int Const_RbTb = 10; //RPM bajo TPS bajo
int Const_RmTb = 10; //RPM medio TPS bajo
int Const_RaTb = 10; //RPM alto TPS bajo
int Const_RbTm = 10; //RPM bajo TPS medio
int Const_RmTm = 10; //RPM medio TPS medio
int Const_RaTm = 10; //RPM alto TPS medio
int Const_RbTa = 10; //RPM bajo TPS alto
int Const_RmTa = 10; //RPM medio TPS alto
int Const_RaTa = 10; //RPM alto TPS alto
int RPM_bajo = 1000; //Define las RPM hasta que se considera RPM bajo
int RPM_alto = 4000; //Define las RPM desde que se considera RPM alto
float Voltaje_TPS_min = 1.0; //Define el valor del TPS bajo
float Voltaje_TPS_max = 4.0; //Define el valor del TPS alto
//Variables que se utilizan en el programa:
int RPM = 0;
int Contador = 0;
int Contador_muestras = 0;
float Tiempo_iny_pre = 0;
float Voltaje_MAF = 0;
float Voltaje_TPS = 0;
bool Estado_iny_1_ultimo = true;
bool Estado_iny_2_ultimo = true;
bool Estado_iny_3_ultimo = true;
bool Estado_iny_4_ultimo = true;
bool Sensor_CKP_ultimo = true;
int Contador_CKP = 0;
float Sensor_TPS = 0;
float Sensor_MAF = 0;
float Tiempo_iny = 0;
int Contador_iny_1 = 0;
int Contador_iny_2 = 0;
int Contador_iny_3 = 0;
int Contador_iny_4 = 0;
void setup() {
pinMode(Iny_1_in, INPUT_PULLUP);
pinMode(Iny_2_in, INPUT_PULLUP);
pinMode(Iny_3_in, INPUT_PULLUP);
pinMode(Iny_4_in, INPUT_PULLUP);
pinMode(Iny_1, OUTPUT);
pinMode(Iny_2, OUTPUT);
pinMode(Iny_3, OUTPUT);
pinMode(Iny_4, OUTPUT);
pinMode(Led, OUTPUT);
pinMode(Led1, OUTPUT);
analogReference(INTERNAL);
pinMode(Sensor_CKP, INPUT);
cli();
TCCR1A = 0;
TCCR1B = 0;
TCCR1B |= B00000010;
TIMSK1 |= B00000010;
OCR1A = 200;
TCCR2A = 0;
TCCR2B = 0;
TCCR2B |= B00000010;
TIMSK2 |= B00000100;
OCR2B = 200;
sei();
Serial.begin(9600);
}
void loop() {
Sensor_MAF = analogRead(A1);
Sensor_TPS = analogRead(A0);
Voltaje_MAF = (Sensor_MAF*5)/1024;
Voltaje_TPS = (Sensor_TPS*5)/1024;
Tiempo_iny_pre = ((RPM*pow(Voltaje_MAF, Const_iny_2))/1044)+1;
//Serial.println(Voltaje_MAF);
//Serial.println(Voltaje_TPS);
//Serial.println(RPM);
//Serial.println(Tiempo_iny);
//Serial.println(Fact_corr);
}
ISR(TIMER2_COMPB_vect){
TCNT2 = 0;
Contador_muestras++;
/*Controlador de rpm del sistema donde si el sistema no detecta
RPM mayores a 100 rpm se considera que el vehiculo esta apagado
de lo contrario comienza a buscar la posicion de fucnionamiento
en la que se encuentra el motor:
*/
if(RPM<=100){
digitalWrite(Iny_1, LOW);
digitalWrite(Iny_2, LOW);
digitalWrite(Iny_3, LOW);
digitalWrite(Iny_4, LOW);
}else if(RPM<=RPM_bajo && Voltaje_TPS<=Voltaje_TPS_min){
Tiempo_iny=Const_RbTb*Tiempo_iny_pre;
digitalWrite(Led, LOW);
}else if(RPM>RPM_bajo && RPM<=RPM_alto && Voltaje_TPS<=Voltaje_TPS_min){
Tiempo_iny=Const_RmTb*Tiempo_iny_pre;
digitalWrite(Led, LOW);
}else if(RPM>RPM_alto && Voltaje_TPS<=Voltaje_TPS_min){
Tiempo_iny=Const_RaTb*Tiempo_iny_pre;
digitalWrite(Led, LOW);
}else if(RPM<=RPM_bajo && Voltaje_TPS>Voltaje_TPS_min && Voltaje_TPS<=Voltaje_TPS_max){
Tiempo_iny=Const_RbTm*Tiempo_iny_pre;
digitalWrite(Led, LOW);
}else if(RPM>RPM_bajo && RPM<=RPM_alto && Voltaje_TPS>Voltaje_TPS_min && Voltaje_TPS<=Voltaje_TPS_max){
Tiempo_iny=Const_RmTm*Tiempo_iny_pre;
digitalWrite(Led, LOW);
}else if(RPM>RPM_alto && Voltaje_TPS>Voltaje_TPS_min && Voltaje_TPS<=Voltaje_TPS_max){
Tiempo_iny=Const_RaTm*Tiempo_iny_pre;
digitalWrite(Led, LOW);
}
else if(RPM<=RPM_bajo && Voltaje_TPS>Voltaje_TPS_max){
Tiempo_iny=Const_RbTa*Tiempo_iny_pre;
digitalWrite(Led, LOW);
}else if(RPM>RPM_bajo && RPM<=RPM_alto && Voltaje_TPS>Voltaje_TPS_max){
Tiempo_iny=Const_RmTa*Tiempo_iny_pre;
digitalWrite(Led, LOW);
}else if(RPM>RPM_alto && Voltaje_TPS>Voltaje_TPS_max){
Tiempo_iny=Const_RaTa*Tiempo_iny_pre;
digitalWrite(Led, LOW);
}
if(digitalRead(Sensor_CKP)!=Sensor_CKP_ultimo && digitalRead(Sensor_CKP)==true){
Contador_CKP++;
Sensor_CKP_ultimo = true;
}else if (digitalRead(Sensor_CKP)==false){
Sensor_CKP_ultimo = false;
}
if(Contador_muestras==1000){
RPM = Contador_CKP*Const_RPM;
Contador_muestras = 0;
Contador_CKP = 0;
}
}
ISR(TIMER1_COMPA_vect){
TCNT1 = 0;
Activar_inyectores(Tiempo_iny);
LED_STATE1 = !LED_STATE1;
digitalWrite(Led1,LED_STATE1);
}
/*Programa de apoyo que recibe la señal de inyeccion de la ECU del motor
y luego manda la señal correspondiente para los inyectores de GAS:
*/
void Activar_inyectores(float Tiempo_iny){
if(digitalRead(Iny_1_in)==true || Estado_iny_1_ultimo==false){
Contador_iny_1++;
Estado_iny_1_ultimo=false;
if(Contador_iny_1<=Tiempo_iny){
digitalWrite(Iny_1, HIGH);
}else{
digitalWrite(Iny_1, LOW);
Contador_iny_1=0;
Estado_iny_1_ultimo=true;
}
}
if(digitalRead(Iny_2_in)==true || Estado_iny_2_ultimo==false){
Contador_iny_2++;
Estado_iny_2_ultimo=false;
if(Contador_iny_2<=Tiempo_iny){
digitalWrite(Iny_2, HIGH);
}else{
digitalWrite(Iny_2, LOW);
Contador_iny_2=0;
Estado_iny_2_ultimo=true;
}
}
if(digitalRead(Iny_3_in)==true || Estado_iny_3_ultimo==false){
Contador_iny_3++;
Estado_iny_3_ultimo=false;
if(Contador_iny_3<=Tiempo_iny){
digitalWrite(Iny_3, HIGH);
}else{
digitalWrite(Iny_3, LOW);
Contador_iny_3=0;
Estado_iny_3_ultimo=true;
}
}
if(digitalRead(Iny_4_in)==true || Estado_iny_4_ultimo==false){
Contador_iny_4++;
Estado_iny_4_ultimo=false;
if(Contador_iny_4<=Tiempo_iny){
digitalWrite(Iny_4, HIGH);
}else{
digitalWrite(Iny_4, LOW);
Contador_iny_4=0;
Estado_iny_4_ultimo=true;
}
}
}