Pokusao sam napraviti sebi tzv. putni racunar koji ce mi pokazivati trenutnu potrosnju goriva, naponsko stanje akumulatora, vreme trajanja impulsa na el. dizni, preostali broj kilometara do zamene ulja itd...
Medjutim kako su me obaveze stigle sve manje vremena imam da privedem projekat kraju. Kako mi cilj projekta nije bio da zaradim odlucio sam da ga podelim sa svima koji su drage volje da pomognu njegovoj realizaciji i mozda jednog dana stave u svoj auto.
Moj trenutni problem jeste u tome sto mi program broj obrataja motora ispisuje NEtacano te automatski ni kalkulacija potrosnje ne moze biti tacna...
Recimo da je u pitanju rad motora na leru kome odgovara 800 o/min, to znaci da ce bombina dva puta baciti "varnicu" na neku od svecica, dakle 800 x 2 = 1600 sto znaci da je to 1600 / 60 = 26.666 Hz!
Zato sam i SPARK u proteusu podesio na 26.666 HZ
inace jedan prolaz kroz while petlju u main-u traje 1sec, te mi je to reperno vreme ... dakle brojim impulse u 1sec pa dalje transformisem u obrtaje, sve se lepo vidi u kodu koji cu okaciti zajedno sa proteus simulacijom,pa ko je voljan da mi pomogne, dobro mi dosao!
Link za simulaciju i kod:
http://www.4shared.com/file/J5TwvP3o/TripComputer.html
evo main koda mozda neko uspe da provali zasto ne dobijam pravilan broj za RPM...
Trip.c
#include "16F887.h"
#use delay(clock=1024000)
#include "LCD.h"
#define H 0
#define OC 1
int SS = 0; //ScreenState
int adc_valueAN0; //Acumulator
int adc_valueAN1; //Fuel
long int RPMCount = 0;
int min = 60;
int UpdateCounter;
int UpdateInterval = 2;
float BatteryVolts;
float InjectorPulse;
float Injectors = 1;
float InjectorFlow = 16; //For 1.6 Engine
float RPM;
float Consumpt;
float KM = 15000; //na toliko sledi promena ulja
#include "LCDCustomChars.h"
#include "Display.h"
#include "WelcomeScreen.h"
void spark_pulse_counter(){
while(input(PIN_E2))
{
++RPMCount;
}
}
void wait_for_low_to_high() {
while(input(PIN_B1)) ; /* if it's high, wait for a low */
delay_us(3); /* account for fall time */
while(!input(PIN_B1)); /* wait for signal to go high */
}
void wait_for_low() {
delay_us(3); /* account for rise time */
while(input(PIN_B1)); /* wait for signal to go low */
}
void km_counter(){
while(input(PIN_B2))
{
KM = KM - 1;
}
}
void Main(){
lcd_init();
Delay_ms(100);
lcd_cursor_off();
lcd_load_custom_chars();
lcd_putc("\f");
setup_adc_ports(sAN0|sAN1);
setup_adc(ADC_CLOCK_DIV_8);
SETUP_TIMER_0(RTCC_INTERNAL | RTCC_DIV_256);
WelcomeScreen();
do
{
spark_pulse_counter();
km_counter();
UpdateCounter++;
wait_for_low_to_high();
set_timer0(0);
wait_for_low();
InjectorPulse = get_timer0();
set_adc_channel(0);
delay_us(20);
adc_valueAN0 = Read_ADC();
RPM = RPMCount / 2; //jer za jedan obrt vratila bombina 2x baci varnicu
Consumpt = ((InjectorPulse * Injectors * InjectorFlow * RPM * 60) / 3600000);
BatteryVolts = (float)(adc_valueAN0/12); //12 je kalibraciona konstanta
if (UpdateCounter == UpdateInterval && SS ==1)
{
Display();
UpdateCounter = 0;
RPMCount = 0;
}
} while (TRUE);
}
Display.h
void Display(){
lcd_putc("\f");
lcd_gotoxy(3,1);
lcd_putc("V");
lcd_gotoxy(7,1);
lcd_putc("ms");
lcd_gotoxy(14,1);
lcd_putc("RPM");
lcd_gotoxy(6,2);
lcd_putc("L/h");
lcd_gotoxy(15,2);
lcd_putc("KM");
lcd_gotoxy(1,1);
printf(lcd_putc,"%0.0f",BatteryVolts);
lcd_gotoxy(5,1);
printf(lcd_putc,"%0.0f"InjectorPulse);
lcd_gotoxy(10,1);
printf(lcd_putc,"%0.0f"RPM);
lcd_gotoxy(1,2);
printf(lcd_putc,"%0.1f"Consumpt);
lcd_gotoxy(10,2);
printf(lcd_putc,"%0.0f"KM);
}