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); } }