Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

TripComputer ~ Putni racunar za automobil

[es] :: Elektronika :: Mikrokontroleri :: TripComputer ~ Putni racunar za automobil

Strane: 1 2 3 4

[ Pregleda: 24450 | Odgovora: 60 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

conver
Milos Milutinovic
Paracin

Član broj: 226436
Poruke: 112
*.mts.telekom.rs.



+1 Profil

icon TripComputer ~ Putni racunar za automobil12.12.2010. u 16:02 - pre 162 meseci
Pozdrav svima, evo ja se igrao malo svojim (ne) znanjem,programiranjem i PICom te sam hteo da napravim sebi nesto za svoj automobil. S obzirom da vozim relativno star auto, postao sam zavidan svakom ko ima bilo kakav displej na centralnoj konzoli na svom automobilu. :)
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
Code:

#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
Code:

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







 
Odgovor na temu

branko_g
Merna tehnika i elektronika

Član broj: 159227
Poruke: 756
*.dynamic.xdsl-line.inode.at.



+9 Profil

icon Re: TripComputer ~ Putni racunar za automobil12.12.2010. u 19:45 - pre 162 meseci
Citat:
Moj trenutni problem jeste u tome sto mi program broj obrataja motora ispisuje NEtacano

Koliko u ciframa je NEtacno netačno? Da li imaš konstantnu grešku, procentualnu ili ta greška varira?
S obzirom da kod uopste nije komentarisan predpostavljam da čak i ti nakon duže pauze teško možeš da ukapiraš
šta si sa pojedinim delovima koda hteo da postigneš.
Probaj da uz ključne delove koda napišeš komentar šta taj deo koda radi.

U principu bih pošao ovim putem:
-Jedan Timer/Counter bih koristio kao Brojač eksternih impulsa.
-Drugi brojač bih koristio kao izvor vremenske baze. Ovaj brojač bi recimo izazivao interapt svakih 10milisekunde.- U interapt-rutini bih povećavao sadržaj jedne promenljive.
-Na pocetku bih i brojač i promenljivu postavio na nulu.
-Kada promenjliva dostigne vrednost 100 protekla je tačno jedna sekunda.
-U tom trenutku bih "spasao" vrednost brojača prepisavči ga u jednu globalnu promenljivu, i postavio jedan "flag" kao poruku glavnoj petlji da je merenje završeno.
-U glavnoj petlji bi onda na miru "obradio" taj broj impulsa u sekundi, taj deo onda nije vremenski kritičan.
-Kada je posao oko računanja i osvežavanja displeja završen ponovo bih resetovao "flag".

I još nešto u vezi Display.h:
U header idu samo definicije i makro, sam kod tu nije ništa izgubio.
Kod ide samo u C-fajl.
Znači napravi Display.c i Display.h

pozdrav

 
Odgovor na temu

conver
Milos Milutinovic
Paracin

Član broj: 226436
Poruke: 112
*.mts.telekom.rs.



+1 Profil

icon Re: TripComputer ~ Putni racunar za automobil13.12.2010. u 11:15 - pre 162 meseci
Kod sam slabo komentaarisao jer mi je uvek bilo jasno sta radi koji deo price, ne vidim da je neki problem provaliti, ako ista zatreba, pitajte slobodno.
Integrisao sam CCS u MPLAB pa je bilo problema sa ".c" datotekama i njihovim kompajliranjem, ali je zato bez problema progutao ".h" to je jedini razlog :-)

Sto se tice greske za ocitavanje RPM motora, funkcija mi umesto stalnih 800RPM (koliko sam podesio na impulseru) ispisuje neke leve podatke 198,150,0,0 pa onda 161 itd... nema veze s mozgom!

Branko, vhala na sugestijama, ako pronadjes koji tren slobodnog vremena, slobodno baci koju liniju koda za ovu ideju!
Pozdravljam!
 
Odgovor na temu

Horvat

Član broj: 17332
Poruke: 3042
dynamic-109-121-75-248.adsl.eunet.rs.



+165 Profil

