Dc motor kontrolu konusunda yardım

Başlatan erhang, 07 Nisan 2020, 01:31:18

erhang

Merhaba herkese bi konu hakkında yardım almak istiyorum  ve bu sayfanın kurallarınıda biliyorum  bi konuya baslamadan kimse yardım etmiyor ama ben bu algoritmayı nasıl yapacagımı saglayamadıgım için işlem yapamadım yaptım ama dogru olmadıgı için buraya koymadım  ve sagdan soldan kopyala yapıstır yaparak sizleride kandırmak istemedim o yuzden bı yardım istemek için yazdım yardımcı olacak arkadaslar varsa sevinirim yapmak istediğim devre su şekilde olacak
1 buton ve 1dc motor olacak devrede  olusacak işlemler su sekilde olacak
1işlem:
Butona basılıp bırakılsa da yada sürekli basılı tutulsada  her iki ihtimalde de  motor sağa10 sn dönecek ve duracak
2.işlem:
Bu butona basılıp bırakma süresi motorun sağa dönme süresinden yani 10 sn den az ise motor 10sn sağa dönme işlemini tamamladıktan sonra bekleme yapmadan geri   yani sola 10 sn dönecek ve duracak
3. işlem
Egerki bu butona  basma süresi motorun saga dönme süresinden yani 10sn den uzun basılırsa  ve buton bırakıldıgında  bu sefer motor 20 sn bekleyecek  ve sonra 10sn sola dönecek
4 işlem
Egerki bu 3. işlemdeki  buton bırakıldıgında sayacak olan 20sn süre dolmadan butona tekrar basılırsa 20 sn  bekleme süresi kendini sıfırlayacak ve yeniden 20sn sayacak bu işlem basma oldukca tekrarlayacak ve son bırakma işleminden sonra 20sn  sayacak ve sonra motor 10sn sola dönme işlemini yapacak ve duracak

Bu işlemler için nasıl bi işlem uygulamam gerek bilgi verebilecek ve yol gösterecek varsa sevinirim

ete

Bütün algoritma buton'a ne kadar basıldığı sorusuna yoğunlaşıyor.
O halde ilk yapılacak iş bir buton test bölümü yazılacak ve butonun ne kadar basılı tutulduğu ölçülecek.
Ancak ufak bir çelişki gözüme çarpıyor.
"1 işlemde ;Butona basılıp bırakılsa da yada sürekli basılı tutulsada  her iki ihtimalde de  motor sağa10 sn dönecek ve duracak" denilmiş. Bu işlemde butona basma süresi 10 sn den kısa olacak demektir.
2.işlem: de bu şarta bağlanmış ama farklı uygulaması var.
Yani butona 10 sn den daha kısa süreli basılırsa motor 10 sn sağa dönecek ve daha sonra 10sn de sola dönüp duracak.

Şimdi bana göre bu bir çelişki. Her iki durumda da butona 10 sn den kısa süreli basıldı. Biri diyorki 10 sn sağa dön ve dur. Diğeri diyorki 10sn sağa dön sonra 10 sn sola dön.

Burada ufak bir nokta daha var. 1. işlemde buton bırakılmamış ise. Yani 10 sn daha uzun süreli basıyor isemde aynı işi yapacak. Tek şart butonu bırakmamak olacak her halde.
Bana kalırsa bu şartları şöyle ayırmak daha doğru olurdu.
1.ci işlem: Butona 10 sn bastım süreyi geçtim ama butonu bırakmadım. O halde Butona basılı tutuyor iken 10 sn dolmasını bekle 10 sn sonunda motoru sağa döndür ve sonra dur.

2.ci işlem. Butona bastım zamanı saymaya başladım. 10 sn dolmadan butonu bıraktım. O halde 10 sn den kısa basıldı butona. Butonu bırakır bırakmaz,Motor 10 sn sağa dönecek ve daha sonrada 10 sn sola dönüp duracak.

3. cü işlem de 1 nolu işleme giriyor az da olsa. Butona bastım sayacım 10 sn saydı 10+xx ms daha fazla bastım ve bıraktım. Bırakmasaydım 1 nolu işlemi yerine getirecektim. Ama bıraktığım için ve sürede 10 sn yi geçtiği için 3 nolu işlmemi yerine getireceğim.

4 nolu işlemde 3 nolu işlem ile ortak çalışacak demektir. 3 nolu işlemde 20 sn lik bekleme süresinde butonu tekrar kontrol edeceğim. Şayet basılırsa bu sefer sistem 4 nolu işleme dönecek.

Şimdi bu varsayımlar çerçevesinde ilk yapılacak iş bir butona basma ve zaman saydırma komut dizisine ihtiyaç var. Şöyle olmalı;

