Simulink ve Arduino ile Fırçalı DC Motor Tanıması: Örnek Olarak Pololu Metal Gearmotor Parametrelerinin Kestirilmesi

Anahtar kelimeler: Arduino, DC motor sistem tanıması, DC motor sürücü, parametre kestirimi

Pololu Metal Gearmotor parametreleri, Arduino ve Simulink aracılığı ile kestirilmiştir. Bütün kodlar bu sayfanın en altında mevcuttur.

Donanım

Mikrodenetleyici. DC motoru sürmek ve enkoder çıkışlarını okumak için Arduino UNO kullandım. İki adet kesme (interrupt) pini ve iki adet sayısal (dijital) çıkışı olan herhangi bir denetleyici kullanılabilir.

DC Motor. Bu örnekte kullandığım 30:1 Metal Gearmotor 37Dx68L mm with 64 CPR Encoder modelidir. Motor 12 voltta sürülmek üzere tasarlanmıştır. Zorlanma akımı 5 A ve en yüksek hız 350 rpm’dir.

DC Motor Sürücü. Mikrodenetleyicinin pin çıkışları DC motor sürecek kadar akım sağlayamazlar. Bu sebeple güç devreleri gerekmektedir. Zorlanma akımı 5 A olduğu için, 5 A’den yüksek akım sağlayabilen sürücü devresine ihtiyacımız var. Motor en iyi performansı 12 voltta verdiği için, sürücümüzün çalışma aralığı 12 V’u içermelidir. Pololu 18v7 sürücü devresi 7 A’e kadar akım sağlayabilir ve 5.5 V – 30 V çalışma aralığına sahiptir. Bu sebeple bu entegreyi tercih ettim.

Güç Kaynağı. IMotoru sürerken 12 V ve 5 A’ya ihtiyacımız var. Bu sebeple güç kaynağımızın P > (5 A)\cdot(12 V) = 60 W güce sahip olması gerekiyor. Mean Well RS-75-12 modeli 75 W güce sahip ve 12 V’de çalışıyor.

Tablo 2’de kullanılan ürünler ve fiyatları listelenmiştir. Fiyatlar ABD liste fiyatlarıdır.

Table 1: Hardware list with prices.
HardwarePrice
Total$102.89
Arduino UNO $4.99
30:1 Metal Gearmotor with 64 CPR Encoder$39.95
Pololu 18v7 Motor Driver $33.99
Mean Well RS-75-12 Power Supply $23.96

Dinamik

dc_motor_estimation_motor_equivalent

Şekil 1 – DC Motor elektrik modeli

DC motor dinamikleri elektriksel ve mekanik davranış olarak ikiye ayrılır. Şekil 1’de DC motorun elektrik eşdeğer modeli görülmektedir. Motora giren akım i ve motor milindeki tork \tau arasında aşağıdaki gibi doğrusal ilişki vardır.
\tau(t) = K_t i(t).

Motor mili dönerken, motor ters EMF gerilimi üretir. Bu gerilim mil hızı ile orantılıdır.
\dot{\theta}
V_B(t) = K_e \dot{\theta}(t).

DC motor için K_t = K_e.. Motor dinamikleri aşağıdaki gibidir
(1) J_m\ddot{\theta}(t) + b_m\dot{\theta}(t)=K_ti(t)
(2) L\dfrac{di(t)}{dt} + Ri(t) = V(t) - K_e\dot{\theta}(t)..
Burada V motora uygulanan gerilimdir. Diğer parametreler Tablo 2’de listelenmiştir. Denklem (1) mekanik davranışı, Denklem (2) ise elektriksel davranışı modellemektedir. DC motorun Simulink ortamında hazırlanan blok diyagramı Şekil 3’de görülmektedir.

Table 2: DC motor parameters and the resulting values after identification

 ParameterEstimated ValueUnit
(J_m)Moment of inertia3.1321\times 10^{-6}kg\cdot m^2
(b)Viscous friction9.8734\times 10^{-7}
(K_e)Back EMF constant0.0106V/ rad/ s
(K_t)Torque constant0.0106N\cdot m/ A
(R)Resistance2.3417\Omega
(L)Inductance 0.0211H

DC Motoru Arduino ile Sürmek

hardware_diagram-1

Şekil 2 – Donanım diyagramı.

Motor sürücü devresinin ROT ve PWM olmak için iki girişi vardır. Bu girişler mikrodenetleyici tarafından kontrol edilir.

Uygulamada, motordaki gerilim V(t) analog bir işaret değil, bunun yerine PWM işaretidir. PWM işaretinin analog işaret eşdeğeri, güç kaynağı ve pwm işareti ile aşağıdaki gibi tarif edilir
\vert V(t) \vert = (12~\mbox{V}) \cdot \%\mbox{Duty}_{\mbox{PWM}}.

Yukarıda sadece motor gerilimin mutlak değerinden bahsettim. Akımın yönü, yani gerilimin pozitif veya negatif olduğu ROT girişinin yüksek (HIGH) veya alçak (LOW) olması ile belirlenir. Motora gerilim uygulamak için aşağıdaki kod parçası kullanılır.

Enkoder çıkışlarını, Arduino’nun kesme girişleri ile okuyacağız. Aşağıdaki kodu bir Youtube videosundan (link) buldum. Detaylı bilgi için, oraya başvurabilirsiniz.