icon Re: TripComputer ~ Putni racunar za automobil13.12.2010. u 11:27 - pre 162 meseci
Citat:
conver:  el. dizni,
"varnicu" na neku od svecica,

pa cek, je l dizelas ili benzinac?

a sto se tice komentarisanja koda, sada znas, a da ne ceprksas kod jedno pola godine, trebace ti "malo" vremena da skontas sta si tu hteo da uradis i zasto si bas to napisao
a pogotovo ako delis s drugima kod, svako ima "svoj stil" pisanja

a na koji nacin "hvatas" broj obrtaja motora,pomocu cega?
 
Odgovor na temu

conver
Milos Milutinovic
Paracin

Član broj: 226436
Poruke: 112
*.mts.telekom.rs.



+1 Profil

icon Re: TripComputer ~ Putni racunar za automobil13.12.2010. u 11:42 - pre 162 meseci
Benzinac! Sta je cudno u tome sto ima el. diznu ? :) ima MonoPoint Sistem ubrizgavanja, dakle jedan injektor na cetiri cilindra...
ECU (EngineControleUnit) salje impuls od 12V na bombinu koja taj napon pretvara u visoki napon i predaje kao takav svecici.
Oborim 12v na recimo 3v, nebitno... i brojim :)
E ovako, za RPM sa odradio sledece:

definisao sam:
long int RPMCount = 0;

koji se u funkciji:

void spark_pulse_counter()
{

while(input(PIN_E2))
{
++RPMCount;
}
}

svaki put ikrementira za 1 kada se dovede stanje "1" na E2

Kao interval u kome brojim impulse sam uzeo 1 sekundu jer mi toliko traje jedan prolaz kroz glavnu while petlju:

do
{
spark_pulse_counter();

....


RPM = RPMCount / 2; //jer za jedan obrt vratila bombina 2x baci varnicu

...

} while (TRUE);

Da bih ispisao tacan podatak o broju obrtaja motora, moram broj impulsa izbrojanih na E2 podeliti sa 2 (RPM = RPMCount / 2) jer se za jedan obrt vratila motora 2x javi impuls na E2
 
Odgovor na temu

_str_

Član broj: 53798
Poruke: 878
*.mediaworksit.net.



+10 Profil

icon Re: TripComputer ~ Putni racunar za automobil13.12.2010. u 14:39 - pre 162 meseci
Signal sa "platina" je pun smetnji a možda postoji greška u filtriranju signala?
Podatak o obrtjaima se može uzeti i sa alternatora, signal je naizmenični i freq. mu zavisi od broja obrtaja motora.
__*__
*___*
 
Odgovor na temu

Sepa011

Član broj: 161918
Poruke: 1817
..106.109.adsl.dyn.beotel.net.



+28 Profil

icon Re: TripComputer ~ Putni racunar za automobil13.12.2010. u 14:49 - pre 162 meseci
A si se preracunavanja potrosnje tice, trebace ti i 1 ili 2 meraca protoka.
 
Odgovor na temu

conver
Milos Milutinovic
Paracin

Član broj: 226436
Poruke: 112
*.mts.telekom.rs.



+1 Profil

icon Re: TripComputer ~ Putni racunar za automobil13.12.2010. u 14:51 - pre 162 meseci
Neuzimam ga sa platina vec kao sto rekoh, direktno sa elktronsko upravljacke jedinice pre nego sto ode na bombinu!
 
Odgovor na temu

conver
Milos Milutinovic
Paracin

Član broj: 226436
Poruke: 112
*.mts.telekom.rs.



+1 Profil

icon Re: TripComputer ~ Putni racunar za automobil13.12.2010. u 14:52 - pre 162 meseci
Sepo, ne treba protokomer, samo pogledaj kod tamo gore gde pise CONSUMPTION = .. :)
 
Odgovor na temu

Sepa011

Član broj: 161918
Poruke: 1817
..106.109.adsl.dyn.beotel.net.



+28 Profil

