Optik Sensör iLe RPM ÖLÇÜMÜ.. Yardım..

Başlatan mieL, 06 Temmuz 2009, 19:00:47

mieL

CNY 70 i dönen motorun miline bağlayacağım tekerleğin üstüne çekmeyi düşündüğüm beyaz şerit ile CNY 70 ' den 1-0 geLişine göre geçen süreyi hesaplatıp Periyodunu bulup , V=60000/T den devir/dakika cinsinden hızını hesaplatmak istiyorum(periyot miLisaniye cinsinden olduğundan 60/[T*10^(-3)] = 60000/T oLmaktadır..)

CNY70 den gelen sinyali RB0 kesmesiyle (düşen yükselen kenar) yapmaktayım.. Zamanı ise 50 ms de bi Değişken=Değişken+50; oLucak şekiLde timer2 ile hesaplatmaktayım..



Program burda arkadaşLar , memLeketime dönücem , bu Proje yüzünden dönemiyorum... İNTERNETTE BUNUN HAZIRI VAR tarzında yorumLar yapmazsanız sevinirim , 16F877 iLe yapmak zorundayım (ki ayrıca hazırını götürünce Hocayı mı kandırmış oLurum yoksa kendimi mi :) )





HATAMI BULUP DÜZELTEBİLEN ARKADAŞA DUACI OLACAĞIM ... :)





--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



#include "D:\Documents and Settings\Administrator\Desktop\Dayi\dayi.h"

#define use_portd_lcd TRUE
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_TYPE 2
#include <lcd.c>
#use delay (clock=4000000)


int8 patates=0;
int8 kofte=0;
int8 patlican=0;


#int_ext
void KofteciGuzeli()
{
patlican=6000/kofte; // her düşen kenarda Kesme oLuşturmak kaydıyLa geçen süreye bağlı olarak HIZ hesaplaması yapıp
kofte=0; // Değeri PATLICAN değişkenine atıyoruz. Bundan sonra Köfte değerini sıfırlıyoruz ki , zaman hesaplaması
} // tekrar sıfırdan başlasın ve motor her turu kaç saniyede tamamlayabiliyo hesaplayabilelim :)




#INT_TIMER2
void zaman()
{
kofte=kofte+50; // osilatör frekansına bağlı olarak 50 ms de bi kofte değişkenini 50 arttırıyoruz ...
}




void main()
{
lcd_init();
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_16,240,13);
ext_int_edge(H_TO_L);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);



while(1)
{
lcd_gotoxy(1,1);printf(lcd_putc,"%02d Devir/Dakika",patlican); // "XX Devir / Dakika" yazdırıyoruz , XX değeri 100 ms de bir değişir.
delay_ms(100);
}

}




--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ferdem

Kodda eksik olan yerleri aşağı yazdım ancak bu eksiklikleri gidermek projeyi düzgün çalışır hale getirmeyebilir. Bu eksikler:

1) kofte değişkenini 50 şer 50 şer arttırıyorsunuz ama değişkeni 8 bitlik(en fazla 255) tanımlamışsınız. int16 olarak düzeltebilirsiniz. 50 şer 50 şer değil 1 er 1 er arttırın formülde köfte nin yerine köfte*50 yazarsınız.

2) timer2 kesmesini "enable" yapamayı(kurmayı) unutmuşsunuz.
enable_interrupts(int_timer2);

3) (Çok önemli bir eksik değil) Harici kesmede timer2 nin değerini de sıfırlamalısınız. Her şey temiz olsun ;)

Probleminizi anlatırken karşılaştığınız en son durumu(hatayı vb.) yazarsanız daha hızlı cevap alırsınız.(Örn: Kodu derleyip çalıştırdığımda LCD de hep 1 yazıyor, LCD de 10 yazıyor bir daha da değişmiyor gibi)

Kodu simüle ediyor musunuz bilmiyorum ama eğer bu imkanınız varsa herhangi bir kesmenin içine output_high(pin_a0) yazıp o kesmeye girip girmediğini kolayca anlayabilirsiniz. Timer2 kesmesi her olduğunda yine bir pini "toggle" edip o pinin frekansına bakarak timer2 kesmesinin doğru çalışıp çalışmadığına bakabilirsiniz. Basit küçük testlerle projenizi adım adım ilerletin. Yüksek seviyeli dil kullanırken bu gibi testler yapmak hatayı bulmamızı kolaylaştırıyor.

İnternetteki diğer örnekler kopyalamak için değil de incelemek için güzel kaynaklar. Picproje de arama yapabilirsiniz, bu konu şu başlıkta konuşulmuştu:
http://picproje.org/index.php/topic,22551&highlight=devir

Bir de ölçüm için 50ms lik çözünürlük düşük olabilir. Mesela saniyede 5 devir yapan motor ile 6 devir yapan motor arasında 50ms den daha az bir periyot farkı var, daha yüksek devirliler arasında daha daha az fark var. Timer2 yi prescale, postscale kullanmaksızın yalın haliyle kullansanız bile kesmeleri saymak için 16 bitlik kofte değişkeni size yeter.

Bu tarz çalışmalar kolay gibi görünüyor, iyi kötü çalışan bir şey çıkıyor ortaya ama hassas ölçüm yapmak için dikkatli çalışmak gerek. Bunları bir deneyin, problemler devam ederse forumda bir çözüm bulunur. Kolay gelsin.

İyi çalışmalar.

murataltas

cny 70 ten sonra picle arasına 74hc14 koymalısın

oooben

acaba rica etsem ben de devir saymaya dönüşü encode etmeye çalışıyorum opamp ve ır sensör ve ledler den pek bilgim yok 16877a kullanıyorum
dc fırçalı motorun arkasına basit bi düzenek yapıp yazıcımdan çıkarttığım şeffaf üaerine çizgileri olan bi bant kullanmak istiyorum
bu ir sensörlerin alıcı ve vericisini 74hc14 gibi bir opampla beraber çizebilirmisiniz
teşekkürler