Arduino Uno ile Dc Motor Hız Kontrolü Yardım!!!!

Başlatan seref_92, 08 Mayıs 2015, 00:06:47

seref_92

Öncelikle herkese iyi günler.Benim sizden bir ricam olacak.Bitirme projesi olarak arduino ile dc motor hız kontrolü yapacağım.Sistemin kapalı çevrim olması gerekiyor.Bu sebeple bir başka dc motoru generatör modda kullanacağım.Ama generatörden alacağım gerilim değerini arduino da nasıl işleyip kontrol yapacağım.Birde displayde rpm değerini gerilim değerine bağlı olarak gösterme şansım var mı?Yardımcı olursanız çok sevinirim.

Cemre.

#1
Geri beslemeyi generatör ile yapmak şart mı? Enkoder dururken?
Eğer şartsa generatörün devir sayısı üreteceği gerilimi etkileyecektir ve çıkış gerilimini doğrultup gerilim bölücü ile 5V seviyesine çekebilirsiniz. Generatörün uyarmasıydı bilmemne diyene kadar alın bir enkoder rahat edin.

mesaj birleştirme:: 08 Mayıs 2015, 11:44:24

Bir de yanlış anlamazsanız, yardım!!!!! Gibi başlıklar açmak pek uygun değil diye biliyorum forum kurallarını okursanız.

Kendiniz birşeyler kattığınız sürece sorularınıza cevap alırsınız merak etmeyin..

seref_92

#2
Hüseyin Bey,ilginiz için teşekkür ederim.Generatör seçmemin nedeni diğer projelerden farklı olması.Dc motorum 5 v ile çalışan oyuncak motorlarından.Generatörden gelen sinyali tekrar 5v seviyesine indirmem gerekir mi?

mdargut

İki motor da aynı ise, zaten mekanik kayıplar nedeniyle çıkışta 5V alamaman gerekir. Ama ben olsam yinede bir zener eklerdim çıkışa. Devir ölçümü için enkoderli bir motor kullanabilirsin. yada kendin bir enkoder eklersin. Jeneratör çıkış sinyalinden devir ölçülebilirmi bilmiyorum açıkçası. Çıkış sinyalini bir incelemek lazım.

ferit06

Hız kontrolü için kullanacağınız motorun tüm hızlar için doğrusal bir çıkış verebildiğinden eminseniz, çıkış voltajı ile orantılı olarak hız kontrolü yapabilirsiniz. Eğer osilaskopunuz varsa veya kullanım için erişim imkanınız varsa motorun ürettiği sinyali inceleyin. Hız kontrolü için motor kullanırsınız ama farklı yöntemler uygulama şansınız olur.

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

seref_92

Verdiğiniz bilgi ve fikirler için çok teşekkür ederim.Farklı yöntemler geliştirmeme yardımcı oldunuz.Birinci motorumu 5 v ile beslediğimde generatörden yaklaşık 4.6-4.7 v civarında bir çıkış elde ediyorum.Motoru arduino dan beslemedim,daha düşük devirle dönüyor.Yardımlarınız için tekrar teşekkür ediyorum.

Cemre.

#7
Motoru arduino'dan beslemeyi denememelisiniz zaten. Kalkış akımları, hele de yük varken çok yukarılara çıkabilir.

Benim size tavsiyem naçizane şu olabilir. Öncelikle motoru sürecek devreyi kurun. Bu H-Bridge yapısı kurarak da olur, bu yapıyı içeren motor sürücü entegresi kullanarak da. Bu tarz konuları arduino ile çizgi izleyen robot vs yaptıkları konulardan öğrenebilirsiniz mesela.

Siz motorun devrini veya yönünü değiştirmek için arduino ile PWM üreteceksiniz. Bir de bunu araştırın.

İkinci kısım ise devir (gerilim seviyesi (ADC)) olsun.

Önce ADC nedir bir bunu öğrenin. Sonra da farklı devir seviyelerinde (bu devri bir herhangi bir devir ölçer yardımıyla ölçmeniz gerekiyor) generatörün çıkış voltaj seviyelerini grafik oluşturacak şekilde matlab vs gibi bir programda modelleyin.
Yani generatörün çıkış gerilim karakteristiğini bulun.

Bunu yaptığınızda zaten hangi devirde hangi gerilimin üretildiği az çok görülecek. Eğer örneğin LCD ile devir sayısı gireyim sabitlesin diyorsanız PID algoritmaları konularını da işin içine katarsınız, gayet de güzel proje olur bence.

Yukarıda bahsettiğim yöntemin işe yarayacağının garantisini veremem. Çünkü generatör çıkış geriliminin karakteristiğinin lineer bir fonksiyon olma ihtimali yok bence.. Bu da işi karmaşıklaştırıyor zaten. Eğer bu grafikten yaklaşık bir formül üretebilirseniz PID ile birlikte güzel bir iş çıkar sanıyorum..

Bu arada eğer bu yıl bitirecekseniz biraz geç kalmışsınız gibi, umarım zaman problemi yaşamazsınız.
Başarılar..


mesaj birleştirme:: 08 Mayıs 2015, 19:23:18

