dc motor hiz olcumu sorunu ccs c

highvoltag

Üye
Katılım
10 May 2009
Mesajlar
13
Puanları
1
Yaş
37
arkadaslar ben dc motorun hizini olcup lcd ye yazan bi projeyle ilgileniyorum.kizil otesi sensor den gelen verilerle motor hizini olcmek istiyorum fakat programda bi hata var ve bulamadim.motorun ucunda bi daire var ve uzerinde 6 tane delik var dairenin bir tarafinda sensor diger tarafinda led var ve deliklerin sayisini sayiyor. pic lede bunu isleyip lcd ye yaziyor fakat lcd de devamli 0 gorunuyor.sadece deliklerin sayisini aldigimda ise yani (hiz=sayac; ) olarak degistirdigimde ise 134 gibi sacma bir sayi cikiyor program her 50ms de kesime gidiyor ve fonksiyonu isliyor bu arada sayac taki degeri 100ms de bir isliyor ve hiz degiskenine atiyor 1 sn de bir ise lcd ye yaziyor kodlardaki hatayi bulamadim anlayan arkadaslar bi bakarsa sevinirim yada baska hiz olcme yontem ve projeleri varsa elinizde cok mutlu olurum yorumlar icin simdiden tesekkurler.

#include <16f628.h>
#fuses xt,nowdt,noprotect,nobrownout,nolvp,noput,nocpd
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(a)
#define use_portb_lcd true
#include <lcd.c>
int sayac,i=0,sn=0;
float hiz;
#int_timer0
void timer0_kesmesi()
{
set_timer0(60);

i++;
sn++;
if(i==2)//100 ms olmasi icin denetleme
{
hiz=((10*sayac)/6)*3600*0.001; //hizi km/h cinsinden yaziyor, hiz=sayac yapnca 134 degerini veriyor.
sayac=0;
i=0;
}
if(sn>=20)//1sn olunca lcd ye yaz
{
sn=0;
printf(lcd_putc,"\f HIZ:%f KM/H",hiz);
}
clear_interrupt(int_timer0);
}
void main()
{


setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

lcd_init();
set_tris_a(0x10);
output_a(0x00);
set_tris_b(0x00);
output_b(0x00);
setup_timer_0(rtcc_internal|rtcc_div_256);
set_timer0(60);
enable_interrupts(int_timer0);
enable_interrupts(global);
while(1)
{

while(pin_a0==0); //puls gelmesi icin bekliyor
sayac++;
while(pin_a0==1);
}

}
 
Son düzenleme:
Bu tip yardım isteklerinda çalışma dosyalarını (proteus , ccs gibi) vermek desteği kolaylaştırıdığı gibi çoğaltır...
Kodları code tagları( # sembolüne tıklayın) arasına almak okumayı-görüntüyü kolaylaştırır.
---------
Timer kesmesi değilde donanım kesmesi kullanmalısın.
B0 olabilir , B4-7 olabilir.

Optodan gelen sinyali kesme bacağına girersin.
Kesme oluştuğunda :
sayı++ ;
yapıp hemen çıkarsın.
Ana programda ise lcd ye yazdırırsın.
Gerekirse dakikadaki ( veya başka periyot)devir için gerekli hesapları aldığın sayı değeri değeri üzerinden hesaplarsın.
Bunun için timer kullanabilirsin...
----
Edit :
sayı değişkeni , olası değerine uygun biçimde tanımlanmalıdır!!!
 
Son düzenleme:
Yonteminiz yanlis. Bu tip uygulamalar icin en saglikli yol donanimsal olarak (RB0 veya RBCHANGE )kesme fonksiyonlarini kullanmaktir. ISR icinde ise counter islemlerini yaparsiniz. Timer yine kulanilir. Birim zamanda; ornegin her 100 ms de bir counter degerine bakarak hizi formulize eder, LCD de gosterirsiniz. ISR icinde counter degerini okuduktan sonra sifirlamazsaniz her okumanizda hiz bilgisi yaklasik 2 ye katlanarak olusur ve hatali okumanza sebep olur.
 
arkadaslar yardimlariniz icin cok tesekkurler problemi hallettim sadece sure ayarlamalariyla ilgili kucuk degisiklikler yapacagim dediginiz gibi dis kesme ve timer0 kullandim problem halloldu hemen yaziym dedim isine yarayacak arkadaslar vardir diye kodlari gonderiyorum hizi sayac degerine esitledim siz onu hizini hesaplatacaginiz seyin yaricapina gore yazarsiniz arkadaslar sizede tekrar cok tesekkur ediyorum bu arada 16f877 ye gore yazdim kodlari diger pic lere gorede kodlar yeniden yorumlanabilir.


#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#include <lcd.c>
#priority ext, timer0
#use fast_io(b)
#use fast_io(d)

int sayac,i;
float hiz;

#int_ext
void ext_kesmesi()
{
sayac++;

}

#int_timer0
void timer0_kesme()
{

set_timer0(60);
i++;

if(i=20)
hiz=sayac;
sayac=0;
printf(lcd_putc,"\fHIZ=%f KM/H" ,hiz);



}

void main()
{
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED, 0,1);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);

set_tris_d(0x00);
output_d(0x00);
set_tris_b(0x01);
output_b(0x00);
lcd_init();

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
set_timer0(60);
ext_int_edge(H_TO_L);

enable_interrupts(INT_EXT);
enable_interrupts(INT_timer0);
enable_interrupts(GLOBAL);

while(1);
}
 
Son düzenleme:
iyi günler bu projenin bitmiş kodlarını paylaşabilirmisin...
 

Forum istatistikleri

Konular
128,212
Mesajlar
915,856
Kullanıcılar
449,990
Son üye
alpersirakaya

Yeni konular

Çevrimiçi üyeler

Geri
Üst