DC motor hız kontrolü (PI)

Başlatan CoşkuN, 16 Nisan 2006, 16:09:03

CoşkuN

Bitirme projemde belirli bir aşamaya geldim.Şu an ufak DC motoru pwm ile açık çevrim ile sürüyorum.Şimdi işi kapalı çevrime çevirmeye sıra geldi.Dc motorun hızını opto-encoder devresiyle ölçeceğim.Motun ucuna şu eski mouslerdaki çarklardan bağlı.Her boş-dolu kısımda 1-0 üretiyor.Şimdi bunu sayıcıya saydırmam gerekiyor.Burada takıldım işte.Hangi sayıcıyı kullanmalıyım? Aldığım 1-0 bilgisini devir sayısına nasıl dönüştüreceğim?
Ardından bunu PI algoritması ile işleyeceğim.

Erol YILMAZ

Bir nevi frekans olceceksin,

Frekansin dusuk ise iki yukselme zamani arasindaki zaman!
Frekansin yuksek ise 1 sn de gelen yukselme sayisini! olcebilirsin.

Capture modu bahsi gecen ilk yontem icin kullanilabilir...

Klein

hocam eğer amacın bunu yapmaksa sana verecek cevabım yok. eğer amacın bu işi öğrenmekse ,  önce lm2907 ve lm3524 ikilisinin çalışmasını iyice incele. sonraoradan öğrendiklerini işlemciye uygulamaya çalış derim.

OG

Erol'a ilave.

Frekans/Voltage dönüşümü yaparak. Sensorden aldığın frekansı PWM-->DC de olduğu gibi nasıl ki bir RC ünitesi ile kolaylıkla çevirebiliyorsan aynı usul ile hız değeri ile orantılı DC elde edebilirsin.

Hassas dönüşüm için benim kullandığım LM331 entegresiş var. Hem V/F hem de F/V olarak çalıştırılabiliyor. Yeterince doğru bir dönüştürmeye sahip. KA331 olanları almayın, bazı giriş değerlerinde çıkışlarında harmonikler üretiyor.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

KAZIMUGUR


z

İşin içine işlemci girdiyse dediğiniz extra çipler lüx olmaya başlar. Ancak eğer işlemciniz son derece sıradan (yavaş ve/veya işe yarar çevre birimi barındırmıyorsa o zaman ok)

Eğer işlemcinde iki counter varsa birisiyle sample anlarından haberdar olmak için timer modunda çalıştırırsın.

Diğer sayıcıyı da harici clock modunda çalıştırıp sensörden gelen pulsları saymada kullanırsın. Ancak bu yüksek hızlı motorlarda etkilidir. (Örnek alma peryodunda yeterince puls alınabilmelidir)

Eğer capture modulün varsa inen yada çıkan (istersen her ikisi) kenarda sayan bir sayıcının içeriğini yakalatırsın. Burdan geri fark alarak sample başına poziyondaki artımı hesaplayabilirsin.

Eğer motor çok yavaş dönecekse bu durumda sensörden gelen pulslar arasındaki süreyi ölçüp açısal hızı dolaylı olarak hesaplayabilirsin.

İşlemcin tek sayıcı içeriyorsa bu durumda pulsları int ile yakalaman gerekir. Ancak bu sıradan işlemcilerde çok kafa ağrıtabilir.

Eğer PIC işlemci kullanacaksan işlemci seçiminde daha en baştan çok iyi düşünmelisin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

CoşkuN

Özür dilerim hangi işlemciyi kullandığımı söylemeyi unutmuşum.PIC16f877 kullanıyorum.Dil olarak da Hitech PIC C ile yazıyorum.
Dediğiniz gibi ekstra chip kullanmadan bu işi halledebilirsem güzel olur.16f877'de üç tane sayıcı olduğuna göre işimi görecektir herhalde.f/v dönüştürücülere girmeden işi basitçe halledersem daha iyi olacaktır.
Motor olarak kullandığım, okulda mikro deneylerinde kullanılan setlerimiz var asistanlarımızın yaptığı.Onlardan birini ödünç aldım.Üzerinde basit bir H köprüsü düzeneği ve opto-interrupter mevcut.Motor da bildiğimiz ufak DC oyuncak motorlardan.Bu motorların devri sayısı kaçtır tahmini olarak? Sanırım direk opto çıkışını sayıcıya girerek saydırabilirim.
Bu işi hallettikten sonra PI parametrelerini bulmam gerekecek ama o işin en son kısmı.DC motorun modeli elimde olmadığından biraz deneme yanılma yöntemiyle yapmam gerekecek.

z

İşine yararmı bilmem;

Geçmiş yıllarda DC motorun transfer fonksiyonunu deneysel olarak çok yaklaşık tespit eden bir düzenek geliştirdim.

Yöntem şu şekilde.