icon Re: TripComputer ~ Putni racunar za automobil13.12.2010. u 17:00 - pre 162 meseci
Axm, da, veoma PRECIZNO određivanje potrošnje. Uz sve to različita goriva imaju i različitu zapreminu na razlićitim temperaturama tako da...
 
Odgovor na temu

conver
Milos Milutinovic
Paracin

Član broj: 226436
Poruke: 112
*.mts.telekom.rs.



+1 Profil

icon Re: TripComputer ~ Putni racunar za automobil13.12.2010. u 17:38 - pre 162 meseci
Verovao ili ne, dobija se dosta pouzdana vrednost za sve rezime rada motora!
Nije funkcija uopste sporna zaista! Problem je odbrojati ove RPMove! Ajde neka neko zalepi kod kako da recimo pokrenemo timer2 na ovom pic-u i generisem interrupt svake sekunde te bih u prekidu obradio izbrojane impulse za tu jednu sekundu!
 
Odgovor na temu

ChanMaster

Član broj: 12043
Poruke: 551
*.3.14.vie.surfer.at.



+61 Profil

icon Re: TripComputer ~ Putni racunar za automobil13.12.2010. u 18:36 - pre 162 meseci
"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"

Zar nece "baciti varnicu" 4 puta? posto je ceo obrtaj u ovom slucaju?

ili je motor dvotaktni??????

 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: TripComputer ~ Putni racunar za automobil13.12.2010. u 19:04 - pre 162 meseci
odma u startu da se izvinim nisam procitao celu temu (malo sam kratak sa vremenom) ali stigao sam da dignem source i dsn pa da nacukam par problematicnih detalja

Code:
 #use delay(clock=1024000)


- koji je ovo takt i odakle dolazi?! 887 ima interni oscilator na 8MHz koji ide na postscaler te generise 8,4,2,1,0.5,0.25,0.125MHz .. 1MHz != 1024000Hz vec je 1MHz == 1000000Hz !!! Ima i dodatni LF koji je na 31KHz.. Frekvencija u ovom slucaju nema nikakve veze sa binarnim brojevima 2^x i slicno MEGA znaci E6
- gde je konfiguracija, ja ne vidim nigde fuse setovan ?! u projektu pise da je configuration setovan "in code" a u kodu nema nigde nista ?! ono use delay() samo sluzi da kompajler pretpostavlja da mcu radi na tom kloku te kada ti uradis delay_ms(100) on to napravi tako da bude 100ms ako mcu radi na 1.024MHz ali to nigde ne konfigurise mcu na 1.024MHz (niti ga je moguce pustiti na tu frekvenciju) (imas zakacene za poruku validne konf bitove)
- sve ovo sto radis, ovako kako radis - nece da moze, tebi main treba da bude otprilike
Code:

void main(){
 //inicijalizacija
 //startanje timera
 //enableovanje interrupta

 //glavna petlja
 while(1){
    refresh_display();
  }
}


dakle sve sto treba da radis u glavnoj petlji je da ispisujes stvari na ekran, sve ostalo treba da se puni kroz interrupte .... ako se dobro secam 887 ima interrupte na B portu kao i ostatak pic familije ... ne secam se da li svaki moze da bude setovan razlicito na "rising" ili "falling" edge (ako ne moze setuj sve na jednu stranu pa eventualno dodaj neke invertore de treba obrnuto) i onda imas funkciju koja obradjuje te dogadjaje (uglavnom ce to biti brojanja) .. i imas timer koji u odredjenom vremenskom intervalu pokupi vrednosti iz brojaca, resetuje ih i uradi "Sta god" sa njima ...

887 nema rtc kao zaseban modul ali moze sa zero cumulative error da se napravi neki rtc koji bi vodio racuna o svemu ... ako uvatim neki minut ovih dana mogu da nacukam primer

Prikačeni fajlovi
 
Odgovor na temu

conver
Milos Milutinovic
Paracin

Član broj: 226436
Poruke: 112
*.mts.telekom.rs.



+1 Profil

