BLOGas.lt
Sukurk savo BLOGą Kitas atsitiktinis BLOGas

Skaitmeninis tachometras + bekontaktė uždegimo sistema

Na štai pagaliau pabaigiau projektuoti skaitmeninį tachometrą + bekontaktinę uždegimo sistemą savo jawai 350/638:

Šiek tiek paaiškinimų D4,D5 LED atitinka + laida į indukcinęs rites (babinas), signalų generatoriaus piesinukas atitinka laida is holo jutiklio.

Šis tachometras , na jei skaitėte skyrelį apie dažnomatį, pastebėsite, kad čia tas pats prietaisas, tačiau turintis kelis modifikavimus.

Mikrovaldiklis reikalingas, tam, kad is 4 bitų skaitliuko išvedimų, uždegtų atitinkamą led, prie atitinkamų apsukų, tai pat reguliuoja į kurį cilindrą turi būti skeliama kibirkštis, taigi Programa mikrovaldikliui:

/*
///////////////////////////////////////////////////////////////////////////////////////////////////
////                           Jawa 350/638 elektronine uzdegimo sistema + tachometras         ////
////                           Programa parase: Saulius Stasys   http://varzazaliam.blogas.lt  ////                          ////
////                           v.0.9 (9 versija)                                               ////
///////////////////////////////////////////////////////////////////////////////////////////////////
*/
#include <avr/io.h>

int main( void )
{
DDRD = 0b1100000;//registre nustatome, kad PD5, PD6- isejimai, PD0…PD4 iejimai
PORTD = 0b00000;// nustatome, kad porto isejime bus 5v

DDRB = 0b11111111;// nustatome PB0…PB7 kaip isejimus
DDRA = 0b11;// nustatome PA0, PA1 kaip isejimus

unsigned char a=0;

while(1)
{
/////////////////////////degimas v.0.4/////////////////////////////////
if (PIND&(1<<DDD0))
{
if (a==1)
a=0;
else
a=1;

while(PIND&(1<<DDD0))
{
}

}

if (a==0)
PORTA=(1<<DDRA0);
else
PORTA=(1<<DDRA1);
/////////////////////////////////////////////////////////////////////
//////////////////LEDai v.1.2////////////////////////////////////////

if(PIND&(1<<DDD1))
{
if(PIND&(1<<DDD2))
{
if(PIND&(1<<DDD3))
{
if(PIND&(1<<DDD4))
{
PORTB = 0b00000000;
PORTD = 0b0000000;
}
else
{
PORTB = 0b1111111;////7
}
}
else
{
if(PIND&(1<<DDD4))
{
PORTB = 0b00000000;
PORTD = 0b0000000;
}
else
{
PORTB = 0b111;////3
}
}
}
else
{
if(PIND&(1<<DDD3))
{
if(PIND&(1<<DDD4))
{
PORTB = 0b00000000;
PORTD = 0b0000000;
}
else
{
PORTB = 0b11111;////5
}
}
else
{
if(PIND&(1<<DDD4))
{
PORTB = 0b11111111;
PORTD = 0b0100000;////9
}
else
{
PORTD = 0b0000000;// nieko nerodo
PORTB = 0b1;////1
}
}
}
}
else
{
if(PIND&(1<<DDD2))
{
if(PIND&(1<<DDD3))
{
if(PIND&(1<<DDD4))
{
PORTB = 0b00000000;
PORTD = 0b0000000;
}
else
{
PORTB = 0b111111;////6
}
}
else
{
if(PIND&(1<<DDD4))
{
PORTB = 0b00000000;
PORTD = 0b0000000;
}
else
{
PORTB = 0b11;////2
}
}
}
else
{
if(PIND&(1<<DDD3))
{
if(PIND&(1<<DDD1))
{
if(PIND&(1<<DDD4))
{
PORTD = 0b0000000;
PORTB = 0b00000000;
}
else
{
PORTB = 0b11111;////5
}
}
else
{
if(PIND&(1<<DDD4))
{
PORTB = 0b00000000;
PORTD = 0b0000000;
}
else
{
PORTB = 0b1111;////4
}
}
}
else
{
if(PIND&(1<<DDD4))
{
if(PIND&(1<<DDD1))
{
if(PIND&(1<<DDD2))
{
PORTB = 0b00000000;
PORTD = 0b0000000;
}
else
{
PORTD = 0b0100000;////9
PORTB = 0b11111111;
}
}
else
{
if(PIND&(1<<DDD3))
{
PORTB = 0b00000000;
PORTD = 0b0000000;
}
else
{
PORTD = 0b000000;
PORTB = 0b11111111;////8
}
}
}
else
{
PORTB = 0b00000000; //nieko nerodo
}
}
}
}

///////////////////////////////////////////////////////////////
}
}

