2 motoru senkronize çalıştırma (Arduino ya da plc)

anormie

Üye
Katılım
7 Ara 2021
Mesajlar
11
Puanları
1
Yaş
24
Motorlardan birisi asenkron trifaze motor, diğeri step motor. Bunları senkronize çalıştırmak istiyorum. Aynı anda dönüp aynı anda dursunlar aynı pozisyonda çalışsınlar.
Bunu nasıl yaparım çok çabaladım ama bir yolunu bulamadım rotary enkoder aldım onunla da yapamadım her döndüğü turda sıfırlanır sandım ama her döndüğünde 1200 artıyor ama 65.535e kadar gidiyor. Short int limiti kadar. Tur bittiği halde sıfırlanmıyor.

Alternatif bir yöntem de işimi görüyor. O da şu şekilde:

Örneğin asenkron motor 200 derece döndüğünde step motor harekete geçip ileri gitsin orda beklesin asenkron motor 300 dereceye geldiğinde step motor geri eski pozisyonuna dönsün. Bunu başardım gerekli kodu yazdım ama enkoder sıfırlanmadığı için sadece bi kez yapılıyor. Mesela her turda 1200 pulse veriyor. 500 pulse alınca ileri git 800 pulse alınca geri dön diyorum 500 olunca ileri gidiyor 800de geri dönüyor sonra 1200 olunca yani bi turu tamamlayınca sıfırlanmıyor 65.000e kadar enkoder sıfırlanmadığı için 50 tur falan boşa dönüyor hiçbir işime yaramıyor. Enkoder tekrar sıfırlanana kadar uzun bi süre bu sistem çalışmıyor. Nasıl çalışıyor bu enkoderler anlamadım. Mantıken bi tur dönüp belli bi sayıya gelip tur bitince sıfırlanıp baştan başlaması lazım aralıksız sürekli artarsa bi anlamı olmuyor ki kullanamıyorum.
Lütfen yardımcı olun önemli bi proje talep ederseniz ücret ödeyebilirim. Sorun çıkarmadan çalışmasını istiyorum. Senkronizasyonu hiç kaçmaması gerekiyor.
şu anda kodlama için arduino ve tüm step motorları düzenli bi yere toplamak için cnc shield kullanıyorum.
 
Varsin saysin 65545'e kadar.

Count/1200 isleminde tam kisim Tam tur sayisi kalan ise senin aradigin pozisyon bilgisi.

Diyelimki counter 6500 degerine ulasti. 6500/1200=5.4

Demekki tam 5 tur donmus ve encoder degerin 6500- (5*1200)=500
 
Varsin saysin 65545'e kadar.

Count/1200 isleminde tam kisim Tam tur sayisi kalan ise senin aradigin pozisyon bilgisi.

Diyelimki counter 6500 degerine ulasti. 6500/1200=5.4

Demekki tam 5 tur donmus ve encoder degerin 6500- (5*1200)=500
matematiğim yetmedi ve yaptığın işlemden hiçbir şey anlamadım değeri bulsam bile işe yarayacağını düşünmüyorum çünkü geçen değeri uğraşa uğraşa bölme yöntemiyle buldum ve döndürdüm ama eşit dönmüyordu mesela ben 360 derece döndürdüğümde tam 360 derece dönüyordu ama bikaç tur döndürdükten sonra step motor adım kaçırıyordu titreyip yine şaşırıyordu konumunu o yüzden ikinci yöntemi kullanma kararı aldım onun için de tek yöntem sıfırlamak gibi geliyor onu nasıl yaparım anlatabilir misin
 
enkoder verisini bir değişkene atayıp istediğiniz zaman kodla sıfırlayın.
 
enkoder verisini bir değişkene atayıp istediğiniz zaman kodla sıfırlayın.
sıfırlamayı denedim ama döngü sonunda değişkeni sıfırlasam da döngü başa geldiğinde enkoder verisi hala 2000 ise o değişken de yine 2000 oluyor çünkü değişkenin değeri enkoderden geliyor bu yöntemi nasıl kullanırsam düzgün çalışır
 
her döndüğünde 1200 artıyor ama 65.535e kadar gidiyor. Short int limiti kadar.
İhtimal-1:
Muhtemelen programlamada mantık hatası yapıyorsunuz.

yine 2000 oluyor çünkü değişkenin değeri enkoderden geliyor
İhtimal-2:
Tarifinizde bir anlatım yanlışı yoksa kullandığınız encoder absolute-mutlak- tip.
İncremental -artımlı- tip kullanın. Değeri kullandığınız programlama ortamında istediğiniz zaman sıfırlarsınız.
 
