Step motor ile yapılan kontrol cihazında oluşan sorun

Başlatan Elektronikprojem, 02 Aralık 2016, 16:49:53

Elektronikprojem

Merhabalar herkese,
Step motorla bir proje gerçekleştirdim. Projemde step motor ile  0-1-2-3 kademesi olan çevirmeli anahtarı çevirip anahtarın kontaklarının  doğru çalışıp çalışmadığına bakıyorum. Motor sürücü olarak TB6600 kullanıyorum. aşağıda kodlarımı belirttim. Sorunum şu, bazen anahtarın kontrolü sırasında motor anahtarı son konumuna getirince belli bir süre bekliyor 5 sn 10 sn vs sonra anahtarı tekrar sıfır konumuna getirmek için dönüyor. Normalde hiç bekleme diye bir olay yok anahtarı son konumuna çevirip orda da belirlenen kontaklar kapalı ise anahtarı 0 konumuna getirip testi sonlandırıyor eğer anahtarın kontakları basılı değilse de arıza veriyor ve resete basılması isteniyor zaten. Sizden ricam dışarıdan bir gözle kodlara bakıp herhangi bir yerde hatam var ise düzeltmeniz.Hepinize şimdiden çok teşekkür ederim.


'@ __config _XT_OSC & _WDT_ON & _LVP_OFF & _CP_OFF              
DEFINE OSC 4
OPTION_REG=%0000000
TRISA=0                                                     
TRISB=%11111111                                               
TRISC=%00000110                                                       
TRISD=%00000010
input porte.0
input porte.1
input porte.2
porta=%111111
portb=0
portc=0
portd=0
porte=0
pause 250                                                 
;-------------------------------------------------------------------------------
DEFINE LCD_DREG PORTC     
DEFINE LCD_DBIT 4       
DEFINE LCD_EREG PORTD     
DEFINE LCD_EBIT 3               
DEFINE LCD_RSREG PORTD   
DEFINE LCD_RSBIT 2       
DEFINE LCD_BITS 4       
DEFINE LCD_LINES 2                       
DEFINE ADC_BITS 8       
DEFINE ADC_CLOCK 3     
DEFINE ADC_SAMPLEUS 50 
ADCON1=7
pause 300                                                 
;-------------------sembol ve değişken tanımları-------------------------------;
p var byte                   
p=3                     
a var byte                   
b var byte                   
c var byte
d var byte                                 
i var byte
symbol secim=portd.1 ;anahtar türü seçim butonu
symbol en=porta.0     ;tb6600 enable
symbol yon=porta.1     ;tb6600 yön
symbol clk=porta.2      ;tb6600 clock             
symbol start=portb.0           
symbol buzzer=portc.0         
symbol ekp=portd.7       ;ürünü sabitleyen piston     
symbol mkp=portd.6       ;motorun anahtara geçmesini sağlayan piston   
symbol kp=portd.5         ;ürün sağlamsa ürüne iz yapan piston   
symbol es = porte.0       ;ürünü sabitleyen pistonun manyetik sensörü   
symbol ms = porte.1        ;motoru ileri iten pistonun manyetik sensörü
symbol mks = porte.2       ;motorun 0 noktasını belirleyen manyetik sensör 
symbol reset =portc.2
symbol urun=portb.7        ;yuvada ürün olup olmadığını belirleyen sensör
symbol ssifir=portc.1
symbol a1=portb.1       ;anahtar kontağı
symbol a2=portb.2       ;anahtar kontağı
symbol a3=portb.3        ;anahtar kontağı
symbol a4=portb.4         ;anahtar kontağı
symbol a5=portb.5          ;anahtar kontağı
symbol a6=portb.6          ;anahtar kontağı
saglam var word
read 2,saglam.lowbyte
read 1,saglam.highbyte
bozuk var byte
read 3,bozuk
;--------------------ilk voltaj verilince---------------------------------------                         
LCDOUT $FE,1, "DOMECTIC ANAHTAR"
LCDOUT $FE,$C0, "TEST CIHAZI"     
PAUSE 250
sfr:
low mkp
low ekp
en=1
yon=0
clk=0
pause p
clk=1
pause p
if mks=0 then
en=0 
goto basla
else
goto sfr
endif                                                                                     
;--------------------başlangıç bölümü-------------------------------------------
basla:
write $02,saglam.lowbyte
write $01,saglam.highbyte
pause 10
read $02,saglam.lowbyte
read $01,saglam.highbyte
pause 10
write $03,bozuk
pause 10
read $03,bozuk
pause 10
if secim=1 then goto acilis
if secim=0 then goto acilis1
;*******************************************************************************
acilis:
if ssifir=0 then
saglam=0
bozuk=0
endif
if reset=0 then GOTO rest
if start=0 and urun=1 then gosub urunkoy
if start=0 and urun=0 and mks=1 then GOTO sfr
'###############################################################################                             
lcdout $FE,1, "BUTONA BASINIZ"
lcdout $fe,$c0, "S:",#saglam, "   B:",#bozuk   
pause 200
if start=0 and urun=0 and mks=0 then
goto elkin
endif
goto acilis
;-------------------------------------------------------------------------------
elkin:
high ekp
pause 150
if es=0 or ssifir=0 then
goto anhknt
endif
goto elkin
;-------------------------------------------------------------------------------
anhknt:
lcdout $FE,1, "ANAHTAR KONTROLU"
pause 200
if a1=1 and a2=1 and a3=1 and a4=1 and a5=1 and a6=1 then
goto motorileri
else
goto kariza
endif
goto anhknt
;-------------------------------------------------------------------------------
motorileri:
high mkp
pause 150
if ms=0 then
goto ilkkonum
endif
goto motorileri
;-------------------------------------------------------------------------------
ilkkonum:
lcdout $FE,1, "TEST BASLADI"
PAUSE p
en=1
yon=1
for a=1 to 33
clk=0
pause p
clk=1
pause p
next
if a1=0 and a2=1 and a3=0 and a4=1 and a5=0 and a6=1 then
goto ikincikonum
else
en=0
bozuk=bozuk+1
goto k1a
endif
if reset=0 then goto rest
;-------------------------------------------------------------------------------
ikincikonum:
LCDOUT $FE,1, "KONUM 1 OK"
pause p
en=1
yon=1
for b=1 to 34
clk=0
pause p
clk=1
pause p
next
if a1=1 and a2=0 and a3=1 and a4=1 and a5=0 and a6=1 then
goto ucuncukonum
else
en=0
bozuk=bozuk+1
goto k2a
endif
if reset=0 then goto rest
;-------------------------------------------------------------------------------
ucuncukonum:
LCDOUT $FE,1, "KONUM 2 OK"
PAUSE P
en=1
yon=1
for c=1 to 33
clk=0
pause p
clk=1
pause p
next
if a1=1 and a2=1 and a3=1 and a4=1 and a5=0 and a6=0 then
goto dorduncukonum
else
en=0
bozuk=bozuk+1
goto k3a
endif   
if reset=0 then goto rest
;-------------------------------------------------------------------------------
dorduncukonum:
LCDOUT $FE,1, "KONUM 3 OK"
PAUSE P
en=1
yon=0
for d=1 to 66
clk=0
pause p
clk=1
pause p
next
if a1=0 and a3=0 and a5=0 then
kp=1
pause 250
kp=0
low mkp
pause 75
low ekp
LCDOUT $FE,1, "SAGLAM"
PAUSE P
saglam=saglam+1
pause 150
goto sfr
else
goto dorduncukonum
endif
if reset=0 then goto rest
;-------------------------------------------------------------------------------
;-**************-----**-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*--**-*-*-*-*-*-*-*-*--
acilis1:
if ssifir=0 then
saglam=0
bozuk=0
endif
if reset=0 then GOTO rest
if start=0 and urun=1 then gosub urunkoy
if start=0 and urun=0 and mks=1 then GOTO sfr
'###############################################################################                             
lcdout $FE,1, "BUTONA BASINIZ"
lcdout $fe,$c0, "S:",#saglam, "   B:",#bozuk   
pause 200
if start=0 and urun=0 and mks=0 then
goto elkin1
endif
goto acilis1
;-------------------------------------------------------------------------------
elkin1:
high ekp
pause 150
if es=1 or ssifir=0 then
goto anhknt1
endif
goto elkin1
;-------------------------------------------------------------------------------
anhknt1:
lcdout $FE,1, "ANAHTAR KONTROLU"
pause 200
if a1=1 and a2=1 and a3=1 and a4=1 and a5=1 and a6=1 then
goto motorileri1
else
goto kariza
endif
goto anhknt1
;-------------------------------------------------------------------------------
motorileri1:
high mkp
pause 150
if ms=0 then
goto ilkkonum1
endif
goto motorileri1
;-------------------------------------------------------------------------------
ilkkonum1:
lcdout $FE,1, "TEST BASLADI"
PAUSE p
en=1
yon=1
for a=1 to 33
clk=0
pause p
clk=1
pause p
next
if a1=0 and a2=1 and a3=0 and a4=1 and a5=0 and a6=1 then
goto ikincikonum1
else
en=0
bozuk=bozuk+1
goto k1a
endif
if reset=0 then goto rest
;-------------------------------------------------------------------------------
ikincikonum1:
LCDOUT $FE,1, "KONUM 1 OK"
pause p
en=1
yon=1
for b=1 to 34
clk=0
pause p
clk=1
pause p
next
if a1=1 and a2=0 and a3=1 and a4=1 and a5=0 and a6=1 then
goto ucuncukonum1
else
en=0
bozuk=bozuk+1
goto k2a
endif
if reset=0 then goto rest
;-------------------------------------------------------------------------------
ucuncukonum1:
LCDOUT $FE,1, "KONUM 2 OK"
PAUSE P
en=1
yon=1
for c=1 to 33
clk=0
pause p
clk=1
pause p
next
if a1=1 and a2=1 and a3=1 and a4=0 and a5=0 and a6=0 then
goto dorduncukonum1
else
en=0
bozuk=bozuk+1
goto k3a
endif   
if reset=0 then goto rest
;-------------------------------------------------------------------------------
dorduncukonum1:
LCDOUT $FE,1, "KONUM 3 OK"
PAUSE P
en=1
yon=0
for d=1 to 66
clk=0
pause p
clk=1
pause p
next
if a1=0 and a3=0 and a5=0 then
kp=1
pause 250
kp=0
low mkp
pause 75
low ekp
LCDOUT $FE,1, "SAGLAM"
PAUSE P
saglam=saglam+1
pause 150
goto sfr
else
goto dorduncukonum1
endif
if reset=0 then goto rest
;-*-*-*-**----****-***-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-***-*-*-*-*-*-*--**-*-*-
k1a:
high buzzer
Lcdout $fe,1,  "1. Konumda Ariza"     
Lcdout $fe,$c0,  "Resete Basiniz"
pause 200
Lcdout $fe,1,  " "     
Lcdout $fe,$c0,  " "
pause 200
if reset=0 then
goto rest
else
goto k1a
endif
goto basla
;-------------------------------------------------------------------------------
k2a:
high buzzer
Lcdout $fe,1,  "2.Konumda Ariza"
Lcdout $fe,$c0,  "Resete Basiniz"
pause 250
Lcdout $fe,1,  " "     
Lcdout $fe,$c0,  " "
pause 200
if reset=0 then
goto rest
else
goto k2a
endif
;-------------------------------------------------------------------------------
k3a:
high buzzer
Lcdout $fe,1,  "3.Konumda Ariza"
Lcdout $fe,$c0,  "Resete Basiniz"
pause 250
Lcdout $fe,1,  " "     
Lcdout $fe,$c0,  " "
pause 200
if reset=0 then
goto rest
else
goto k3a
endif
;-------------------------------------------------------------------------------
rest:
low buzzer
low mkp
pause 250
low ekp
lcdout $FE,1, "RESET ATILIYOR"
LCDOUT $FE,$C0, "BEKLEYIN"
PAUSE 500
goto sfr
;-------------------------------------------------------------------------------
kariza:
lcdout $fe,1, "Anahtarda Konum"
lcdout $fe,$c0, "  Hatasi Var"
pause 200
if reset=0 then
low mkp
pause 50
low ekp
endif
if es=1 then
goto basla
endif
goto kariza
;-------------------------------------------------------------------------------
urunkoy:
FOR i=1 TO 10
LCDOUT $FE,1, "   LUTFEN  URUN"
LCDOUT $FE,$C0, "   YERLESTIRIN"
PAUSE 100
NEXT
RETURN
;-------------------------------------------------------------------------------