PASTABA!!! prietaisas realybeje gali veikti kitaip negu simuliuojant PROTEUS programa. Ir jis dar tik prototipo versijoje!

Tačiau artimiausiu metu žadu užsipirkti šiam projektui reikalingu komponentų ir bandysiu surinkti šį prietaisą, taipogi tokiu pat pagrindu gaminsiu ir spidometrą, tačiau su juo bus kur kas lengviau, jei kilo klausimu palikite komentarų skiltyje. Sėkmės besimokant elektronikos!!!

Taigi naujoji t.y. 2-oji tachometro schemos versija, kurios ko gero nebeiseis daugiau patobulinti, trumpai paaiskinsiu:

indikatoriuose matomos apsuku intervalas nuo 10 iki 9k99 rpm

skaiciai atnaujinami 10kartu per sekunde, restinimo trukme 50us, skaiciu rodymo uzdelsimui parenkami kondensatoriai, taigi schema:

del ledu rodymo prie atitinkamu apsuku dar tobulinama,  o uzdegimo sistema kuriama kitu principu, atnaujinimus ikelsiu kai baigsiu.

Taigi naujiems metams nauji patobulinimai:

LED’u rodymas pagal apsukas isprestas: stai pradziai schema:

na ir programa ledams ( ne tiems valgomiems :D):

///////////////////////////////////////////////////////////////////////////
////                   Skaitmeninis tachometras + LED                      ////
////                   PROGRAMA PARASE Saulius Stasys                  ////
////                   http://varzazaliam.blogas.lt/                   ////
////                   v.1.4 (14versija)                               ////
///////////////////////////////////////////////////////////////////////////

#include<avr/io.h>
#include<util/delay.h>

#define blinkt _delay_ms(100) ///jei norite paspartinti pirmojo led mirksejima, kai apsukos yra
///0-999rpm vietoje 100 parasykite mazesni skaiciu pvz 50, jei
///norite suletinti led’o mirksejima skaiciu padidinkite pvz 150

#define    a PIND&(1<<DDD0)
#define    b PIND&(1<<DDD1)
#define    c PIND&(1<<DDD2)
#define    d PIND&(1<<DDD3)
#define    e PIND&(1<<DDD4)
#define    f PIND&(1<<DDD5)
#define    g PIND&(1<<DDD6)