IF BUTON=0 THEN      'şayet butona basıldı ise;
  SAYAC=0            'önce sayacı sıfırla
  WHILE BUTON=0      'butona basıldığı süre boyunca
    SAYAC=SAYAC+1    'ms cinsinden zaman say
    PAUSE 1          'bunun çin 1 ms lik bir gecikme kullan
    IF SAYAC=10000 THEN  'şayet sayac 10.000 değerine yani 10 sn değerine ulaşmış ise
      MOTOR=1:SAG=1        'motoru çalıştır.
    ENDIF
    IF SAYAC=20000 THEN  'hala butonu bırakmadım ama motor 10sn çalıştı artık durması gerek.
       MOTOR=0:SAG=0           've motoru durdurdum.
    ENDIF
  WEND
 
  IF SAYAC<10000 THEN     'BUTONA BASMA SÜRESİ 10 SN DEN KISA İSE
    MOTOR=1:SAG=1 'MOTORU SAGA 10 SN DÖNDÜRECEĞİZ.
    PAUSE 10000
    MOTOR=0:SAG=0          '10 SN DOLDU VE MOTORU DURDURDUK.
    MOTOR=1:SOL=1          'ŞİMDİ DE SOLA 10 SN DÖNDÜRÜP DURDURACAĞIZ.
    PAUSE 10000
    MOTOR=0:SOL=0
   ENDIF
   
   IF SAYAC>10000 THEN     'BUTONA BASMA SÜRESİ 10 SN DEN FAZLA İSE MOTOR ZATEN ÇALIŞMIŞ OLACAKTIR   
      MOTOR=0:SAG=0        'ÖNCE MOTORU DURDURUYORUZ.
      SAYAC=0              'SAYACIMIZI SIFIRLAYIP  
      WHILE SAYAC<20000    'SAYAC DEĞERİ 20 SN OLUNCAYA KADAR BEKLEYECEĞİZ
        SAYAC=SAYAC+1
        PAUSE 1
        IF BUTON=0 THEN SAYAC=0    'AMA BU ESNADA BUTONA BASILIR İSE  SAYAC SIFIRLANACAK
      WEND
      MOTOR=1:SOL=1                'BU SEFER MOTORU SOLA DÖNDÜRECEĞİZ.
      PAUSE 10000
      MOTOR=0:SOL=0
    ENDIF
ENDIF

Komutları adım adım takip edersen çelişkileride kolaylıkla görebilirsin.
Özellikle 1 ve 2 nolu işlemlerde çakışma var her ikisinde de kısa basılma durumunda işlem yapılacak ama birinde 10 sn çalışıp duracak motor diğerinde sola da dönecek. Bu noktaya odaklan.
Ben yolunu gösterdim. Gerisini halledersin umarım.
Şunu unutma BASIC programları aksine bir komut yok ise satır takip eder.
Bir WHILE WEND döngüsü şart doğru olduğu müddetçe devam eder. Şart bozulana kadar. Şu örneğe bakar isek;
 WHILE BUTON=0      'butona basıldığı süre boyunca
    SAYAC=SAYAC+1    'ms cinsinden zaman say
    PAUSE 1          'bunun çin 1 ms lik bir gecikme kullan
    IF SAYAC=10000 THEN  'şayet sayac 10.000 değerine yani 10 sn değerine ulaşmış ise
      MOTOR=1:SAG=1        'motoru çalıştır.
    ENDIF
    IF SAYAC=20000 THEN  'hala butonu bırakmadım ama motor 10sn çalıştı artık durması gerek.
       MOTOR=0:SAG=0           've motoru durdurdum.
    ENDIF
  WEND
Burada butona basılı tutulduğu müddetçe program WHILE ile WEND arasında satır takip ederek çalışmaya devam eder. WEND satırına gelince tekrar WHILE satırına döner. Buton bırakıldığı anda nerede olduğuna bakılmadan program WEND satırından bir sonraki satıra geçer.

Ete


erhang

#2
Hocam eline yüregine saglık bu yapmıs oldukların benim için yeterli artık bi denerim olmadı bu kodlar üzerinde senin yol gösterdiğin cercevede calısırım
Ben arstırmıstım bir buton durumuna göre degişke tanımlayıp ve tmr1 sayacı kullanarak süre saydırıp butona basarak süreyi sıfırlayıp süreyi tekrar saydırırak  tmr1 den bilgi alıp bu alınan degeri kıyaslayarak küçük veya buyuk işlem yap gibisinden yapmaya calıstım ama tmr1 sayacını sayac gibi saydıramadım o yüzden yardım istedim hocam ama siz cok güzel bi sekilde yapmıssınız sagolun

Powered by EzPortal