icon Re: TripComputer ~ Putni racunar za automobil13.12.2010. u 19:18 - pre 162 meseci
Motor je cetvorotaktni a kod takvih motora su dva impulsa za jedan obrt vratila! Sve su formule ok! Ajte samo pomoc da CCSom pokrenem taj TMR2
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: TripComputer ~ Putni racunar za automobil14.12.2010. u 04:47 - pre 162 meseci
evo ...

Code:

#include <16F887.h>

//Koristi 10bitni ADC
#device adc=10

#FUSES NOWDT                    //Ne treba nam WDT (ne radimo nista preterano bitno)
#FUSES INTRC_IO                 //Interni oscilator (nije nam preterano bitno da bude toliko precizan klok) bez zauzeca RA6 pina
#FUSES NOPUT                    //Ne treba nam ni "power up timer" 
#FUSES MCLR                     //MCLR ukljucen - zgodno za imati reset taster - a i potrebno za debugging
#FUSES NOPROTECT                //Nema sta da stitimo
#FUSES NOCPD                    //EEprom takodje
#FUSES BROWNOUT                 //Resetuj se ako se smori Vdd
#FUSES BORV40                   //resetuj se ako Vdd ode ispod 4v
#FUSES NOIESO                   //Nemamo externi clock tako da nema sta da switchujemo
#FUSES NOFCMEN                  //Gasimo monitor "kloka" - interni je pa ako ne valja, sta sad
#FUSES NOLVP                    //LVP je za bebe :D 
#FUSES NODEBUG                  //Za sada nema sta da debagiramo (mada je ovo mozda zgodno upaliti)
#FUSES NOWRT                    //Moze da se pise po programskoj memoriji (ovo je zgodno u kombu sa bootloaderom, ovako, mozda bolje ugasiti)


//interni oscilator je 8MHz
#use delay(clock=8000000,RESTART_WDT)

#include "LCD.h"

//globalne varijable
volatile float BatteryVolts;
volatile float FuelPCT;
volatile unsigned int InjectorPulse;
volatile unsigned int Spark;
volatile float RPM;
volatile float InjectorsPS;


#int_RTCC
void  RTCC_isr(void) 
{
static unsigned int32 ticks=0;

  ticks+=512;
  if (ticks >  (unsigned int32) 2000000){ //ONE SECOND PASSED
      ticks -= (unsigned int32) 2000000;
      // uradi sta si hteo "svake sekunde"
      RPM = Spark * 30.0; //ako spark puls dolazi po rotaciji, ako ne onda podeliti vrednost sa brojem pulseva po rotaciji
      Spark = 0; 
      
      InjectorsPS = InjectorPulse * 60.0; //Izracunaj sta god sa ovim pulsevima, bilo ih je InjectorPulse u poslednjoj sekundi
      InjectorPulse = 0;
      //
  }
}

//Spark vezan na RB1
#int_RB
void  RB_isr(void) 
{
  // obrati paznju da se ovaj interrupt desava na SVAKU PROMENU,
  // dakle i sa LOW-HIGH i sa HIGH-LOW
  // najlakse je samo da posle vrednost Spark delis sa 2 da dobijes
  // samo jedan edge, a mozes ako hoces da pamtis proslu vrednost
  // pa da proveravas da li je tranzicija ona koju hoces da 
  // brojis
  
   volatile unsigned char dummy;

   Spark++; 
   dummy = input_b(); //moramo da procitamo sadrzaj B da bi izasli iz interapta

}


#int_EXT
void  EXT_isr(void) 
{
  //InjectorPulse je vezan na B0
  InjectorPulse++;
}

#int_AD
void  AD_isr(void) 
{

}

#int_TIMER1
void  TIMER1_isr(void) 
{

}

#int_TIMER2
void  TIMER2_isr(void) 
{

}