int main(void)
{
//////////////////////////////////////////////
DDRD = 0b0000000;
PORTD = 0b0000000;
DDRB = 0b11111111;
DDRA = 0b11;

while(1)
{
if(a)
{
if(b)
{
if(c)
{
if(d)
{
if(e)
{
if(f)
{
if(g)
{
PORTB = 0b11111111;//8k-8k99rpm
PORTA = 0b1;
}
else
{
PORTA = 0;
PORTB = 0b1;//0-999rpm
blinkt;
PORTB = 0;
blinkt;
PORTB = 0b1;
}
}
else
{
PORTB = 0;
PORTA = 0;
}
}
else
{
if(g)
{
PORTB = 0b1111;//3k-3k99rpm
}
else
{
PORTB = 0;
PORTA = 0;
}
}
}
else
{
if(f)
{
if(g)
{
PORTB = 0b11111111;//9k-9k99rpm
PORTA = 0b11;
}
else
{
PORTB = 0;
PORTA = 0;
}
}
else
{
PORTB = 0b11111111;//7k-7k99rpm
}
}
}
else
{
if(d)
{
if(e)
{
if(g)
{
PORTB = 0b111;//2k-2k99rpm
}
else
{
PORTB = 0;
PORTA = 0;
}
}
else
{
PORTB = 0;
PORTB = 0;
}
}
else
{
PORTB = 0;
PORTB =0;
}
}
}
else
{
if(c)
{
if(d)
{
if(f)
{
if(g)
{
PORTB = 0b111111;//5k-5k99rpm
}
else
{
PORTB = 0;
PORTA = 0;
}
}
else
{
PORTB = 0;
PORTA = 0;
}
}
else
{
PORTB = 0;
PORTA = 0;
}
}
else
{
PORTB = 0;
PORTA = 0;
}
}
}
else
{
if(b)
{
if(c)
{
if(f)
{
if(g)
{
PORTB = 0b11111;//4k-4k99rpm
}
else
{
PORTB = 0;
PORTA = 0;
}
}
else
{
PORTB = 0b11;//1k-1k99rpm
}
}
else
{
PORTB = 0;
PORTA = 0;
}
}
else
{
if(c)
{
if(d)
{
if(e)
{
if(f)
{
if(g)
{
PORTB = 0b1111111;//6k-6k99rpm
}
else
{
PORTB = 0;
PORTA = 0;
}
}
else
{
PORTB = 0;
PORTA = 0;
}
}
else
{
PORTB = 0;
PORTA = 0;
}
}
else
{
PORTB = 0;
PORTA = 0;
}
}
else
{
PORTB = 0;
PORTA = 0;
}
}
}

}
//////////////////////////////////////////////
}

Na ka gi beliko tik bekontaktis uzdegimas ir bus jau galima viska realizuoti, tai ka gi dar palaukite ir ko gero paskutinio atnaujinimo siame skyrelyje.

Štai jau tą pačią diena, dar vienas tachometro patobulinimas (supaprastinta programa, bei siek tiek schema):
///////////////////////////////////////////////////////////////////////////
////                   Skaitmeninis tachometras + LED                  ////
////                   PROGRAMA PARASE Saulius Stasys                  ////
////                   http://varzazaliam.blogas.lt/                   ////
////                   v.1.6 (16versija)                               ////
///////////////////////////////////////////////////////////////////////////

#include<avr/io.h>
#include<util/delay.h>

#define blinkt _delay_ms(100) ///jei norite paspartinti pirmojo led mirksejima, kai apsukos yra
///0-999rpm vietoje 100 parasykite mazesni skaiciu pvz 50, jei
///norite suletinti led’o mirksejima skaiciu padidinkite pvz 150

int main(void)
{
//////////////////////////////////////////////
DDRD = 0b0000000;
PORTD = 0b0000000;
DDRB = 0b11111111;
DDRA = 0b11;

unsigned char sk[10] = {
0b0111111, //0
0b0000110, //1
0b1011011, //2
0b1001111, //3
0b1100110, //4
0b1101101, //5
0b1111100, //6
0b0000111, //7
0b1111111, //8
0b1100111  //9
} ;
while(1)
{
if(PIND == sk[0])
{
PORTB = 0b1;//0-999rpm
blinkt;
PORTB = 0;
blinkt;
}
else
{
if(PIND == sk[1])
{
PORTB = 0b11; //1k-1k99rpm
}
else
{
if(PIND == sk[2])
{
PORTB = 0b111;//2k-2k99rpm
}
else
{
if(PIND == sk[3])
{
PORTB = 0b1111;//3k-3k99rpm
}
else
{
if(PIND == sk[4])
{
PORTB = 0b11111;//4k-4k99rpm
}
else
{
if(PIND == sk[5])
{
PORTB = 0b111111;//5k-5k99rpm
}
else
{
if(PIND == sk[6])
{
PORTB = 0b1111111;//6k-6k99rpm
}
else
{
if(PIND == sk[7])
{
PORTB = 0b11111111;//7k-7k99rpm
}
else
{
if(PIND == sk[8])
{
PORTB = 0b11111111;//8k-8k99rpm
PORTA = 0b1;
}
else
{
if(PIND == sk[9])
{
PORTB = 0b11111111;//9k-9k99rpm
PORTA = 0b11;
}
else
{
PORTB = 0;//arba jei neatitinka salygu visi portai = 0
PORTA = 0;
}
}
}
}
}
}
}
}
}
}
}

}