ete

Programda 5-10 sn gecikme yaratacak bir komut göremedim. Sorun donanım sorunu yada mtoru sürdüğünüz devrede olabilir.
Anahtar kontaklarınınbağlı olduğu pinlerin pullup yada her neyse pull down bağlantılarının doğru ve yeterliolduğuna dikkat edin. Kritik noktada kalıyor ise İşlemci kararsız kalabilir. Güç kaynağınız motoru sürecek kadar yeterli akıma sahip olmayabilir.
Kısacası programda bu yönde bir sorun göremedim ama başka yönlerde sorunlar var gibi gözüküyor.
Bana ters gelen bazılarına değinmek isterim. Program aşağıdaki kodlarla açılıyor.
write $02,saglam.lowbyte
write $01,saglam.highbyte
pause 10
read $02,saglam.lowbyte
read $01,saglam.highbyte
pause 10
write $03,bozuk
pause 10
read $03,bozuk
pause 10
if secim=1 then goto acilis
if secim=0 then goto acilis1

Bana ters gelen şey önce eproma yazma daha sonra yazdıklarını okumakla ile başlıyorsun. Neden yazıyorsun? Neden sonra yazdığını okuyorsun. ?
Eprom yazma ömrü sınırlı olan bir hafıza ünitesidir. Mecbur kalmadıkça değişmemiş bilgi eproma yazılmamalıdır. Yazma 10 ms gecikme gerektirir ama okuma hiç bir zaman gecikme gerektirmez direk okunur. Henüz yeni yazılmış bir bilginin okunmasıda gerekmez.
Diğer bir konu da Binary mantığında yalnızca 2 konum vardır 1 veya 0. Bu nedenle bu mantığa göre seçim yapılırken yapnızca birisinin test edilmesi yeterlidir. O değilse otomatikman diğeridir. Yani IF BIT=0 then şunu yap dediğin zaman altına birde IF BIT=1 ise bu seferde şunu yap demek yanlış değil ama çok doğru da değil. Zira ilk önce sıfır olup olmadığını test edersin sıfır değil ise mutlaka 1 dir. O halde artuk 1 olup olmadığını test etmeye gerek yoktur direk şunu yap demelisin.
Pause bol keseden kullanılacak bir komut olmamalıdır. Kullandığın gecikmenin mutlaka bir amacı olması gerekir. Her yere pause koyarak bir programın sağlıklı çalışmasını beklemeyin. Programlarınızı kesinlikle en az pause ler ile çalışacak şekilde yazınız. Bu hem işinizi hızlandırır hemde kodun daha sağlıklı çalışmasını sağlar.