void main()
{
   //Kresni ADC 
   setup_adc_ports(sAN0|sAN1|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_32);
   
   
   
   //zagasi SPI
   setup_spi(SPI_SS_DISABLED);
   
   
   //SETUJ TAJMERE
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //TIMER0 8000000/4/2/256 puta u sekundi
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);  //TIMER1 8000000/4/8/256 puta u sekundi
   setup_timer_2(T2_DIV_BY_1,99,10);        //TIMER2 8000000/4/1/256 puta u sekundi
   
   //zagasi komparatore
   setup_comparator(NC_NC_NC_NC);
   
   set_tris_b(0xff);   
   
   
   
   //setuj oscilator (ako menjas ovo ne zaboravi na pocetku da promenis fuse
   setup_oscillator(OSC_8MHZ);

   InjectorPulse = 0;
   Spark = 0;
   RPM = 0;


   //pripremi ekran
   lcd_init();
   Delay_ms(100);
   lcd_cursor_off();
   //lcd_load_custom_chars(); 
   lcd_putc("\f");
   lcd_gotoxy(5,1);
   lcd_putc("V");
   lcd_gotoxy(11,1);
   lcd_putc("%");
   
   lcd_gotoxy(5,2);
   lcd_putc("RPM");
   
 
   //popali interapte
   enable_interrupts(INT_RTCC);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INT_TIMER2);
   
   ext_int_edge( H_TO_L );         //PADAJUCA IVICA OKIDA INTERRUPT
   enable_interrupts(INT_EXT);

   *0x96 = 0x02; //IOCB1
   enable_interrupts(INT_RB);  //PROMENA NA B1 OKIDA INTERRUPT
   enable_interrupts(GLOBAL);

InjectorPulse =0;
   //wrti se u krug
   while(1){
      

      lcd_gotoxy(1,1); printf(lcd_putc,"%04.1g", BatteryVolts);
      lcd_gotoxy(7,1); printf(lcd_putc,"%04.1g", FuelPCT);
      lcd_gotoxy(1,2); printf(lcd_putc,"%04.0g", RPM);

// OVDE PRIKAZI OSTALO STA IMAS ... 



      delay_ms(100);

      //Vin = Vadc * 4
      //Vdd = 5V  
      set_adc_channel(0);
      delay_ms(1);
      BatteryVolts = read_adc() * 5.0 / 256.0;
      
      set_adc_channel(1);
      delay_ms(1);
      //FuelVolts = read_adc() * 5.0 / 256.0;
      FuelPCT = read_adc() * 500.0 / 3072.0 ; //12V == 100%
     
      
   }

}


Prikačeni fajlovi
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: TripComputer ~ Putni racunar za automobil14.12.2010. u 04:57 - pre 162 meseci
kao sto vidis sa primera, vezao sam ti ova dva puls generatora na B0 i B1 da bi mogao interrupt da ih pokupi ... B0 se okida na padajuci a B1 se okida na promenu (dakle i na padajuci i na rastuci signal)

takodje imas konfiguraciju u vrhu fajla i koristi se 8MHz interni oscilator (1.024MHz oscilator koji si ti spominjao nema interno a ne vidim sto bi ga stavljao externo) ..

upaljena su ti sva tri timera, doduse koristi se samo timer0, ova dva su ti upaljena ali ne rade nista ...

racuna ti se RPM i racunaju ti se tacan napon (ne znam sta ti je bilo ono /12 to si nesto "nagadjao??") na akumulatoru i tacan % goriva (ako je raspon na ulazu 0-12V)

imas dakle primer
- kako se nesto broji (broje ti se impulsi sa 2 izvora, mozes da dodas nove izvore na B2.B3... ali onda u int_rb moras da proveravas koji ti je izvor izazvao trigger)
- kako se nesto radi svake sekunde (racunanje rpm-a)
- kako se radi sa adc-om

ovo za sekunde je takozvani "zero cumulative error" pristup, dakle svaka sekunda nije "idealno" tacna (greska je +-0.5us) ali kumulativno greska je 0 posto ako je sada sekunda bila 0.1us "kraca" sledeca ce biti 0.12us duza, pa sledeca 0.02 kraca i u proseku je sve 100% tacno :D.. mnogo vecu gresku ces da imas zbog temperaturnog drifta internog oscilatora nego zbog bilo cega u softwareu :D

