/*
PROGRAMA EN ARDUINO PARA:
- CONTROL DE TIEMPO DE INYECCION DEL INYECTOR DE GAS.
- ENVIO Y RECEPCION DE DATOS HACIA EL MODULO BLUETOOTH.
*/
//Definicion de pines para la entrada de señal:
#define Iny_1_mot 3
#define Iny_2_mot 4
#define Iny_3_mot 5
#define Iny_4_mot 6
//Definicion de pines para la salida de señal:
#define Iny_1_gnv 12
#define Iny_2_gnv 11
#define Iny_3_gnv 10
#define Iny_4_gnv 9
//Definicion del pin de entrada de señal CKP:
#define Sensor_CKP 13
//Constantes de inyeccion y RPM:
float Const_iny_ecuacion = 2.795;
double Const_Conv_Tiempo_RPM = 60000;
double Const_Ciclos_RPM = 200;
double Const_Dientes_CKP_RPM = 17;
double Const_Correccion_RPM = 0.5;
float Fact_Corr_RPM = Const_Correccion_RPM*(Const_Conv_Tiempo_RPM/(Const_Ciclos_RPM*Const_Dientes_CKP_RPM));
//Constantes para el manejo de la inyeccion en diferentes estados:
//NOTA: Si se desea trabajar netamente con la ecuacion introducir un valor de 10 a las siguientes variables:
int Const_RbTb = 15; //RPM bajo TPS bajo
int Const_RmTb = 7; //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
//Variables para definir limites de valores:
int RPM_bajo = 2000; //RPM de 2000 para abajo se considera bajos
int RPM_alto = 4000; //RPM de 4000 para arriba se considera altos
float Voltaje_TPS_min = 0.9; //Define el valor del TPS bajo
float Voltaje_TPS_max = 1.6; //Define el valor del TPS alto
//Inicializacion de variables que se utilizan en el programa:
int RPM = 0;
int Contador_muestras = 0;
float Tiempo_iny_ecuacion = 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;
int Ctrl_Sensores = 0;
float Voltaje_MAF_Acumulado = 0;
float Voltaje_TPS_Acumulado = 0;
float Voltaje_MAF_Promedio = 0;
char Voltaje_MAF_Promedio_char[5];
float Voltaje_TPS_Promedio = 0;
char Voltaje_TPS_Promedio_char[5];
char Tiempo_iny_char[5];
float Tiempo_iny = 0;
int Posicion_inyeccion = 0;
int Contador_iny_1 = 0;
int Contador_iny_2 = 0;
int Contador_iny_3 = 0;
int Contador_iny_4 = 0;
//Datos Bluetooth:
char datos_serial;
char buffer[50];
void setup() {
pinMode(Iny_1_mot, INPUT_PULLUP);
pinMode(Iny_2_mot, INPUT_PULLUP);
pinMode(Iny_3_mot, INPUT_PULLUP);
pinMode(Iny_4_mot, INPUT_PULLUP);
pinMode(Iny_1_gnv, OUTPUT);
pinMode(Iny_2_gnv, OUTPUT);
pinMode(Iny_3_gnv, OUTPUT);
pinMode(Iny_4_gnv, OUTPUT);
analogReference(INTERNAL); //Activa la referencia de voltaje interna d 1.1 V
pinMode(Sensor_CKP, INPUT);
//Configuracion de las interrupciones
cli();
//Primera interrupcion cada
TCCR1A = 0;
TCCR1B = 0;
TCCR1B |= B00000010; //Preescalar = 8
TIMSK1 |= B00000010;
OCR1A = 200; //interrupcion cada 100 us
TCCR2A = 0;
TCCR2B = 0;
TCCR2B |= B00000100; //Preescalar = 64
TIMSK2 |= B00000100;
OCR2B = 50; //interrupcion cada 200 us
sei();
Serial.begin(9600);
}
void leer_mensaje(){
if(Serial.available()>0){
char datos_serial=Serial.read();
Serial.println(datos_serial);
if(datos_serial=='B'){
Const_RbTb++;
}
if(datos_serial=='C'){
Const_RbTb--;
}
if(datos_serial=='D'){
Const_RmTb++;
}
if(datos_serial=='E'){
Const_RmTb--;
}
if(datos_serial=='F'){
Const_RaTb++;
}
if(datos_serial=='G'){
Const_RaTb--;
}
if(datos_serial=='H'){
Const_RbTm++;
}
if(datos_serial=='I'){
Const_RbTm--;
}
if(datos_serial=='J'){
Const_RmTm++;
}
if(datos_serial=='K'){
Const_RmTm--;
}
if(datos_serial=='L'){
Const_RaTm++;
}
if(datos_serial=='M'){
Const_RaTm--;
}
if(datos_serial=='N'){
Const_RbTa++;
}
if(datos_serial=='O'){
Const_RbTa--;
}
if(datos_serial=='P'){
Const_RmTa++;
}
if(datos_serial=='Q'){
Const_RmTa--;
}
if(datos_serial=='R'){
Const_RaTa++;
}
if(datos_serial=='S'){
Const_RaTa--;
}
}
}
void loop() {
Sensor_MAF = analogRead(A1);
Sensor_TPS = analogRead(A0);
Voltaje_MAF = (Sensor_MAF*5)/1024;
Voltaje_TPS = (Sensor_TPS*5)/1024;
Voltaje_MAF_Acumulado = Voltaje_MAF_Acumulado + Voltaje_MAF;
Voltaje_TPS_Acumulado = Voltaje_TPS_Acumulado + Voltaje_TPS;
Ctrl_Sensores++;
if(Ctrl_Sensores>=100){
Voltaje_TPS_Promedio = Voltaje_TPS_Acumulado/100;
Voltaje_MAF_Promedio = Voltaje_MAF_Acumulado/100;
Voltaje_TPS_Acumulado = 0;
Voltaje_MAF_Acumulado = 0;
Ctrl_Sensores = 0;
}
Tiempo_iny_ecuacion = ((RPM*pow(Voltaje_MAF_Promedio, Const_iny_ecuacion))/1044)+1;
dtostrf(Voltaje_MAF_Promedio,4,1,Voltaje_MAF_Promedio_char);
dtostrf(Voltaje_TPS_Promedio,4,1,Voltaje_TPS_Promedio_char);
dtostrf((Tiempo_iny/10),4,1,Tiempo_iny_char);
sprintf(buffer, "%s,%s,%s,%d,%s,%d,%d,%d,%d,%d,%d,%d,%d,%d,%s","A",Voltaje_MAF_Promedio_char,Voltaje_TPS_Promedio_char,RPM,Tiempo_iny_char,Const_RbTb,Const_RmTb,Const_RaTb,Const_RbTm,Const_RmTm,Const_RaTm,Const_RbTa,Const_RmTa,Const_RaTa,"0");
Serial.println(buffer);
leer_mensaje();
}
//PROGRAMA PARA TOMA DE DATOS Y DETERMINACION DEL TIEMPO DE INYECCION:
ISR(TIMER2_COMPB_vect){
TCNT2 = 0;
Contador_muestras++; //Se encarga de recibir las muestras del ckp para determinar las rpm
/*
Si las RPM registradas son mayores a 100 el programa comenzara a calcular el tiempo de
inyeccion, asi como la activacion de los inyectores de gas:
*/
if(RPM<=100){
digitalWrite(Iny_1_gnv, LOW);
digitalWrite(Iny_2_gnv, LOW);
digitalWrite(Iny_3_gnv, LOW);
digitalWrite(Iny_4_gnv, LOW);
}
else if(RPM<=RPM_bajo && Voltaje_TPS_Promedio<=Voltaje_TPS_min){
Tiempo_iny=Const_RbTb*Tiempo_iny_ecuacion;
}else if(RPM>RPM_bajo && RPM<=RPM_alto && Voltaje_TPS_Promedio<=Voltaje_TPS_min){
Tiempo_iny=Const_RmTb*Tiempo_iny_ecuacion;
}else if(RPM>RPM_alto && Voltaje_TPS_Promedio<=Voltaje_TPS_min){
Tiempo_iny=Const_RaTb*Tiempo_iny_ecuacion;
}
else if(RPM<=RPM_bajo && Voltaje_TPS_Promedio>Voltaje_TPS_min && Voltaje_TPS_Promedio<=Voltaje_TPS_max){
Tiempo_iny=Const_RbTm*Tiempo_iny_ecuacion;
}else if(RPM>RPM_bajo && RPM<=RPM_alto && Voltaje_TPS_Promedio>Voltaje_TPS_min && Voltaje_TPS_Promedio<=Voltaje_TPS_max){
Tiempo_iny=Const_RmTm*Tiempo_iny_ecuacion;
}else if(RPM>RPM_alto && Voltaje_TPS_Promedio>Voltaje_TPS_min && Voltaje_TPS_Promedio<=Voltaje_TPS_max){
Tiempo_iny=Const_RaTm*Tiempo_iny_ecuacion;
}
else if(RPM<=RPM_bajo && Voltaje_TPS_Promedio>Voltaje_TPS_max){
Tiempo_iny=Const_RbTa*Tiempo_iny_ecuacion;
}else if(RPM>RPM_bajo && RPM<=RPM_alto && Voltaje_TPS_Promedio>Voltaje_TPS_max){
Tiempo_iny=Const_RmTa*Tiempo_iny_ecuacion;
}else if(RPM>RPM_alto && Voltaje_TPS_Promedio>Voltaje_TPS_max){
Tiempo_iny=Const_RaTa*Tiempo_iny_ecuacion;
}
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;
}
//Para calcular las rpm de entrada:
if(Contador_muestras==1000){
RPM = Contador_CKP*Fact_Corr_RPM;
Contador_muestras = 0;
Contador_CKP = 0;
}
}
// PROGRAMA PARA LA ACTIVACION DE LOS INYECTORES:
ISR(TIMER1_COMPA_vect){
TCNT1 = 0;
Activar_inyectores(Tiempo_iny);
}
/*
Clase 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_mot)==true || Estado_iny_1_ultimo==false){
Contador_iny_1++;
Posicion_inyeccion=1;
Estado_iny_1_ultimo=false;
if(Contador_iny_1<=Tiempo_iny){
digitalWrite(Iny_1_gnv, HIGH);
}else{
digitalWrite(Iny_1_gnv, LOW);
Contador_iny_1=0;
Estado_iny_1_ultimo=true;
}
}
if(digitalRead(Iny_2_mot)==true || Estado_iny_2_ultimo==false){
Contador_iny_2++;
Posicion_inyeccion=2;
Estado_iny_2_ultimo=false;
if(Contador_iny_2<=Tiempo_iny){
digitalWrite(Iny_2_gnv, HIGH);
}else{
digitalWrite(Iny_2_gnv, LOW);
Contador_iny_2=0;
Estado_iny_2_ultimo=true;
}
}
if(digitalRead(Iny_3_mot)==true || Estado_iny_3_ultimo==false){
Contador_iny_3++;
Posicion_inyeccion=3;
Estado_iny_3_ultimo=false;
if(Contador_iny_3<=Tiempo_iny){
digitalWrite(Iny_3_gnv, HIGH);
}else{
digitalWrite(Iny_3_gnv, LOW);
Contador_iny_3=0;
Estado_iny_3_ultimo=true;
}
}
if(digitalRead(Iny_4_mot)==true || Estado_iny_4_ultimo==false){
Contador_iny_4++;
Posicion_inyeccion=4;
Estado_iny_4_ultimo=false;
if(Contador_iny_4<=Tiempo_iny){
digitalWrite(Iny_4_gnv, HIGH);
}else{
digitalWrite(Iny_4_gnv, LOW);
Contador_iny_4=0;
Estado_iny_4_ultimo=true;
}
}
}