Na kaip ir baigta, nebent užsimanysiu pridėti tokių “pribombasų” kaip akumuliatoriaus krovimo indikatoriu, arba tiesiog dar supaprastinciau schema, ką gi sėkmės besimokinant elektronikos!!! P.S. kai realybeje sumeistrausiu foto ar video ikelsiu :D

Sveiki vel, vos šiandien (2011-01-05) gavus elektronikos dalis pradejau po trupučiuką realizuoti ši projektą, taigi pirmasis bandymas( signalu skaiciavimas, bei resetinimas):

Štai testavimo schema buvo tokia:

taigi jei kas ir nesuprato ka as video faile norejau pavaizduoti, tai signalu skaiciavimo, ir nuresetinimo iki 0 bandymas, kuris puikiausiai veikia.

Ko gero rytoj susideliosiu visą schemą ir žiūrėsiu kaip veikia viskas bendram vaizde.

Taigi dedant realybeje šį tachometrą, neatitinka toks dalykas, jog skaičiu užlaikymui netinka kondensatoriai, nes jų talpa turėtu būti keli skaiciai po kablelio, ir atitaikyti ju talpa būtų gana sunku, taigi, jau kogero paskutine versija būtų štai ši:

tai pat signalas skaiciuojamas, kai  IR fotortanzistorius nebegauna IR spindulių iš IR fotodiodo, ko gero viską pasakiau, ir turbūt kai šiandien pabaigsiu schema jos veikimo video ikelsiu arba siandien arba rytoj.

Demesio svarbus pakeitimas!!

variklio apsukos matuojamos ne aps/s (kaip as maniau), o aps/min-1. Tai reiškia jog jei tachometre rodoma 6000rpm variklis tuo metu sukasi 100aps/s:

pvz.:

6000rpm = 6000/60 = 100hz =100aps/s. Taigi teko šiek tiek pakeisti schemą, bei reikejo panaikinti vieną skaitmenį :(

Taigi, gerai, kad tachometro dar visiskai nesusidejau, kadangi siandien dar patobulinau schema, tai LED’ų švietimas, sumažinau iš mikrovaldiklio iseinančių išvadų skaičių nuo 10 iki 4, tiesa pridejau 74ls145(schemoje kitokia, taciau pagal išvadus visiskai identiška mikroschema)

schema:

Tai pat programa:


////////////////////////////////////////////////////////////////////////////
////    Skaitmeninis tachometras + LED                                  ////
////    PROGRAMA PARASE Saulius Stasys                                  ////
////    http://varzazaliam.blogas.lt/                                   ////
////                   v.1.8 (18versija)                                ////
////////////////////////////////////////////////////////////////////////////

#include<avr/io.h>
#include<util/delay.h>
#define blinkt _delay_ms(200)

#define mirktj _delay_ms(1)
#define mirkti _delay_ms(1)
#define mirkth _delay_ms(2)
#define mirktg _delay_ms(2)
#define mirktf _delay_ms(2)
#define mirkte _delay_ms(2)
#define mirktd _delay_ms(3)
#define mirktc _delay_ms(3)
#define mirktb _delay_ms(3)
#define mirkta _delay_ms(4)

/*jei norite paspartinti pirmojo led mirksejima, kai apsukos yra
0-999rpm vietoje 100 parasykite mazesni skaiciu pvz 50, jei
norite suletinti led’o mirksejima skaiciu padidinkite pvz 150*/

int main(void)
{
///////////////////////////////////////////////////////////////////////////////////////////////////
DDRD = 0b0000000;
PORTD = 0b0000000;
DDRB = 0b1111;

unsigned char
sk[10] = {
0b0111111, //0
0b0000110, //1
0b1011011, //2
0b1001111, //3
0b1100110, //4
0b1101101, //5
0b1111100, //6
0b0000111, //7
0b1111111, //8
0b1100111  //9
} ;
while(1)
{
if(PIND == sk[0])
{
PORTB = 0;//0-999rpm
blinkt;
PORTB = 0b1111;
blinkt;
}
else
{
if(PIND == sk[1])
{
PORTB = 0;
mirkta;
PORTB = 0b0001; //1k-1k99rpm
mirktb;
}
else
{
if(PIND == sk[2])
{
PORTB = 0;
mirkta;
PORTB = 0b0001;//2k-2k99rpm
mirktb;
PORTB = 0b0010;
mirktc;
}
else
{
if(PIND == sk[3])
{
PORTB = 0;
mirkta;
PORTB = 0b0001;//3k-3k99rpm
mirktb;
PORTB = 0b0010;
mirktc;
PORTB = 0b0011;
mirktd;
}
else
{
if(PIND == sk[4])
{
PORTB = 0;
mirkta;
PORTB = 0b0001;//4k-4k99rpm
mirktb;
PORTB = 0b0010;
mirktc;
PORTB = 0b0011;
mirktd;
PORTB = 0b0100;
mirkte;
}
else
{
if(PIND == sk[5])
{
PORTB = 0;
mirkta;
PORTB = 0b0001;//5k-5k99rpm
mirktb;
PORTB = 0b0010;
mirktc;
PORTB = 0b0011;
mirktd;
PORTB = 0b0100;
mirkte;
PORTB = 0b0101;
mirktf;

}
else
{
if(PIND == sk[6])
{
PORTB = 0;
mirkta;
PORTB = 0b0001;//6k-6k99rpm
mirktb;
PORTB = 0b0010;
mirktc;
PORTB = 0b0011;
mirktd;
PORTB = 0b0100;
mirkte;
PORTB = 0b0101;
mirktf;
PORTB = 0b0110;
mirktg;
}
else
{
if(PIND == sk[7])
{
PORTB = 0;
mirkta;
PORTB = 0b0001;//7k-7k99rpm
mirktb;
PORTB = 0b0010;
mirktc;
PORTB = 0b0011;
mirktd;
PORTB = 0b0100;
mirkte;
PORTB = 0b0101;
mirktf;
PORTB = 0b0110;
mirktg;
PORTB = 0b0111;
mirkth;
}
else
{
if(PIND == sk[8])
{
PORTB = 0;
mirkta;
PORTB = 0b0001;//8k-8k99rpm
mirktb;
PORTB = 0b0010;
mirktc;
PORTB = 0b0011;
mirktd;
PORTB = 0b0100;
mirkte;
PORTB = 0b0101;
mirktf;
PORTB = 0b0110;
mirktg;
PORTB = 0b0111;
mirkth;
PORTB = 0b1000;
mirkti;
}
else
{
if(PIND == sk[9])
{
PORTB = 0;
mirkta;
PORTB = 0b0001;//9k-9k99rpm
mirktb;
PORTB = 0b0010;
mirktc;
PORTB = 0b0011;
mirktd;
PORTB = 0b0100;
mirkte;
PORTB = 0b0101;
mirktf;
PORTB = 0b0110;
mirktg;
PORTB = 0b0111;
mirkth;
PORTB = 0b1000;
mirkti;
PORTB = 0b1001;
mirktj;
}
else
{
PORTB = 0b1111;//arba jei neatitinka salygu visi portai = 0
}
}
}
}
}
}
}
}
}
}
}
}

Ši schemos dalis tai pat išmeginta realybėje ji veikia tai pat gerai, tik nuo maitinimo į ledus buvau įdėjęs kiekvienam po 330r

Tai pat sugalvojau formulę, pagal kurią galima sužinoti važiavimo greitį, nežinant ratų sukimosi greičio:

(rpm x rato apskritimo ilgis)/60 x tam tikro bėgio perdavimo skaičius

na kaip pvz bus mano jawos duomenys

1 begio perdavimo skaicius 14,50

2 begio  8,60

3 begio 6,10

4 begio 4,95

rato apskritimo ilgis 2m (r18+padanga)

na tai dabar trumpas uzdavinuks- kokiu greiciu vaziuoja Sauliaus jawa 2 begiu kai variklis dirba 5000rpm

sprendimas:

(5000rpm x 2m)/(60 x 8,60) =  ~19 m/s x 3,6  = ~68km/h

Sveiki dar syki, štai rezultatas, kuriame nera reset ir signalus skaičiuoja, tuos, kuriuos generuoja ne555( beje nuo šiol geresne video kokybe):

Tai pat bekontaktes uzdegimo + daznio didinimo disko papeckiojimo video:

Tai pat is ko ir kaip zadu gauti signalus tachometrui, bei uzdegimo sistemai tai IR LED ir IR fototranzistorius:

Taigi, šiandien (2011-01-19) pradejau gaminti daznio didinimo ir uzdegimo diska, tik va beda, pastebėjau ,kad neturiu 6mm grąžtelio, be kurio negaliu padidinti centrines, bei isgresti uzdegimo momento skyles, tai šiandieninis darbo vaisius:

Na tai laukite rytojau pratęsiu :D

Rodyk draugams

Komentarai (15)

  1. [...] Skaitmeninis tachometras + bekontaktė uždegimo sistema [...]

  2. saunuolis!! noreciau ir as kanors panasaus pasidaryt tik man dar daug mokytis :)

  3. beto galejai ir ikelti kaip reliai wiskas atrodo ir kaip veikia bendram vaizdui susidaryt

  4. beto gal turi knygu apie elektronika pdf faile kiek skaitineja tai Stanislo Štaro knygos geros bet ju nerandu parsisiusti.

  5. Deja knygu neturiu, o sio tachometro pats dar nelabai skubu realizuoti, kadangi, dar sia ta pacia schema patobulinau gal dar pora kartu, ir dar uzdegima bekontakti sugalvojau paprastesni, tai vat jei netingesiu gal ir siandien ikelsiu naujausia schema, na o pats siaip esu perskaites tik viena Algimanto @epulausko Radiotechnikos praktikuma, o visa kita info tiesiog rasdavau internete ir taip po biski judu i prieki :D Tiesa turiu knnyga anglu kalba apie avr mikrovaldikliu programavima, taciau ji gan nemazai vietos uzima ir uploadinimas truktu tikrai nemazai laiko

  6. [...] Skaitmeninis tachometras + bekontaktė uždegimo sistema [...]

  7. sumasciau sukurti kai ka pats ir ka pasakytum zadu nusipirkti toki breadboard http://cgi.ebay.com/760-Point-Solderless-PCB-Breadboard-Jumper-wire-70pcs-/280600078642?pt=LH_DefaultDomain_0&hash=item4155116932#ht_2009wt_881
    ar tiks toks ivairiu schemu kurimui?

  8. siulyciau isigyti kiek didesne, nes ant mazu maketavimo ploksciu sunku susidelioti kokia nors sudetingesne schemute ant maniskes bijau pameluot apie 820 kontaktu, bet ir jų kartais per mazai siulyciau is kart pirkt panasaus dydzio kaip cia: http://evita.lt/det-5718-product.html

  9. aj:

    Sauliau, klausimelis kaip supratau kazkoki tai diskeli dejai tam kad nuskaityti RPM ( del kvaileliu RPM rotation per minute), kodel naisnaudojai esancios uzdegimo sistemos kuri jau turi info kada sprekti kibirksti??????
    Tarp kita ko kokia programavimo kalba rasai cia ???

  10. jei kontaktine sistema pasalinau, tai su ja jau neiseis skelt kibirksties kad ir kaip noretusi, na nebent vel deciau viska i vieta(t.y kontaktus), bet tada koks butu buves tikslas juos salinti, rasiau c kalba su avr studio

  11. aj:

    OOOOO! Malačius tiesiai šviesiai. Atleisk nepaskaičiau. Tai tu perdirbai į bekontaktę sistema. O realybei viskas veikia?

  12. aj:

    ta prasme ant moco.

  13. taip veikia, bet mocas vis tiek nevaziuoja, nes begiu perjunginejimo asies dar reikia, nes senosios “slicai ” ziauriai nugrauzti, tai kazkaip ant tokios asies nesinori deti naujos begiu perjunginejimo kojeles

  14. Jonas:

    Ar galima šia sistema pritaikyti 4cyl mašinos varikliui? kiek ji kainuoja?

  15. savaime aisku, kad taip, ziurint kelintu metu automobilis ar jis turi sukiu davikli ir ar ant smagracio yra paildomi dantys siam reikalui. O siaip manyciau automilyje geriau palikti tai kas originalu, geriau tikrai nebus :D

Rašyti komentarą