eto .. ako neki deo nije jasan - kukaj .. ja o kolima ne znam nista al ovo ti valjda pomogne ..

inace sto se ovih impulsnih ulaza tice, ja bi savetovao tu da stavis ispred neke optokaplere .. cisto da razdvojis to 1/1, samo limitiras struju na ulazu optokaplera i resio si problem, nema da brines .. takodje zenerka + kondenzator na ulaz ADC-a obavezno .. kola su jaaaaaaako prljava i bucna tako da je to pod moranje ...

ono sto nema je da izmeris duzinu nekog pulsa, ne znam dal ti to treba ali je isto prilicno jednostavno ..

[Ovu poruku je menjao bogdan.kecman dana 14.12.2010. u 06:08 GMT+1]
 
Odgovor na temu

conver
Milos Milutinovic
Paracin

Član broj: 226436
Poruke: 112
*.mts.telekom.rs.



+1 Profil

icon Re: TripComputer ~ Putni racunar za automobil14.12.2010. u 11:39 - pre 162 meseci
Hvala ti Bogdane, pomogo si mi dosta zaista! Imaš piće za ovo kad kod ugrabiš vremena!
Nisam skontao ovaj deo sa tajmerom,dakle postavio si:
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //TIMER0 8000000/4/2/256 i to je 3906,25 tikova u sekundi
Šta predstavlja cifra 256?

i zašto si ovde
void RTCC_isr(void)
{
static unsigned int32 ticks=0;

ticks+=512;
if (ticks > (unsigned int32) 2000000){ //ONE SECOND PASSED
ticks -= (unsigned int32) 2000000;
...
}
}
ticks uvećavao do512?