Yalniz bayağı bir rama ihtiyacın olacak. 100 mikrosaniyede bir sample aldım.

Motoru silkelenmeyecek şekilde sabitliyorsun. İşlemci motora  basamak fonksiyonu şeklinde voltaj vererek max açısal hıza erişip bir süre daha bu açısal hızda  döndürüyor.

Deneyin taa başından beri sabit örnek alma aralığında motordan gelen pulsları sürekli sayılarak Rama yazılıyor. Daha sonra ramda biriktirdiğin bilgileri PC ye aktarıyorsun.

Böylece elinde motorun V/s girişine karşılık Posizyon değişim bilgisini deneysel olarak elde etmiş oluyorsun.

Motorun 2.dereceden bir sistem olduğunu biliyoruz.

Motorun katsayıları bilinmeyen transfer fonksiyonunda bir iki matematiksel işlem yaparak, deneysel pozisyon verilerinden çok özel iki tanesini kullanarak iki bilinmeyenli iki denklemden  iki kutbu elde ediyorsun. (Bu iki özel noktanın nereleri olduğuna sen kafa yor.)

İki kutup etrafında for next tipi döngü ile küçük değişimler yaparak her bir kutuptaki değişimin pozisyonda neden olacağı değişimi analitik olarak hesaplıyorsun. Elde ettiğin analitik sonuçlarla deneysel sonuçlar arasındaki farkın mutlak değerini bütün deney verilerini işin içine katacak şekilde deney süresi boyunca integre ettiğinde sana hata kabarmış bir sayısal değer verecektir.

Daha sonra kutuplardaki küçük değişimlerin neden olduğu hatalardan en küçük olanını seçtiğinde en doğru kutup bilgileri elde edilmiş olur.

Sözkonusu optimum kutupları  arama işi tamamıyla sıralı dene ve hatayı bul mantığıyla çok rağbet gören bir teknik olmasa da  kutuplarda küçük değişimler yaparak  P1 makineye  7-8 saatlik süre zarfında mükemmel sonucu bulan programla  motor transfer fonksiyonunu noktadan sonra 3.4 basamak doğrulukta elde etmiştim.

Gerçektende elde edilen kutupları transfer fonksiyonunda yerine koyup sistemin V/s girişine karşılık vereceği pozisyon bilgisini nokta nokta bilgisayara hesaplatıp grafiğini çizdirdiğimde deneysel verilerle neredeyse tamamı üst üste çakışıyordu.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

@ Bunalmış hocam. Bahsettiğiniz şeyi Akıllı PID ya da Öğrenen PID uygulamalarında görmek mümkün.
Ama keşke arkadaşlar bir  sistemin analog edeğerini öğrenmeden işlemci ile yapmayı denemeseler. daha fazla şey öğrenirler. Eğer arkadaşım önerdiğim yolu inceleseydi , ve üzerinde de biraz düşünseydi , belki benim şu an ticari ürünlerimde kullandığım yöntemi de keşfedebilirdi.  Encoder çözünürlüğüne  bağlı olarak   1ppm( noktadan sonra 6 hane) belki daha az hatayla tutturabilirdi. Saygılar...

z

Haklisin genis dusunmeye kesin katkisi olur. Analog dunyada hizla orantili puls treni PLL ler haricinde bir sey ifade etmedigi icin onu voltaja cevirip analog olarak islemek cok mantikli ancak, digital ortamda dogrudan pulslar arasindaki sure yada birim zamanda gelen pulslarin sayisi da acisal hizla orantili oldugundan sozkonusu islemlerin tamami digital olarak da yapilir.

Analog ve digital sistemler aslinda ayni sey. Fakat hala 3 kurusluk bir kapasite, sinyali  20 Mips islemciden cok daha guzel isliyor.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

baha_35

madem pic c ile yazacan sana RB0 kesmesini öneririm.bu kesmeyle

gelen" 0 "veya "1 "leri sayarsın.877 kesmeyle saymaya basladıgın da

ekstradan bide sure gerekiyorsa zamanlama kesmelerinden birini

kullanarak bu işi halledersin.bende buna benzer bişey yaptım en guzeli kesme ile olan.sana kolay gelsin
"DÜNYA BİR GÜNDÜR ODA BU GÜNDÜR"

CoşkuN