İhtimal-1:
Muhtemelen programlamada mantık hatası yapıyorsunuz.


İhtimal-2:
Tarifinizde bir anlatım yanlışı yoksa kullandığınız encoder absolute-mutlak- tip.
İncremental -artımlı- tip kullanın. Değeri kullandığınız programlama ortamında istediğiniz zaman sıfırlarsınız.
Artımlı enkoder kullanıyorum nasıl sıfırlayacağım
 
Kullandığın rotary encoderin marka modelini yazar mısın? Kaç pin çıkış veriyor. En azından bu bilgiye sahip olmamız gerekli.
 
Motorlardan birisi asenkron trifaze motor, diğeri step motor. Bunları senkronize çalıştırmak istiyorum. Aynı anda dönüp aynı anda dursunlar aynı pozisyonda çalışsınlar.
Bunu nasıl yaparım çok çabaladım ama bir yolunu bulamadım rotary enkoder aldım onunla da yapamadım her döndüğü turda sıfırlanır sandım ama her döndüğünde 1200 artıyor ama 65.535e kadar gidiyor. Short int limiti kadar. Tur bittiği halde sıfırlanmıyor.

Alternatif bir yöntem de işimi görüyor. O da şu şekilde:

Örneğin asenkron motor 200 derece döndüğünde step motor harekete geçip ileri gitsin orda beklesin asenkron motor 300 dereceye geldiğinde step motor geri eski pozisyonuna dönsün. Bunu başardım gerekli kodu yazdım ama enkoder sıfırlanmadığı için sadece bi kez yapılıyor. Mesela her turda 1200 pulse veriyor. 500 pulse alınca ileri git 800 pulse alınca geri dön diyorum 500 olunca ileri gidiyor 800de geri dönüyor sonra 1200 olunca yani bi turu tamamlayınca sıfırlanmıyor 65.000e kadar enkoder sıfırlanmadığı için 50 tur falan boşa dönüyor hiçbir işime yaramıyor. Enkoder tekrar sıfırlanana kadar uzun bi süre bu sistem çalışmıyor. Nasıl çalışıyor bu enkoderler anlamadım. Mantıken bi tur dönüp belli bi sayıya gelip tur bitince sıfırlanıp baştan başlaması lazım aralıksız sürekli artarsa bi anlamı olmuyor ki kullanamıyorum.
Lütfen yardımcı olun önemli bi proje talep ederseniz ücret ödeyebilirim. Sorun çıkarmadan çalışmasını istiyorum. Senkronizasyonu hiç kaçmaması gerekiyor.
şu anda kodlama için arduino ve tüm step motorları düzenli bi yere toplamak için cnc shield kullanıyorum.
Kardeş ilk seferinde dogru çalışıyor diyorsunuz.Demekki işlem bittikten sonra encoderi okudugunuz registeri sıfırlamayı unutuyorsunuz.Kendi sayaç registerinizi sıfırlayın
 

Rotary Encoder OVW6-06-2HC 600 Pulse​

Kullandığın rotary encoderin marka modelini yazar mısın? Kaç pin çıkış veriyor. En azından bu bilgiye sahip olmamız gerekli.
Rotary Encoder OVW6-06-2HC 600 Pulse
4 pini var a, b, v+, gnd
600 pulse ama 1 tur çevirdiğimde 1200 veriyor 2 pin de 600er verdiği için. Artımlı enkoder.
Devreyi açıp kapatınca sıfırlanıyor hatta kodun sonunda low high yapıp sıfırlasam mı acaba diye düşünmüştüm ama bilemedim belki adım kaçırır o kapanıp açılırken diye düşündüm. Kodlama bilmiyorum ama biyerlerden gördüğüm kodları kullanıp biraz da mantık yürütüp bi kod yazdım atayım.
Kardeş ilk seferinde dogru çalışıyor diyorsunuz.Demekki işlem bittikten sonra encoderi okudugunuz registeri sıfırlamayı unutuyorsunuz.Kendi sayaç registerinizi sıfırlayın
Register nasıl sıfırlanıyor anlatır mısınız?
Kullandığım kod bu:

#include <AccelStepper.h>

AccelStepper stepper(AccelStepper::DRIVER, 4, 7);



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 --;

}

}
 

Forum istatistikleri

Konular
127,952
Mesajlar
913,885
Kullanıcılar
449,600
Son üye
psychedelic

Yeni konular

Geri
Üst