Şimdi Ara

2 motoru nasıl senkronize çalıştırabilirim? (pozisyon eşitleme)

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
5
Cevap
0
Favori
338
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Siz değerli yazılımcıların yardımına ihtiyacım var.

    Belli bir fiyat talep ederseniz verebilirim.


    Makinemde 1 büyük motor 1 de küçük motor var. İstiyorum ki büyük motor döndüğünde onunla aynı pozisyonda diğer motor dönsün.

    Bahsettiğim büyük motor asenkron motor yani pozisyon kontrolü yok ama ona enkoder takacağım.

    Küçük motor ise bir step motor. Büyük motordan gelen enkoder bilgisine göre hareket etmesini, yani enkoder ile aynı pozisyonda hareket etmesini istiyorum.


    Ayrıca bir potansiyometre ile motorlar arasındaki pozisyon farkını ayarlamak istiyorum. Yani potansiyometre 0 değerindeyken iki motor eşit dönecek ama potansiyometreti 50 değerine çıkarırsam küçük motor 50 derece daha ileride dönecek.


    Alternatif olarak bir yöntem daha işimi görebilir. O da şu şekilde:

    Büyük motorda yine enkoder var eğer büyük motor 100 dereceye gelirse küçük motor ileri hareket edip 5 cm ilerleyip duracak. Yani mesela yarım tur ileri dönecek.

    Büyük motor 200 dereceye ulaştığında küçük motor geri gelecek.


    Yani büyük motor 100 derece döndüğünde küçük motor dönmeye başlayıp yarım tur ileri gidecek ve bekleyecek.

    Büyük motor 200 derece döndüğünde küçük motor başlangıç pozisyonuna geri dönecek ve bu sürekli tekrarlanacak.

    Büyük motor sürekli tek yöne dönerken diğeri ileri geri gidecek.

    Ve aynı ilk senaryodaki gibi bi potansiyometre ile geri dönmek için gerekli dereceyi ayarlayacağım.

    Potansiyometre 0 ise büyük motor 200 derecedeyken küçük motor geri dönecek.

    Potansiyometre 50 ise büyük motor 250 derecedeyken küçük motor geri dönecek.

    Bu iki motorun hizalı hareket etmesi gerekiyor birisi farklı hareket ederse makine hatalı çalışıp ürünü veremez.

    Eskiden tek motor vardı ve bu mekanizmayı makine hareketliyle senkronize etmek için senkron kayışı kullanıyordum. Ama mekanizma ile makine hareketi arasındaki pozisyon farkını ayarlamak için makineyi durdurup kasnağı biraz döndürmek gerekiyordu. Ben makine çalışırken ayar yapılabilsin diye oraya motor taktım ama şimdi de kodlayamıyorum encoder ile motor aynı dönmüyor. Biraz kaçırıyor. Motor titriyor başta eşit gibiyken biraz döndürünce motor encoderden geride kalıyor hizalı hareket edemiyorlar. İkinci senaryo daha sorunsuz çalışır gibi ama onu da yapmayı bilmiyorum zaten birinciyi bile yapamamıştım. Yardım ederseniz çok sevinirim çok uzun yazdım umarım buraya kadar okumuşsunuzdur :)








  • Şöyle bi kod yazdım internetten bulduğum ve mantık yürüterek yazdığım kadarıyla. Şu an istediğim gibi ileri geri gidiyor ama sıfırlanmıyor.

    enkoderin 360 derecesi 1200 pulse. 500'e geldiğinde ileri gidiyor 800'e geldiğinde geri dönüyor ama 1200e gelince sıfırlanıp aynı şeye devam edemiyor o sayı 65.535'e kadar gidiyor (short int değişkeni limiti)


    #include <AccelStepper.h>

    AccelStepper stepper(AccelStepper::DRIVER47);


    const byte encoderPinA = 2;//outputA digital pin2

    const byte encoderPinB = 3;//outoutB digital pin3

    volatile unsigned int count = 0;

    unsigned int protectedCount = 0;

    unsigned int previousCount = 0;

    #define readA bitRead(PIND,2)//faster than digitalRead()

    #define readB bitRead(PIND,3)//faster than digitalRead()




    void setup()

    {

      Serial.begin (115200);

      pinMode(encoderPinA, INPUT_PULLUP);

      pinMode(encoderPinB, INPUT_PULLUP);

      attachInterrupt(digitalPinToInterrupt(encoderPinA), isrA, CHANGE);

      attachInterrupt(digitalPinToInterrupt(encoderPinB), isrB, CHANGE);



      stepper.setMaxSpeed(2000);

      stepper.setAcceleration(1500);




    }


    void loop()

    {


      noInterrupts();

      protectedCount = count;

      interrupts();

      if (protectedCount != previousCount)

      {

      }

      Serial.print (" Ham Veri ");

      Serial.print (protectedCount);

      previousCount = protectedCount;


      unsigned int ileri = 0;

      ileri = 0 + protectedCount;




      if (ileri >= 500 && ileri < 800

      {

        stepper.moveTo(400);

        stepper.setAcceleration(2000);

        stepper.runToPosition();

      }


      else

      {

        stepper.moveTo(0);

        stepper.setAcceleration(2000);

        stepper.run();

      }


      Serial.print (" ileri ");

      Serial.println (ileri);


    }


    void isrA() {

      if (readB != readA)

      {

        count ++;

      }

      else

      {

        count --;

      }

    }

    void isrB() {

      if (readA == readB)

      {

        count ++;

      }

      else

      {

        count --;

      }

    }





  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.