Öncelikle herkese paylaşımları için teşekkürler
@bunalmis hocam, senin dediğin yöntemin bir benzerini başka bir arkadaşın bitirmesinden biliyorum.Yalnız orda motora tako bağlıydı.Osilaskopta motorun step cevabını kaydedip zaman sabitini ve kazancı hesaplayıp basit 1.dereceden transfer fonksiyonu elde ediliyordu.Ancak ben opto ile çalıştığımdan bu yöntem işime yaramayacak.Eğer sistemi kurup seri porttan hız verilerini alıp matlab'de işleyebilirsem,bahsettiğin yöntemi de orda deneyebilirim belki.
Bahsettiğim yöntemle ilgili bir döküman:
http://www.hemenpaylas.com/download/502624/Birinci_dereceden.pdf.html
@klein
Mesajınızda sadece iki adet entegrenin ismini vermişsiniz ve "verdiğim yöntemi inceleseydi,bulurdu" gibi ifade kullanmışsınız ama sadece entegrelerin datasheetinden yöntemi nasıl bulacağımı anlamadım.İnanın be nde herşeyi temelden anlamaya meraklı biriyim.Ancak bitirme tezi konum şu an dijital PI olduğundan buna yoğunlaşmış durumdayım ve tamamlamak için de sadece 1 ayım kaldı.

OG

Alıntı Yapsadece 1 ayım kaldı.
Önce yapabileceğin garantili bir projeyi kafanda oluştur, sonra diğer yöntemler üzere araştır. Mecbur kaldığında hızlı bir U dönüşü ile diğer projeyi uygularsın, nede olsa garantisi var. Bu seni biraz da psikolojik olarak rahatlatır.

Ticari işlerde de çoğu zaman böyle yaparım. Benden istenen bir işde benim kesin yapabileceğim bir usul var ise tamam derim, ardından daha iyi, daha ucuz, daha teknolojik, daha .... yöntemleri ararım. Çoğu zaman işe yarar.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

picusta

KAZIMUGUR'un verdigi pdf güzel. Ama adam tam olarak becerememis, PIC 100Hz'den fazla ADC yapamiyor diye kestirip atmis (debug yöntemi de yanlis). Simdi sen ne tür bir kontrol sistemi yapacaksin?
Ben sana kaskat yöntemini anlatacagim (2 korektörlü).
Motorun modelini sen zaten bilimonline'da vermissin.
Fakat orda verdigin modelin parametrelerinde mekanik zamankatsayisi (J/f) elektrik zaman katsayisindan büyük (L/R) halbuki genelde tam tersi oluyor.
Simdi bana bunu neden söylüyorsun diyeceksin.
Yapacagimiz sey, iki sistemi (mekanik ve elektrik) ayri ayri kontrol etmek için (dekuplaj olmasi için) ikisinin frekansini birbirinden uzaklastirmak.
örnek olarak diyelimki elektrik zaman katsayisi 5ms ve mekanik katsayisi 100ms. Böyle olunca ilk korektöre (elektrik sistemi (akimi) kontrol eden) göre mekanik sistem (hiz) nerdeyse sabit (5ms süresince hiz sabit sayilir), böylece sadece 1.dereceden bir sistem kontrol edecek, bunun için P korektör yeter bile.
Ilk korektörün amaci akimi sabit tutmak, sistemi fazla hizlandirmaya gerek yok, üstelik seçecegin örnekleme hizi da buna bagli olacak, en az sistem hizinin 5 kati, en fazla 20kati. Normalde L/R 5ms ise yapacagin korektör sistemin hizini 2ms'ye çikaracaksa seçecegin örnekleme hizi 2/10 = 200mikrosaniye olacak. Bu süre içinde akimi ölçeceksin(ADC), hatayi hesaplayacaksin, P ile çarpacaksin ve PWM'ye yazacaskin (P'yi 2nin üssü olarak seçmende fayda var).
Birinci korektör bittikten sonra bunu test etmelisin, çalisirsa akim istenilen degerde kaliyorsa (motorun hizinda ve yükünde degisiklige ragmen), ikinci korektörü yapabilirsin.
Ikinci korektörün örnekleme hizi birincisine göre daha yavas olacak. 10ms (veya 20ms) yeterde artar.
Bunun yapacagi sey hizi ölçmek, karsilastirmak, ve PI yapmak sonra çikan degeri birinci korektörün girisine vermek.
Sana tavsiyem PIC'i 20MHz kristal ile çalistirmak, (yapilabiliryorsa 18F kullanmak içinde 8bit çarpim var).
Capture modülünü kullanman, korektörlerin çalismasi için minimum hiz limiti belirlemen (%20), böylece capture autorecharge degerini hesaplayabilirsin. puls gelmiyorsa software önlem alman.
Baktin motorun mekanik zaman katsayisi çok yavas, veya elektrik zaman katsayisina yakin o zaman motora ilave atalet baglamalisin. Elektrik çok hizli ise (PIC hesaplama gücü yetmiyorsa) ilave seri bobin ekleyebilirsin.
Sistem parametrelerini bulmak için öyle program yazmaya kalkisma, System identification toolbox ve curve fitting ile hallet.
sistemi tanimlamak için de motoru 0'dan kaldirma, kalkis sürtünmeleri lineerlestirmeyi bozar. %50 hiz ile çalistir sonra +/- %10 ver.
Simdilik bu kadar.