Ingo Electronics

PIC16F628 TACHOMETRAS  (TACHOMETER  120 to 9000 RPM)

             Tachometras, kurio schema pateikta žemiau, matuoja žemo dažnio impulsus, kurių periodas nuo  0.5  iki 0,066 sek, kas atitinka  120 - 9000 rpm (angl. revolutions per minute).
Tachometras tinkamas įvairių   mechanizmų sukimosi greičiui matuoti.

Schemoje panaudotas mikroprocesorius PIC16F628, kuris skaičiuoja  impulsų skaičių per minutę (rpm). Impulso lygis, gaunamas iš daviklio, turi būti 4-5V ir jo plotis ne mažiau kaip 4us.
Davikliui galima panaudoti bet kokią shemą, kuri  sukantis mechanizmui duoda 5V ir ne mažiau 4us pločio impulsus.

Šioje schemoje panaudotas optopertraukilis LTH860-T55, kurį galima isigyti  www.evita.lt.

Davikliui taipat galima panaudoti herkoninius ar mechaninius kontaktus, arba surinkti schema iš poros detalių: IR diodo ir IR imtuvo kuriuos galima išimti iš nebenaudojamos kompiuterinese pelės . Kaip šiuos elementus sujungti parodyta shemoje, elementai U5,D1,J4.

Mikrokontroleris rpm skaičiuoja pagal formulę: rpm= 60/T , kur T yra impulsų periodas.
Mikrokontroleris išmatuoja periodą T tarp dviejų impulsų, apskaičiuoja rpm ir rezultatą išveda į 4 skilčių dinaminį LED displėjų.
Periodas matuojamas mikrokontrolerio registro TMR1 pagalba.
TMR1 pasileidžia nuo signalo priekinio fronto ir yra stabdomas kai gaunamas sekantis priekinis signalo frontas iėjime RB3/CCP1. Tokiu būdu, TMR1  gaunamas dviejų  baitų binarinis skaičius, pagal kurį, žinant procesoriaus taktinį dažnį, yra paskaičiuojamas signalo periodas.

Jeigu rpm rezultatas išeina iš 120-9000 diapazono, tai jei rpm<120 indikatorius rodys 0000, jeigu rpm >9000, indikatorius rodys 8888.

Schemoje, siekiant sumažinti indikacijai naudojamų mikroprocesoriaus išėjimų skaičių , papildomai panaudota mikroschema SN74LS247 ,tai yra BCD-to-Seven-Segment Decoderis/Driveris, LED indikatoriaus valdymui.
Elementai X2,C6,C7 šioje tachometro PIC‘o  programos versijoje nenau
dojami.

Proteus v7.2 SP2 schemos testavimo failas:

 

Proteus v7.2 SP2 projektas:

 

 hex failas 1versija PIC16F628 programavimui.

 

Žemiau pateikiamas C kodas mikroC v6.2.1.0 kompiliatoriui:

//PIC16F628 4mhz, apsisukimu per minute skaiciavimas.
//Impulsai is daviklio paduodami i RB3/CCP1 iejima.
//Gali matuoti nuo 120 iki 9000 aps/min.
//Rezultatas isvedamas i 7segm.4el.LED  indikatoriu.
//Skaiciuojamas periodas naudojant TMR1 ir pertraukimus nuo CCP1 modulio.
//Jeigu rpm maziau uz 120aps/min, indikatorius rodo 0000.
//Jeigu rpm daugiau uz 9000aps/min, indikatorius rodo 8888.

unsigned int RPM,IMP,binval,read1=0;
unsigned char asc[4],k;                          //LED  indikatoriaus buferis


void itoa4(unsigned int binval);           //funkcija 2baitu binarini skaiciu konvertuojanti i 4baitu desimtaini
void segm_display();                           //isvedimo i indikatoriu funkcija

void skaic();                                        //RPM skaiciavimo ir isvedimo i LED indikatoriu funkcija


void interrupt(){
if (PIR1.CCP1IF==1){
PIR1.CCP1IF=0;
read1= CCPR1H<<8;
IMP = (read1 | CCPR1L)+15;
if (PIR1.TMR1IF==1) {IMP=0;};       
//PIR1.TMR1IF -taimerio TMR1 persipildymo flagas
TMR1L=0x00;
TMR1H=0x00;
PIR1.TMR1IF=0;}
}

void main() {
CMCON   = 0b00000111;   
//Turn comparators off
VRCON = 0;                        //atramines itampos nustatymo registras

INTCON.GIE =1;                  //leidziami visi pertraukimai
INTCON.PEIE=1;                
//leidziami pertraukimai nuo periferiniu moduliu
PIE1.CCP1IE=1;                 //leidziami pertraukimai nuo CCP1 modulio
T1CON=0b00110001;       
//TMR1 "ON",vidinis taktinis daznis,daliklis 1/8
                                         //T1CON.F0 -ijungia/isjungia TMR1 moduli
                                         //T1CON.F1 - TMR1 taktinio signalo pasirinkimas (vidinis "0",arba isorinis(kvarcas) "1".
                                         //T1CON.F2 - sinchronizacija (siuo atveju nebutina)
                                         //T1CON.F3 - vidinio operacinio antram kvarcui pajungti ijungimas
                                         //T1CON.F4,T1CON.F5 -  TMR1 daliklio ijungimas
PIR1.TMR1IF=0;               //TMR1 persipildymo flagas
PIR1.CCP1IF=0;                //CCP1 modulio flagas

CCP1CON=5;                     // Capture Mode + Rising Edge
TRISA = 0 ;
TRISB = 0b0001000;        
//TRISB.F3 -Capture pin
TMR1L=0;
TMR1H=0;
IMP=0;

while (1){
skaic();
}
}
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
void skaic(){
if (IMP >= 750) {RPM=7500000/IMP;};
if (IMP < 750) {RPM=8888;};
if (IMP==0||PIR1.TMR1IF==1)    {RPM=0000;};
binval = RPM;
itoa4(binval);
segm_display();

}
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
void segm_display(){
for (k=0; k<20; k++) {
PORTB=0b10000;
PORTA = asc[3] ;
DELAY_MS(5);
PORTB=0b100;
PORTA = asc[2] ;
DELAY_MS(5);
PORTB=0b10;
PORTA = asc[1] ;
DELAY_MS(5);
PORTB=0b01;
PORTA = asc[0] ;
DELAY_MS(5);
PORTB=0;
}
}

//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
void itoa4(unsigned int binval){
int step[]={1000,100,10,1};
unsigned int temp,val;
unsigned char i,atemp;
val=binval;
for (i=0; i<4; i++)
{temp=step[i];atemp=0; while(val >= temp){atemp++;val-=temp;}
asc[i]=atemp;
//end for
}