kako znaš da je ovde protekla baš jedna sekunda?
if (ticks > (unsigned int32) 2000000){ //ONE SECOND PASSED


a ovo tek nisam skontao:
setup_timer_2(T2_DIV_BY_1,99,10); šta je 99 i 10 ?

treba još dodati funkciju za merenje trajanja impulsa sa davača InjectorPulse (i to u ms)
Pozdrav!

 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: TripComputer ~ Putni racunar za automobil14.12.2010. u 11:51 - pre 162 meseci
Citat:

Code:

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //TIMER0 8000000/4/2/256 

Šta predstavlja cifra 256?


8000000 - pretstavlja brzinu mcua
/4 - pretstavlja broj intruction clockova mcu-a (PIC16F887 izvrsava jednu instrukciju svaka 4 takta oscilatora)
/2 - deli sa 2 broj tikova u sekundi zato sto smo setapovali prescaler kao RTCC_DIV_2 tako da se tek svaki drugi instruction clock "broji"
/256 - kako je TIMER0 osmobitni tajmer interrupt se desava svaki put kada se desi overflow, a to se na osmobitnom tajmeru desava kada predje iz 0xFF - 0x00 - dakle kada do njega stigne 256 "tikova"


Citat:

zasto ovde
Code:

void RTCC_isr(void)
{
static unsigned int32 ticks=0;

ticks+=512;
if (ticks > (unsigned int32) 2000000){ //ONE SECOND PASSED
ticks -= (unsigned int32) 2000000;
...
}
}

ticks uvecavamo za 512?


zato sto imamo TIMER0 konfigurisan na RTCC_DIV_2 sto znaci da je svaki drugi sistemski tick okinuo TIMER0, a kako je TIMER0 osmobitni tako znamo da je svaki put kada se pozove ovaj interrupt proslo 2*256=512 sistemskih tickova

Citat:

kako znas da je ovde protekla bas jedna sekunda?
Code:

if (ticks > (unsigned int32) 2000000){ //ONE SECOND PASSED



sistemski oscilator je 8000000, dakle sistemskih tikova ima 8000000/4 = 2000000 dakle kada prodje idealno 2000000 tikova prosla je jedna sekunda, kako povecavamo ticks za 512 nikad nece biti idealno 2M tikova vec ce biti prvi put 2000384, pa ce drugi poceti od 384 i zavrisiti na 2000256 te ce treci poceti sa 256 ... etc etc .. znaci sekunda nam varira za jedan interrupt tamo vamo sa preciznoscu od 1/(8000000/4/2/256) = 0.000256sec a da pritom nemamo kumulativnu gresku (dakle za deset hiljada sekundi necemo imati gresku od 2sekunde vec i dalje 0.000256sec) ... ovo moze da se smanji na pola ako ne koristimo post scaler nego teramo timer0 sa DIV_1 ali je to bespotrebno i bez veze trosimo cpu time obzirom da se unutar tog interrapta ipak nesto desava (neka matematika koja je float i nije uopste brza, cak bi mozda bilo bolje koristiti DIV_4 i ticks+=1024)


Citat:

Code:

setup_timer_2(T2_DIV_BY_1,99,10); sta je 99 i 10 ?



sintaksa je setup_timer_2 (mode, period, postscale)
timer 2 moze da koristi "period" - to je da mu kazes kada da radi overflow, dakle ne radi overflow na 256 kao timer0 nego radi overflow na 99
ono 10 je postscaler, dakle na koliko overflow-a da pozove interrupt
t2_div_by_1 je prescaler koji ovde kao sto vidis ne koristimo ..

 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: TripComputer ~ Putni racunar za automobil14.12.2010. u 11:53 - pre 162 meseci
Citat:
treba još dodati funkciju za merenje trajanja impulsa sa davača InjectorPulse (i to u ms)

ah znaci onaj "injector" ulaz - tu ne brojis pulseve nego meris trajanje?

nije frka, samo da uvatim koji minut .. reci mi da li meris trajanje kad je high ili trajanje kad je low? najverovatnije cu onda da zamenim mesta za spark i za injector ulaze
 
Odgovor na temu

conver
Milos Milutinovic
Paracin

Član broj: 226436
Poruke: 112
*.mts.telekom.rs.



+1 Profil

icon Re: TripComputer ~ Putni racunar za automobil14.12.2010. u 12:18 - pre 162 meseci
Tacno tako, ne merim broj impulsa vec trajanje impulsa i to kada je na high, treba mi u ms-ovima!
Druga stvarcica, ova funkcija za RPM ti dosta dobro radi kada je mali broj obrtaja motora u pitanju.
Dakle, kada se motor vrti na 800 o/min to je 1600 "sparkova" u minuti, kada to podelimo sa 60, dobijamo 26.666 "sparkova" u sekundi kako sam gore i napisao i podesio hercazu na spark pulseru 26,666Hz.
medjutim problem nastaje kada recimo kao input zadamo da se motor vrti na 7000 o/min , dakle to je 14000 sparkova u minuti ili 233,333Hz! Kada to zadam kao input na spark impulseru u proteusu, ispisuje mi vrednost 3150 umesto ! 7000 ! :-/
inace ovde:
Code:

void  RTCC_isr(void) 
{
static unsigned int32 ticks=0;

  ticks+=512;
  if (ticks >  (unsigned int32) 2000000){ //ONE SECOND PASSED
      ticks -= (unsigned int32) 2000000;
      // uradi sta si hteo "svake sekunde"
      RPM = SparkPulse * 30.0; //ako spark puls dolazi po rotaciji, ako ne onda podeliti vrednost sa brojem pulseva po rotaciji
      SparkPulse = 0; 

  }
}


ipak treba:

Code:

RPM = SparkPulse / 2 * 30.0; //ako spark puls dolazi po rotaciji, ako ne onda podeliti vrednost sa brojem pulseva po rotaciji 

mada, sto smo mnozili sa 30 gore?
i sta predstavlaja:
*0x96 = 0x02; //IOCB1
gore u kodu?


[Ovu poruku je menjao conver dana 14.12.2010. u 13:33 GMT+1]
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: TripComputer ~ Putni racunar za automobil

Strane: 1 2 3 4

[ Pregleda: 24450 | Odgovora: 60 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.