Sayısal kontrol uygularken, belirli örnek zamanlarında sistemi tahrik etmek, veya sistem çıkışlarını okumak isteriz. Arduino’nun örnekleme zamanlarında işlem yapması için aşağıdaki şablonda bir kod parçası kullanılabilir.

The rotor speed is approximated with Backward-Euler method
\dot{\theta}(t)=\dfrac{\theta(t)-\theta(t-T_s)}{T_s}

DC Motor Parametrelerinin Kestirilmesi

Kestirim için DC motoru iki farklı işaret ile sürdüm ve mil hızlarını kaydettim. Kesin sonuçlar elde etmek için, DC motor mümkün olduğunca farklı frekanslarda tahrik edilmelidir. İki işaretin ilki, DC bileşenlerini bulmak için kare dalga uygulamaktır. İkincisi ise sinüslerin toplamı şeklinde yazdığım bir Fourier işaretidir. Fourier işareti aşağıdaki gibidir.
V_2(t)=3.7\cdot (\sin (2\pi 0.1t)+\sin (2\pi 0.2t)+\sin (2\pi 0.4t)+\sin (2\pi t))

Örnekleme zamanımız 10 milisaniye (100 Hz) olduğu için, 50 Hz’e kadar harmonikler fourier işaretine eklenebilir (Nyquist Rate). Fourier işaret girişi ile deney ve kestirim sonucunda elde edilen parametreler ile yapılan benzetim Şekil 3’de görülmektedir. Deney ve benzetimin uyumundan, iyi bir kestirim yaptığımızı anlayabiliriz.

dc_motor_estimation_fourier_signal

Şekil 3 – Fourier işareti için deney ve benzetimin karşılaştırılması.

DC motor modelinin Simulink’teki blok diyagramı aşağıdadır.

dc_motor_system_block_diagram

Şekil 4- Simulink blok diyagramı.

Sistem tanıma için kullandığım Arduino kodu buradadır.

Sistem Tanıma Süreci

sistem tanıma birden farklı çözümle sonuçlanabilir. Biraz teknik olacak ama, optimizasyon bakış açısıyla bakarsak yerel en küçük noktalardan bir tanesinde süreç bitebilir. Gerçekte ise cevap bir tanedir. Gerçek parametrelere ulaşmak için ilk tahminin (bunu biz yapıyoruz) gerçek değerlere yakın olması gerekmektedir. Adımlar aşağıda listelenmiştir.

  • Arduino kodunu buradan indirin. Kodu kendi DC motorunuz, güç kaynağınız ve enkoder bilgilerinize göre güncelleyin.
  • estimationMode = 1 seçerek Arduino’nuza kodu yükleyin. Serial Monitor’de gördüğünüz sonuçları Matlab’in komut ekranına kopyalayıp yapıştırın. Matlab’de aşağıdaki satırları yazın.
  • estimationMode = 2 seçerek Arduino’nuza kodu yükleyin. Serial Monitor’de gördüğünüz sonuçları Matlab’in komut ekranına kopyalayıp yapıştırın. Matlab’de aşağıdaki satırları yazın.

    • DC Motorunuzun besleme uçları arasındaki direnci (R parametresi) avometre yardımıyla ölçün. Bu bizim ilk tahmin değerimiz olacak. Eğer avometre yoksa, Motorun Besleme Gerilimi / Zorlanma Akımı değerini de ilk tahmin olarak kullanabilirsiniz. Bizim örneğimizde bu değer (12 V / 5 A = 2.4 Ohm).
    • Matlab erkanın J, b, R, L, K olmak üzere 5 farklı değişkeni ilk tahminlerinizle oluşturun. Direnç değeri için ilk tahmini geçen basamakta elde etmiştik. Diğer değerler için ilk tahmini Tablo 2’ye bakarak yapabilirsiniz. Zaten gerçek değerleri bulmak sistem tanıma işleminin görevidir.
    • İki adet giriş ve çıkış işaretini, Matlab’de oluşturmak için aşağıdaki satırları yazın.

  • Simulink modelini buradan indirin ve dosyayı açın. Analysis menüsünden The parameter estimation pencerisini açın.
  • Kestirimi yapılacak paremeterleri seçin (Select Parameters). TParametreler için üst ve alt sınırlar girmeniz gerekcektir. Bunu şekilde görebilirsiniz. Direnç için ilk tahmininizi içeren dar bir aralık seçin. Benim örneğimde 2 ve 3 ohm aralığını seçtim. Diğer parametrelerde alt sınır 0 olmalıdır. Çünkü negatif parametreler olamaz.

DC_motor_ident_set_variables

  • İki yeni deney ekleyin (Add Experiments). Girişler olarak fourierInput ve squareInput, çıkış değişkenleri olarak fourierOutpu ve squareOutput seçin. Select Measured Output Signal bölümünden DC Motor:1 (Speed) ve  Select Input  bölümünden DC Motor: 1 (Voltage) olarak seçin. İki deneyi de hem kestirim (estimation) hem de doğrulama (validation) için sol taraftaki kutudan işaretleyin.
    dc_motor_estimation_choose_experiments
  • Kestirim işlemini başlatın. ABenim örneğimde kestirim bittiğinde, 0.64 ve 1.61’lik maliyet fonksiyonları elde ettim. Tablo 2’de kestirim sonucu görülebilir.

dc_motor_estimation_resulting_simulink