Eğer devir sayısı gösterme gibi bir derdiniz yoksa şunu da yapabilirsiniz. Siz 8bit'lik bir PWM ürettiğinizde bunun değeri 0-255 arasında olacak. Yine 8bit'lik bir ADC ile generatörü okuduğunuzda da bunun değeri 0-255 arasında olacak.

Şimdi motoru max devirde sürün ve 255'e yakın bir ADC değeri okuyun. 255 olması çok zor kayıplardan dolayı. Diyelim ki ADC değeriniz 0-230 arasında değişiyor. Yani sizin max devirde sürdüğünüz motorun generatörde ürettiği gerilim (230/255)*5V'tur. Arduino'nun "Map" komutu ile bu değeri (0-230 değerini) 0-100 arasında map'leyip %olarak devir yazdırılabilir sanıyorum. Denemek lazım ama çok sağlıklı sonuç vermez gibi, günü kurtarır.

seref_92

#8
Fan kullanıp ,Kızılötesi rpm ölçümü yapsam,sistem kapalı çevrim oluyor mu?Olmuyorsa kapalı çevrim sistemi nasıl elde ederiz? Ölçtüğüm değerle,referans olarak girdiğim değeri bu sistem için nasıl karşılaştırırım?

Cemre.

Kapalı çevrim sistem, sistemin çıkışından geribesleme (feedback) alınan sistemdir. Otomatik Kontrol Sistemleri gibi bir ders almışsanız haberdarsınızdır sanıyorum.

Sisteminizin çıkışı nedir? Fan'ın devri.
Fan'ın devrinden nasıl geri besleme alınır? Devir sayılarak.
Alınan geri besleme sisteme dahil edilirse bu işin adı kapalı çevrim kontrol sistemidir.

Siz optik devir ölçümü yaptığınızda fanın kanat sayısına bağlı olarak örneğin 1milisaniye boyunca gelen pulse'leri sayacaksınız ve buradan da basit matematik ile devir sayısına ulaşacaksınız. Örnekleme süreniz ne kadar kısa olursa o kadar keskin sonuçlar alırsınız. Tabi ki devir sayınızın çok çok üstünde bir süre seçmeyeceksiniz, yani en az iki pulse girecek bir örnekleme süresine ki sayma işlemi işe yarasın.

Bundan sonra yapacağınız şey geribesleme aldığınız değerle girdiğiniz değeri karşılaştırmak. Gerisi PID olur PI olur, kontrol algoritması yazılıp devirin sabitlenmesi işlemidir.

seref_92

Arkadaşlar yazdığım kodları size göndermek istedim.Şuanki problemimiz,potun motor hızına herhangi bir etki etmemesi.Yazılımsal bir problem olduğunu düşünüyoruz .Çünkü aynı devreyi açık çevrim olarak motor hızını potla kontrol edebiliyoruz.

#include<PID_v1.h>
int generator=A2;
int potPin = A0;
int motorPin = 3;
int MotorOutputDegeri=0;
int potDegeri = 0;
int motorDegeri = 0;
int generatorDegeri=0;
float Kp=2.5;
float Ki=7;
float Kd=1.1;
double Setpoint,Input,Output,MotorOutput;
PID myPID(&Input, &Output, &Setpoint, Kp,Ki,Kd, DIRECT);

void setup() {
  // put your setup code here, to run once:
potDegeri = analogRead(potPin);  
motorDegeri = map(potDegeri, 0, 1023, 0, 255);
generatorDegeri=map(generator,0,1023,0,255);
myPID.SetMode(AUTOMATIC);
Serial.begin(9600);
}
void loop() {
Setpoint=motorDegeri;
Input=generatorDegeri;
myPID.Compute();// put your main code here, to run repeatedly:
MotorOutput=motorDegeri+Output;
analogWrite(motorPin,MotorOutput);
Serial.print(potPin);
delay(250);
}

fatih6761

potDegeri = analogRead(potPin);  
motorDegeri = map(potDegeri, 0, 1023, 0, 255);

Bu kısım setup'ta değil loop'un içinde (başında) olmalı.

seref_92

generator değeri kısmını da loop a mı atmamız gerekiyor?

fatih6761

Evet o kısmı da. Kopyalarken dışarıda kalmış potDegeri, motorDegeri ve generatorDegeri değişkenleri her 'loop'ta güncellenmeli.

seref_92

hocam dediğin kodların yerlerini değiştirdim ,pot değeri hızı etkiliyor.Yalnız yukarda yazdığım programa göre pot değerini sıfırladığımda hız sıfırlanmıyor.ve motor girişinde 2 v luk bir gerilim gözüküyor.Yazılımsal bi hata olabilir mi? Sizden ricam kodlarla ilgili bi problem var mı,bakabilir misiniz?

Ayrıca devrede kullandığım 2n2222 transistör,generatörü de bağladığımda 4 kat fazla akım çektiğinden çok ısınıyor.Bana önerebileceğiniz yaklaşık 1 a lik bir transistör var mı?(Not:Generatörle birlikte motorun çektiği akım 0.8 ma oluyor)