12/mar ignicao funcionando

Dependencies:   mbed reScale TextLCD

main.cpp

Committer:
Marcelocostanzo
Date:
2018-05-02
Revision:
5:e04419b1e369
Parent:
4:9da4a46f38bc
Child:
6:111a7f1b978f

File content as of revision 5:e04419b1e369:

#include "mbed.h"
#include "TextLCD.h"
#include "reScale.h"
#include "eeprom.h"

#define tole_min 10 //tolerancia minima em km/h
#define tole_max 100 //tolerancia maxima em km/h
#define ndentes 60    //numero de dentes do sensor



I2C i2c_lcd(PTC9,PTC8); // SDA, SCL

EEPROM e2prom(PTC11,PTC10,0x0,EEPROM::T24C04); 

InterruptIn motora(D0);
InterruptIn movida(D1);

DigitalOut ign(LED2);
PwmOut boost(PTC1);


Timer t1;
Timer t2;
Ticker call;

Serial pc(USBTX, USBRX); // tx, rx

reScale _scale(tole_min,tole_max,0,1); 

float t_motora=0, t_movida=0;
float perimetro_motora=0, perimetro_movida=0;


TextLCD_I2C lcd(&i2c_lcd, 0x7E, TextLCD::LCD20x4);                  // I2C exp: I2C bus, PCF8574 Slaveaddress, LCD Type

void tracao() 
{
    t1.stop();
    t_motora = t1.read_us();
    t1.reset();
    t1.start();   
}
 
void livre() 
{
    t2.stop();
    t_movida = t2.read_us();
    t2.reset();
    t2.start();   
}
 
void send() 
{       
    pc.printf("Tempo: %.3f Hz  \n\r");       
}
 
void le_memoria()
{ 
    e2prom.read(12, perimetro);
    e2prom.ready();  
}
 
void calc_perimetro_motora()
{   
    float raio_dinamico=0;
    float pneu_largura=205;
    float pneu_perfil=50;
    float pneu_aro=15;
    /*
    e2prom.read(0,pneu_largura);
    e2prom.ready();
    e2prom.read(4,pneu_perfil);
    e2prom.ready();
    e2prom.read(8,pneu_aro);
    e2prom.ready();  
    */ 
    raio_dinamico = pneu_largura * (pneu_perfil /100);
    raio_dinamico = raio_dinamico + (pneu_aro * 25.4);
    perimetro_motora = raio_dinamico * 3.14; //resultado em milimetros
    perimetro_motora = perimetro_motora / 1000; //converter em metros
    
    //e2prom.write(12, perimetro_motora);
    //e2prom.ready();  
}

void calc_perimetro_movida()
{   
    float raio_dinamico=0;
    float pneu_largura=205;
    float pneu_perfil=50;
    float pneu_aro=15;
    /*
    e2prom.read(0,pneu_largura);
    e2prom.ready();
    e2prom.read(4,pneu_perfil);
    e2prom.ready();
    e2prom.read(8,pneu_aro);
    e2prom.ready();  
    */ 
    raio_dinamico = pneu_largura * (pneu_perfil /100);
    raio_dinamico = raio_dinamico + (pneu_aro * 25.4);
    perimetro_movida = raio_dinamico * 3.14; //resultado em milimetros
    perimetro_movida = perimetro_movida / 1000; //converter em metros
    
    //e2prom.write(12, perimetro_movida);
    //e2prom.ready();  
}
 
int main() 
{
    float delta=0;
    float vel_movida=0;
    float vel_motora=0;
    float pwmturbo=0;

    
    motora.fall(&tracao);  // attach the address of the measure function to the rising edge
    movida.fall(&livre);  // attach the address of the measure function to the rising edge
    
    
    boost.period(0.01f);
    
    lcd.setBacklight(TextLCD::LightOn);    
    lcd.setCursor(TextLCD::CurOff_BlkOff);       
    lcd.setAddress(0,0);  
    lcd.printf("Controle de");
    lcd.setAddress(0,1);  
    lcd.printf("TRACAO");
    wait(1.5);
    lcd.cls(); 
    
    /*
    if(  USUARIO DESEJA CALCULAR O PERIMETRO  ) usar while com timeout!!!!!!!!!!!!!!!!!!
    {
    calc_perimetro_movida();   
    calc_perimetro_motora();  
    e2prom.read(12, perimetro);
    e2prom.ready();    
    }
    
    le_memoria();    
    */
    
    calc_perimetro_motora();
    calc_perimetro_movida();

    
    while(1) 
    {              
        vel_motora = perimetro / ((t_motora*ndentes) / 1000000);
        vel_motora = vel_motora * 3.6;

        vel_movida = perimetro / ((t_movida*ndentes) / 1000000);
        vel_movida = vel_movida * 3.6;
        
        delta = vel_motora - vel_movida;
                
        if(delta<=0)
        {
            delta=0;
        }
        
        pwmturbo =_scale.from(delta); 
        boost.write(pwmturbo);

        if(delta > tole_min)
        {
            ign=0;
            wait(0.1);
            lcd.setAddress(0,0);  
            lcd.printf("Destracionando");
        }
        
        else
        {
            ign=1;
            lcd.setAddress(0,0);  
            lcd.printf("Normal         ");
        }
        
                
        lcd.setAddress(0,1);  
        lcd.printf("Motora: %.1f Km/h   ",vel_motora);
        lcd.setAddress(0,2);  
        lcd.printf("Movida: %.1f Km/h   ",vel_movida);
        lcd.setAddress(0,3);  
        lcd.printf("D:%.1f Km/h B:%.1f  ",delta, pwmturbo);
   
    }
}