tmr0 ile devir ölçme (soru)

Başlatan burak1000, 31 Temmuz 2008, 13:24:59

burak1000

merhaba anlayan arkadaşlara bir sorum olacak aslında ben de anlıyorum ama burada takıldım pıc basıc pro kullanıyorum
:D
bir devre yapıyorum amacı şu;

bu elektrik üreten bir dinamo 15v'luk

bunun la bir aküyü şarj ediyorum

1:REED RÖLE'den gelen sinyallare göre rpm(devir cinsinden) hıznı lcd ekran da gösterecek

reed role kullanarak bir turun atıldığı süreyi heaplayarak pervanenin devirini bulacam
yani peryot u kullanarak deviri hesaplayacam

aynı bisiklet hız göstergesindeki gibi ayrıntılı bilgi için ;
http://www.biltek.tubitak.gov.tr/gelisim/elektronik/31.htm



2:dc dinamo olduğu için elektriğin yönüne göre rüzgarın tipini söyleyecek


3:
dinamo ile bir aküyü şarj ediyoruz aynı zaman da bu akünün gerilimini lcd ekranda gösterece

4:
son olarak :D
akü nün voltaj seviyesine boş mu dolumu yok sa  akü şarj mı oluyor diye yazacak

amaç bu ben hepsini yaptım ama hız kısmında takıldım
soru şu;
ben bu kadar kod yazdım ve hızı şöyle ölçmeyi denedim;
ilk önce tmro kesmesini kullandım her kesme olduğunda sinyal durumunu ölçerek iki sinyal arasındaki zamanı hesaplamayı denedim ama pıc çok hızlı işlem yaptığından röle kontakları daha bırakmadan ikin ci komutu aldığı için sistem sapıttı kesme oluşturarak beceremedim sonra pause komutu ile denedim gine olmadı yani anlayacağınız
ben diğer komutlarla beraber bu işi becerremedim yardımcı olursanız çok sevinirim
soru biraz zor ama yapacak kişiler olduğuna inananıyorum:D




DEVRE ŞEMASI:






pbp kodları:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 23.07.2008                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
DEFINE LCD_DREG PORTD 'LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT 4 'LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG PORTD 'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 3 'LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RWREG PORTD 'LCD RW Bacağı PortB de bağlı
DEFINE LCD_RWBIT 2 'LCD RW Bacağı 2. bite bağlı
DEFINE LCD_RSREG PORTD 'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 1 'LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit olarak bağlı
DEFINE LCD_LINES 2 'LCD 2 sıra olarak çalışıyor.
DEFINE  ADC_BITS        10    
DEFINE  ADC_CLOCK       3    
DEFINE  ADC_SAMPLEUS    75
 

TRISB=%00001111 
TRISA = %11111111
W VAR BYTE
S VAR BYTE
C VAR BYTE
A VAR BYTE
T VAR BYTE
RPM VAR WORD
H VAR BYTE[6]
adval  VAR WORD
VOLT VAR BYTE
MVOLT VAR BYTE
Ak VAR BYTE[6]
X VAR BYTE
Q VAR BIT
 PAUSE 50 


 
  CLEARWDT  
 ON INTERRUPT  GOTO KESME
 OPTION_REG=%10000101
 INTCON=%10100000
 TMR0=0

CLEAR
START:




ANA
IF PORTB.1=1 THEN PO
IF PORTB.2=1 THEN LO
GOTO DU

AKU:


BAK:
 ADCON1 = %10000010		
        Low PORTE.2			

   

 	ADCIN 0, adval				
		adval = (adval */ 500)>>2		
      	    
        adval = adval * 32
        adval = adval / 10
        VOLT=(ADVAL/100)

AKUKON:
IF PORTB.3=1 THEN SA
IF VOLT<6 THEN BO
IF volt>6 AND volt<12 THEN NO
IF volt >=12 THEN DO


LCD:
IF RPM>85 THEN
  PORTB.4=1
ELSE
  PORTB.4=0
ENDIF





 LCDOUT $FE, 1
