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

anormie

Üye
Katılım
7 Ara 2021
Mesajlar
9
Puanları
1
Yaş
22
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.
 

Bunalmis

Katılımcı Üye
Katılım
4 Şub 2007
Mesajlar
398
Puanları
56
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
 
Konu Sah
anormie

anormie

Üye
Katılım
7 Ara 2021
Mesajlar
9
Puanları
1
Yaş
22
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
 

bolubeyi

Profesyonel Üye
Katılım
27 Eyl 2008
Mesajlar
1,270
Puanları
421
Konum
Trabzon
enkoder verisini bir değişkene atayıp istediğiniz zaman kodla sıfırlayın.
 
Konu Sah
anormie

anormie

Üye
Katılım
7 Ara 2021
Mesajlar
9
Puanları
1
Yaş
22
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
 

huh

Usta Üye
Katılım
10 Şub 2007
Mesajlar
1,231
Puanları
181
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.
 
Konu Sah
anormie

anormie

Üye
Katılım
7 Ara 2021
Mesajlar
9
Puanları
1
Yaş
22
İ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
 

FakirMaker

Paylaşımcı üye
Katılım
5 May 2009
Mesajlar
833
Puanları
106
Kullandığın rotary encoderin marka modelini yazar mısın? Kaç pin çıkış veriyor. En azından bu bilgiye sahip olmamız gerekli.
 

alarmko

Katılımcı Üye
Katılım
14 Ocak 2009
Mesajlar
786
Puanları
56
Yaş
56
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
 
Konu Sah
anormie

anormie

Üye
Katılım
7 Ara 2021
Mesajlar
9
Puanları
1
Yaş
22

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
119,324
Mesajlar
839,519
Kullanıcılar
432,604
Son üye
marjinalyus

Yeni konular

Üst