Hız ölçer (speedometer)

Katılım
10 Haz 2012
Mesajlar
7
Puanları
1
Arkadaşlar merhabalar. Uzun zamandır siteyi takip ediyorum ama ilk mesajımız bu güne kısmetmiş :).

Buradaki amacım aslında hem paylaşım hemde bir sorunumu dillendirmek.

16f887 ile hız ölçer yapıyorum. Klasik reed sensörü kullanıyorum. Tamamen buton mantığıyla hareket ettim programı yaparken. Fakat bir sorunum varki ne olduğunu halen çözemedim. Proteus'ta malum reed röleyle sağlıklı olmayacağını düşündüğüm için buton koydum (daha doğrusu reed rölenin varlığını hiç merak edipte bakmadım :D ). Debouncing i engellemek içinde if döngüsünün içine bir tanede while yerleştirdim. Fakat ne zaman butonu aktif etsem, saçma sapan rakamlar veriyor. Daha önce denediğimde gayet güzel çalışıyordu (timer koymadan önce). Fakat dediğim gibi şu anda doğru ölçüm yapamıyorum. Ayrıca proteusta butona paralel kapasitör ekledim (röle frekansı düşük olacağı için 1nF koydum), if içerisindeki while ı çıkardım, vs. vs.

Eğer bu sorunuda çözersek proje tamamen hazır hale gelecek. Daha sonra gerek kopya çekmeye, gerek aynısını kullanmaya, gerek geliştirmeye tamamen açık bir program :). Program CCS-C de yazıldı. Timer mantığını halen oturtamadığım için birazcık sağdan soldan kopya çektim. Her saniyede seconds variable ı 1 artıyor. ayrıca program 5 saniyede bir ortalama hız veriyor.

kodlar ;

//---------------------------------------------------------------------
//Speedometer For Linear Motor.
//Magnetic sensor (reed sensor) used on this project.






#INCLUDE <16F887.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=20000000)
#include <lcd.c>
#use fast_io(c)
#use fast_io(b)
#define pi 3.14;
#define high_start 76
#define INTS_PER_SECOND 76 ;
//seconds is correct. trouble with counter.


int counter=0 ;
long speed = 0;
int radius = 2 ; //will calibrate for the distance. just example.
int seconds ;
int int_count ;


#INT_RTCC //seconds increases every second.
void clock_isr(){
if(--int_count==0) {
++seconds;
int_count=INTS_PER_SECOND;

} }







void main() {




lcd_init(); //lcd is ready
set_tris_c(0xff); //c port is input
set_tris_b(0x00); //b port is output (used for led)
output_b(0x00); //b becomes logic 0
int_count=INTS_PER_SECOND;
set_timer0(0);
setup_counters( RTCC_INTERNAL, RTCC_DIV_256 | RTCC_8_BIT);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);

while(1){


if(input(pin_c0)==1){

while(input(pin_c0)==1) //while added for eliminate debouncing

{
counter ++;
output_toggle(pin_B0);} //counter increases & output led changes status

}

if (seconds ==5)
{

speed = (2.0*3.14*counter*radius)/seconds ; //speed in 5 seconds (average).
seconds = 0;
counter = 0;

}

lcd_gotoxy(1,1); //lcd stuff
printf(lcd_putc ,"speed = %ld" , speed ); //lcd stuff
lcd_gotoxy(1,2); //lcd stuff
printf(lcd_putc ,"counter = %d" , counter); //lcd stuff
}
}


//--------------------------------------------------------------------------
 
S.A. DEĞİŞKEN TANIMALRINDA ONDALIKLI İŞLEM YAPACAKSAN EĞER DEĞİŞKENLERİNİ ONA GÖRE TANIMALRSAN İŞLEMDE HATA ÇIKMAZ. LONG YANLIŞ HATIRLAMIYORSAM 32 BİT ONDALIKSIZ SAYILAR İÇİN. FLOAT16 VE FLOAT32 İSE 16 VE 32 BİT ONDALIKLI SAYILAR İÇİN DİYE HATIRLIYORUM. Bİ DE ONDALIKLI SAYILARLA TAM SAYILAR ARASINDA İŞLEM YAPARKEN PROĞRAMA SONUCUN ONDALIKLI OLACAĞINI BİLDİRMEN İŞLEMİN SAĞLIĞI AÇISINDAN ÖNEMLİDİR. İŞLEMDEN ÖNCE (INT16) , (INT32) , (FLOAT16) , (FLOAT32) GİBİ . ÖRNEĞİN;

FLOAT32 X ;
X = (float32) (Z/T) ;

KOLAY GELSİN.
 
Tekrardan merhabalar. programdaki sorunu buldum. bir parantez hatası var sadece :) birde speed variable ını float olarak tanıtınca sorun kendiliğinden çözüldü :). kodu kullanacak olan arkadaşlar (tam kopya olmasın en azından biraz kurcalayın çok şey öğretiyor) lütfen son halini atarmısın diye sormayınız atmayacağım. Forumun havası bile yaradı yahu :)
 

Forum istatistikleri

Konular
128,098
Mesajlar
914,955
Kullanıcılar
449,798
Son üye
jsons

Yeni konular

Geri
Üst