X=0
LCDOUT "HIZ:",DEC2 RPM ,"RPM " 
FOR W=0 TO 5
LCDOUT , H[W]
NEXT W


LCDOUT $FE, $C0 
LCDOUT ,"AKU:",DEC2 (ADVAL/100),",", DEC1 ADVAL,"V"
for x=0 to 6
lcdout ,ak[x]
next x
  PAUSE 50
  

GOTO START

PO:
H[0]="P"
H[1]="O"
H[2]="Y"
H[3]="R"
H[4]="A"
H[5]="Z"
 GOTO AKU

LO:
H[0]="L"
H[1]="O"
H[2]="D"
H[3]="O"
H[4]="S"
H[5]=" "
 GOTO AKU

DU:
H[0]="D"
H[1]="U"
H[2]="R"
H[3]="G"
H[4]="U"
H[5]="N"
 GOTO AKU

BO:
Ak[0]=" "
Ak[1]="B"
Ak[2]="O"
Ak[3]="S"
Ak[4]=" "
Ak[5]=" "

 GOTO LCD

NO:
Ak[0]=" "
Ak[1]="O"
Ak[2]="R"
Ak[3]="T"
Ak[4]="A"
Ak[5]=" "
 GOTO LCD

DO:
ak[0]=" "
Ak[1]="D"
Ak[2]="O"
Ak[3]="L"
Ak[4]="U"
ak[5]=" "

 GOTO LCD

SA:
Ak[0]=" "
Ak[1]="S"
Ak[2]="A"
Ak[3]="R"
Ak[4]="J"
Ak[5]="D"
AK[6]="A"
 GOTO LCD


DISABLE

KESME:
IF PORTB.0=0 AND Q=0 THEN TOGLE
IF PORTB.0=0 AND Q=1 THEN ANAHES
IF PORTB.0=1 AND Q=0 THEN SIFQ
IF PORTB.0=1 AND Q=1 THEN SAY


TOGLE:
TOGGLE A
IF A=0 THEN RES

SAY:
S=S+1
IF S=6 THEN
  GOTO HES
ELSE
 GOTO RES
ENDIF






HES:
IF T>4500 THEN GOTO SIFR
T=T+98
GOTO RES



   ANAHES:
   
   RPM=(60000/T)
   GOTO TOGLE


  SIFR:
  RPM=0
  GOTO RES








SIFQ:
S=0
T=0
GOTO RES

 RES:
RESUME

ENABLE

END




devre şemasını buradan indirebilirsiniz:
http://rapidshare.com/files/133784883/0-12V_ADC.DSN.html
alternatif link:
http://www.2shared.com/file/3680919/933f3f0c/0-12V_ADC.html[img]

demirkan1

OPTION_REG 'in 4. bitini 1 yaparsan sorun düzelir

burak1000

Alıntı yapılan: "demirkan1"OPTION_REG 'in 4. bitini 1 yaparsan sorun düzelir

teşekkürler ama option_reg in 4. biti kristal osilatör ün ürettiği frekansın yükselen kenarında mı yoksa düşen kenarındamı sayım yapılacağı ile ilgili değilmi ben pek bir alaka kuramadım ama denerim ve sonucu yazarım.
:D

burak1000

yaptım herhangi bir değişiklik olmadı adminler felan bir el atabilirmi acaba?
:)

parda

Merhaba ;

Herşeyden önce mıknatısı hall-effect sensör ile takip etmeni tavsiye ederim.

-sayıcıyı capture modunda kullanabilirsin.
-harici interrupt girişine sensörü bağlayıp bir int de sayıcıyı sıflayıp baslatıp, sonrakinde de sayıcı değerini okuyup devri hesaplayabilirsin

kolaylıklar
Bildiğim tek şey, hiç bir şey bilmediğimdir.

burak1000

bende bu şekilde yapmayı denemiştim ama olmadı yada ben beceremedim :D

stlg

Urettigin gerilimin dc oldugunu soyluyorsun, uretilen gerilim hız bilgisiyle dogru orantılı dersek, gerilimi olcup ,hızı hesaplayıp gostergeye o sekildede gonderebiliriz
ALLAHA EMANET OLUNUZ Hoştur bana senden gelen,  Ya gonca gül yahut diken,  Ya kaftandır yahut kefen,  Kereminde hoş lütfunda hoş.