if a1=1 and a2=1 and a3=1 and a4=1 and a5=1 and a6=1 then   şeklindeki komut satırını ;
IF (PORTB & %01111110) =%01111110 THEN şeklinde yazmak çok daha mantıklı olurdu. Böylece bit bit kontrol etmek yerine portu kontrol etmiş olurdunuz. Böylece işlemci bu komut satırında bu şekilde çok daha az vakit harcardı.
Bunun benzeri satırlar alt kısımlarda da mevcut.
Şimdilik gözüma çarpanlar bunlar.

Ete

Elektronikprojem

Teşekkürler hocam eeprom konusunda zaten yazma hatalıydı onu düzeltip dediklerinizi uygulayıp tekrar deneyeceğim. Pull up dirençlerini 10k olarak kullandım bunun bir sakıncası var mıdır?

ete

10K pulup'ın sakıncası yok. Eprom konusunda bir bayrak (flag) kullan. Mesela YAZ isimli değişkeni kullan. Bilgi değiştiği zaman YAZ=1 yaparsın satırların sonunda IF YAZ=1 then deyip ya altına yazma komutunu koyarsın yada bir alt programda yazma yaptırırp oraya yollarsın programı. Yazdıktan sonra YAZ=0 demeyide unutma.
Ete

İlyas KAYA

Yazılıma bakmadım zaten ETE hocam gerekli şeyleri söylemiş.

Yüksek ihtimal ile butonlardan sıçrama gerilimi etkiliyor. Her kontak için GND ye 100nf kondansatör bağlayın.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

Powered by EzPortal