burak1000

teşekürler
ama şöyle bir durum var akü şarj olurken dinamo uçlarındaki gerilim seviyesi düşeceğinden dolayı gösterilen hız bilgisi hiç te sağlıklı olmaz

:D

Tagli

Hız ölçümü için optik encoder da kullanılabilir.  :idea: Gerilim seviyesi değişiyorsa analog bir okuma yanlış sonuca götürebilir bence.
Gökçe Tağlıoğlu

picusta

Alıntı yapılan: "burak1000" teşekürler
ama şöyle bir durum var akü şarj olurken dinamo uçlarındaki gerilim seviyesi düşeceğinden dolayı gösterilen hız bilgisi hiç te sağlıklı olmaz

:D
Okuma yapacagin vakit sarji anlik olarak kesmelisin. Motordaki akim sifirlaninca okuyacagin gerilim dogrusal olarak hizla baglantili.
PIC'in capture pinini kullan, timer overflow edince milisaniye degiskenini arttir. Capture oldugu vakit okursun.
Sorunun bir nevi debounce sorunu.

burak1000

öncelikle tüm çabalarınız için çok teşekkürler ama ufak ikişey   söylemeliyim
1. benim maddi durumum o kadar iyi sayılmaz yani optik veya normal encoder alacak imkanım hiç ama hiç yok.bide projede her zaman en düşük maliyeti yakalamaya çalışırım (çinliler gibi :D)

2.şarjı anlık olarak kesebilirim fakat ben kurşun asitli (yani araba aküsü şarj ediyormum) akü kullanıyorum şarj esnasında vırt zırt gerilimi kesmek akünün ömrünü olumsuz yönde etkileyeceği düşüncesindeyim
mesela şarj esnasında ben 10sn aralıklarla ölçüm yapsam
akü 5 saat boyunca şarjda iken


5*60*60=18000saniye eder

18000/10= 1800 kere gerilimin kesillip tekrara verilmesi demek tir bu
sadece bir gün için geçerli
yardımlarınız için tekrar teşekkürler :D

burak1000

kimse cevap vermeyecek mi yav illaki bunun bir cevabı vardır pratik olarak yazılım ile oynamak suretiyle birşeyler yapılabilir proje tamamlandığı zaman forumda yayınlayacağım
insanlar faydalanması için :D

karbal656

IF PORTB.0=1 THEN 
ON INTERRUPT GOTO KESME
OPTION_REG=%10000101
INTCON=%10100000
TMR0=0
ENDIF
..............
DISABLE
KESME:
SAYI=SAYI+1
INTCON.2=0
IF PORTB.0=1 THEN
INTCON=%00000000
DEGER=SAYI
SAYI=0
ENDIF
RESUME
ENABLE

Buradaki mantık şu portb.0 'a bir sinyal gediğinde TMR0 çalışıyor
ve değişkeni bir artırıyor .devir tamamlanıp ikinci defa sinyal gelince saymayı bitiriyor. DEGER adlı değişkeni okuyarak bir sonuç alabilirsin .
Başarılar.

stlg

Uretec ile aku arasında sarj devresi yokmu ,uretec uclarındaki gerilim aku takılıyken neden dussun ozaman uretec cekilen akımı karsılamıyor demektir yada akım sınırlaması yoktur
ALLAHA EMANET OLUNUZ Hoştur bana senden gelen,  Ya gonca gül yahut diken,  Ya kaftandır yahut kefen,  Kereminde hoş lütfunda hoş.

stlg

Yada kafanı karıstırmayalım ,en kolayı analog girislerden bir tanesini kullan ,pic ile algılayıcı arasıma f/v cevirici yap en basiti LM2907-LM2917
kullanman
ALLAHA EMANET OLUNUZ Hoştur bana senden gelen,  Ya gonca gül yahut diken,  Ya kaftandır yahut kefen,  Kereminde hoş lütfunda hoş.