Sabit mesafede değişken hızlı ivmelenme Algoritması

Başlatan Mucit23, 08 Temmuz 2014, 18:13:38

Mucit23

Arkadaşlar cevaplar için teşekkürler. Hepsini dikkatlice okudum.

Dün gece ambar7'nin bahsettiği yöntem üzerinde bayağı bir çalıştım. Diyelim her 50 pulslık bir artış sonunda pwm duty değerini 1 arttırdım. encoderin artışı sırasında if(Encoder_GetCounter()%50==0) ise pwm_duty++ şeklinde bir sorgulama yaptım. Motorda lineer bir artış olmadığı için ilk başlarda güzel çalıştı fakat motor hızlandığı için enkoderden gelen pulslar atlanmaya başladı. Yani işlemcinin yukarıdaki kodu çalıştırma hızı enkoderin artış hızına yetişemedi. Bu konuyu eledim.

@Ramu

Hocam yazdıklarınızı dikkatlice okumaya çalıştım. Anladığım kadarıyla encoderdeki artışın nekadarlık bir sürede gerçekleştiğini bularaktan çözüme gitmişsiniz.

PWM'in duty oranıyla Motorun Dönüş hızı dolayısıyla encoderden gelen pulslerın sıklığı arasında bir ilişki kurmak imkansız. Düşünsenize Motor boşta iken %20 duty ile 1 saniyede 1000 puls gelirken, Yine aynı duty oranında motoru yüke bindirelim, motor devri düşeceği için 1 saniyede belki 750 puls gelecektir.

Burada işi karıştıran 4000 puls'lık mesafe içerisinde bu işin bitirilmek istenmesi. Ama şimdi düşünüyorumda 4000 puls'lık mesafenin sonunda sadece süre ile oynayarak %80 duty'ye çıkmak mümkün değil gibi. Bir türlü çıkamıyorum işi içinden.

@ trgtylcnky

Hocam konuyu hız bakımından ele almayın.

0-4000Metrelik bir yol olduğunu düşünün. Benim bu yol üzerinden sonuca varmam lazım. Bu mesafe Sabit kalacak şekilde yolu sonunda PWM duty oranımı %80 yapmam lazım. %80 olduğu sırada motorun kaç tur döndüğünün bir önemi yok. Çok şey düşünüyorum ama bir türlü sistemi aklımda oturtturamıyorum. Sanki atladığım bir konu var.

Ama dünden beri içimden bir ses bu işin PID'ile olacağını söylüyor ama içimdeki ses nereden başlamam gerektiği konusunda hiçbir bilgi vermiyor. Düşünüyorumda PID olgoritması bu konuda nasıl bir fayda sağlar bilmiyorum. @hasankara'nın söyledikleri ilgimi çekiyor. Biraz konu üzerinde düşünüp konuyu araştırmam lazım. Çok yabancıyım.

Kabil ATICI

4000'lik sayaçta ne kadarlık hata kabul edebilirsin bilmem. İfadende sayacın 50 eşitlemek yerine 50 büyük eşit şeklinde bir kaşılaştırma yapabilirsin.
Hatta hız arttıkça ne kadar hata yapar bilemem ama gerekirse hatayı karşılama adına 45-49 gibi bir değer ile karşılaştırılabilir. Böylece büyük eşit sonucu oluşabilecek hatalar azaltılabilir.
ambar7

Mucit23

Hocam aslında lineer bir artış istemiyorum. Lineerlikten vazgeçtim.

Aslında hocam pid ile olur ama iki tane error parametresi olacak. 1. Error parametresi  Motora uyguladığımız şuanki Duty ile Hedef Duty(%80) arasındaki fark. 2. Error parametresi ise Şuanki Timer değeri ile Hedeflenen timer değeri (4000) arasındaki fark. Bu iki parametreyi PID fonksiyonuna sokup bir şekilde çıkış elde etmek lazım.

Bu iş birazda köfte ile ayranı aynı anda bitirmek gibi birşey.

Hasan hocam pid konusunda biraz çalışmak istiyorum. Bahsettiğiniz yöntemi biraz daha açabilirmisiniz. Biraz PID kontrol bilgim var ama inanın yazdıklarınıza çok yabancıyım

Birde bugün Bilgisayar mühendisliğinden bir arkadaşımla bu konuyu epeyce bir konuştuk. Bana Bulanık Mantık(Fuzzy) uygulanabileceğini söyledi.  Bu konuda düşünen oldumu hiç?

Kabil ATICI

Arlatmaya çalıştığım konunun bir şeyi yok. Sadece programlama ile ilgili bir şey. Şimdi sen ne yapıyorsun?
Pulse sayacının okuyorsun, eğere değeri 50 ise Duty değerini  1 artırıyorsun.
basitçe
if (pulse_sayac==50)
{
DUTY++
}


gibi. Burada eğer sayacı okuduğunda 50 değerini kaçırırsan ne olur pulse_sayac alır başını gider.

Ama sen
if (pulse_sayac=>50)
{
DUTY++
}
yaparsan sonuçta bir şekilde 50 değeri aşılsada her halikarda DUTY değerin artırılır.
İşlemcinin hızı erişemeyeceği durumda ki kesinlikle olduğunda sayacını sen %80 olayına 4000 üzerinde yakalarsın. artık bu 4050-4200 artık kaç tanesinin kaçıracağına bağlı olarak...

if (pulse_sayac=>45)
{
DUTY++
}
kaçırılma durumunda en azından bir bölümü tolere edilir 4000 değerine yaklaşır...


Fuzzy olarak düşünürsek

if (pulse_sayac=>50)&& (pulse_sayac=<99)
{
DUTY++
}
if (pulse_sayac=>100)&& (pulse_sayac=<149)
{
DUTY++
DUTY++
}
if (pulse_sayac=>150)&& (pulse_sayac=<199)
{
DUTY++
DUTY++
DUTY++
}
if (pulse_sayac=>200)&& (pulse_sayac=<249)
{
DUTY++
DUTY++
DUTY++
DUTY++
}
if (pulse_sayac=>250)
{
DUTY++
DUTY++
DUTY++
DUTY++
DUTY++
}
şeklinde düşünülebilir. Bunla sadece örnek tabii. Kullandığın derleyiciye gören düzenlemen gerek..
Bu durumda yine 4000 değerine göre yaklaşıklık olayı düşünülebilir.
ambar7

RaMu

Daha önce yazdığım mesajdan farklı bişey yazmadım aslında.
Ve dediğin gibi değil
sen sabit ivmeli hareket istiyorsun
yani hızın artış oranıyla, geçen zaman doğru orantılı demek,
yani t sürede bir pwm i %sabit arttırmak
burada yük sabit ise (yani 4000 lik yolun tamamında var ise)
yükün t ile pwm arasındaki ilişkisine etkisi doğrusaldır yani hiçbirşeyi değiştirmez.
Sabit ivmeli harekette yol ile hız arastındaki ilişkiyi incele
daha önce yazdıklarımın aynısı zaten.





Soru şu değilmi;

ben bir koşucuyum
4000 cm ye (encoder 4000 saydı) vardığımda hızım (pwm duty) %80 e ulaşmalı,
ve hızımı zamanla lineer olarak arttırmak zorundayım,
bu esnada sırtıma yük bindirip koşturabilirler,
koştuğum yol rampa aşağı-yukarı veya düzlük olabilir,
yük her koşumda farklı olabilir.

Kısaca başlangıç olarak düz bir yolda yüksüz bir şekilde
ve eğer pwm_duty ile motor hızı lineer değişseydi
yapmak istediğin sabit ivmeli hareket olur,
çünkü hızını zamanla lineer olarak arttırmak istiyorsun
buda sabit ivmeli hareket demek,
sabit ivmeli harekette konum zaman ilişkisi
(ki zaman arttırkça hızıda aynı oranda artıracağız yani pwm_duty)
x=x0 + V0*t + (a*t kare)/2

sabit ivmeli harekette konum hız ilişkisi
Vkare = V0 + 2ax - 2ax0
il hız 0 ilk konum o ise
Vkare= 2ax
V = kök (2ax)
2 ve a sabit olduğuna göre
hızın karesiyle yol lineer değişiyor
hız ile yolda üssel olarak değişiyor

Kısaca (encoderden okunan değerin karekökü ) / bir sabit =  pwm_duty oluyor.

Şimdi hız yüklü ve yüksüz bir motorda
veya yokuş yukarı veya yokuş aşağı giden bir motorda
yol ile nasıl ilişkilidir
yükün bu işe etkisi ne onu incelemek lazım
eğer yük yolun bir kısmında var bir kısmında yok ise durum kötü
veya yolun bir kısmı yokuş bir kısmı bayır aşağı ise durum kötü
diğer durumlarda
motor yüklüde olsa yüksüzde olsa
yol yokuş aşağıda olsa yukarıda olsa
hız ile yol arasındaki ilişkiyi bozmaz

ama hız ile pwm_duty arasındaki ilişkiyi bozar
ve yine sabit yol (ne aşağı ne yukarı)
ve sabit yük (yolun tamamında yüklü veya yüksüz)
durumunu ele alırsak
bence şimdilik hiç ele almayalım
en iyisi yük ne olursa olsun hızı değişmeyen motorlara yönel :)
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

hasankara

şimdi baktım da herkes kafasına göre takılanlara bağlamış gibi olacak biraz ama :D ben anlatmaya çalıştığımı farklı cümlelerle biraz daha açmaya çalışayım.

mesela pid algoritması ile motoru sabit hızla döndürmek istediğimizde, pid algoritmasına, motorun güncel hız değerini giriyorduk. daha önce sanırım bununla uğraşmış idin diye hatırlıyorum, bu geçmişinden faydalanmış olayım. belki hedef ile güncel değer arasındaki fark değeri de değerlendirmeye katmış olabilirsin. bu nokta kafanı çok karıştırmasın, dedim ya benim yazdığım örnek kod işlemciyi yormayacak ama bir miktar kötü reaksiyon verebilen giriş seviye estimate algoritması. yani pwm artacakken veya azalacak iken hedefle güncel değer arasındaki farkı da (hata) parametre olarak kullansak daha hızlı reaksiyon vermesini sağlayabiliriz. ama sen hele bir benim dediğim gibi işini yap reaksiyon sonrasında dahada iyileştirilir. hatta şunu söyleyebilirim motor kalkış anında çok fazla değişken yük değerine sahip olmayacaksa daha iyi reaksiyon vermesine ihtiyacın olmayacak gibi. çünkü bu algoritmayı bende buck devresinde kullanıyorum ve gayette yetersizliğini görmedim. destekleyici olması için şu resmi ekleyeyim zihinde canlanması için;
http://en.wikipedia.org/wiki/Gauss%E2%80%93Newton_algorithm#mediaviewer/File:Gauss_Newton_illustration.png

Bu uygulamada sanırım seni yoracak olan algoritma ivme algoritması. onun için yarın bir şeyler yazmaya çalışırım artık.

RaMu

Fotoların linkini
[*img*]   [*/img*]  arasına *lar olmadan
koyarsanız forumda direk görebiliriz.

Örnek sizin linkini verdiğiniz foto;
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

hasankara

şimdi probleminde şunu fark ettim, sen sabit ivme elde etmeye çalışıyorsun ama başka bir koşul da sınır değerleri içerisinde kalmak da istiyorsun. aslında tamda yarım ekmek döner le ayranın sonunu denkleştirmek gibi. yani sen anlık baktığımızda sabit ivme elde etmek istiyorsun ama rotaya baktığımızda iş sonunda o noktaya da ulaşmış olmak istiyorsun. lafı uzatmadan algoritmadan konuşayım.

ben konuya yaptığım ilk yorumda hedefinin sabit bir sayı olduğunu yazmıştım. tamam idealde bu sonuç verir ama buna güvenmemeliyiz. sonuçta iş sonunda ulaşmak istediğin noktayı da göz önünde bulundurman gerek. sana bir grafik çizicem şimdi leb demeden leblebiyi anlayacaksın.



sarı oklar senin ölçtüğün güncel ivme değerleri gri olanlar sa hedef ivme değerin. mavi olan çizgi, ortalama seyredilen eğim.

resimdeki hedef tabiri(gri oklar) her kontrol noktasında pid algoritmasının ulaşmak istediği anlık hedef ivme değeri anlamını taşımakta. algoritma işleyiş gereği hedefin gerisine düşüp tekrar ilerisine geçilerek ve bu şekilde sürerek devam edeceğini biliyoruz. ama ne kadar gerisine düşecek ne kadar ilerisine geçecek bilmediğimiz için ve bu farkların hep sabit kalacağına emin olamayacağımız için rotadan sapacağı ihtimalini göz önünde bulundurmalıyız. sol resimde sabit sayısal değer verdiğimizde sonuçta rotadan sapabileceğini göstermek istedim. ama sağ resimde ise her kontrol noktasında daima rotadaki hedefe yöneleceği için ortalama olarak rotadan sapmayacağını göstermek istedim.

ilk yorumumda bahis ettiğim deneme yanılma yaparak elde edeceğin, tüm katsayıların dahil edildiği sayı da artık değişken haline geldi. ama topu topu 3 aşağı 5 yukarı değişkenlik gösterebilecek, yani çok fazla ahım şahım bir fark olmayacak aslında ama çok uzun süreçte rotaya göre ciddi sapmalar meydana gelebilir.

fark ettiğim diğer nokta ise duty: hız , encoder: yolu ifade etmekte. sen bu grafiği vererek zaten ivmeyi belirlemiş oluyorsun. yani ivmeyi 1 vereyim 5 vereyim de ti süresini değiştirmiş olayım demek sakat bir deyim. sen süreyi değiştirmek istiyorsan rotayı değiştirmişsin demektir. sonuçta zaman hız yol hepsi birbirine bağlı parametreler zaten.

Mucit23

#23
hocam konuya pasif durduğuma bakmayın. Takip ediyorum. Dün denemelerim esnasında ne olduysa board üzerine kurduğum IR2101 li H köprüme birşeyler oldu. Komple Tekrardan dizdim düzelmedi. IR2101 ve mosfetleri değiştirdim aynı sorun. IR2101'in High Side mosfeti süren çıkışı PWM ile birlikte 3V seviyelerinde kalıyor. Normalde 24V motor beslemesiyle birlikte 36V felan olması lazım.

Bunu çözdükten sonra devam edeceğim.

Hatta dün değişik bir yöntemle iyi bir sonuç almıştım. Aksilik işte...

Edit, Low Side çıkışında sıkıntı yok. Aktifken çıkışta 12V civarı bir gelirim görüyorum. Ama high Side çıkışında PWM sinyalinin genliği 3V civarında kalıyor. Neden olur bu?

hasankara

mosfet bozuk olup gerilimi düşürüyor olabilir. osiloskoptan bakıyorsun değil mi ? tepe değer gerilimini söylüyorsun yani. high side da n mosfetle sürüyorsun anladığım kadarı ile. normal şartlarda sürücü çıkışına, Vb geriliminin 12 volt üstünü uygulaması gerek entegrenin. Vb pininin mosfet sourcesine doğru bağlantılandığından emin ol.

Mucit23

#25
Evet hocam osiloskop ile bakıyorum. H köprüsünün beslemesi 24V. IR2101 VB ve V+ beslemesini ise 7812 ile sağlıyorum.

Aslında Low Sidelarda problem yok. Az önce H köprüsünün bir tarafını çalıştırdım. Yani motoru tek yönde devrini ayarlayarak döndürebilyorum. Diğer yönde sıkıntı var. Oda IR2101 den kaynaklanıyor. Elimde mosfet çok değiştirme imkanım var ama değiştirmeye gerek yok sağlamlar. Çalışmayan taraftaki mosfeti çalışan IR2101'in önüne takıyorum çalışıyor. Aslında bread board'tan kaynaklandığını düşünüyorum. 1 Saat içerisinde çözemezsem komple malzemeleri söküp başka bir boarda dizeceğim.

mesaj birleştirme:: 10 Temmuz 2014, 13:39:28

Anlaşılan IR2101 leri bozmuşum  ??? Elimde 4 adet vardı 3 bozuk. 1 tanesi çalışıyor.. :o  Yeni malzemeler gelene kadar biraz ara vereceğim çalışmalara.
Bu arada bende H köprüsü için bir kart yapayım. Board üzerinde anlaşılan temassızlık felan oluyor....

hasankara

#26
pin isimlerini karıştırmışım Vs diyecektim neyse. bu komponentler çok hassas olabiliyor. mesela benim direk besleme kaynağım 12 volt yani hiç regülasyon yapmadan direk ir2101 leri beslediğim için problem yok ama entegrenin pozitif beslemesini seri diyot üzerinden yaptığımda çok mefta verdim. entegrenin beslemesine + - arasına ters zener takmanda fayda olabilir. ve aynı zamanda mosfetlerin Vgs lerine de yine entegre besleme voltajı değeri kadar zener takmak da mosfet sürücü entegrelerini bayağı rahatlatıyor. özellikle mosfetlerle bobinli bir şeyler sürdüğün zaman bu zener çok iyi oluyor. mosfet sürücü entegrelerinin beslemeleri çok temkin istiyor çünkü olumsuz bir durum oluştuğunda yarım köprüler, besleme hattını kısa devre yapabiliyor ve çok kısa süre içerisinde bir şeyler çok rahat zarar görüyor veya yanıyor vs. en kötü ihtimalle mosfet sürücü kısmı için ayrı bir kart yapmakta fayda var.

hatta ir2104 lere yönelmeyi bile düşündüm ama sinyalizasyonu farklı olması gerekiyor diye vazgeçmiştim ir2101 e göre. sen bunu da bir düşünebilirsin. doğruluk tablosunda yarım köprüdeki iki mosfeti aynı anda iletime sokma durumu yok.

mesaj birleştirme:: 10 Temmuz 2014, 15:44:11

http://www.aliexpress.com/item/Special-Hot-IR2101-IR2101S-SOP-8-Bridge-Drive-IR-import-original-brand-guarantee/1616335118.html

satın alanlar arasında benim ismimi görebilirsin. paketim hızlı da gelmişti. hatta bu satıcıya ben başka bir entegre başka bir satıcıda yarı fiyatında eğer sende daha ucuz olsaydı senden alırdım demiştim oda tamam o fiyattan satayım demişti. bu 20 tane entegreden 4 tane sağlam kaldı elimde 3 ü devrede takılı şu an.

Mucit23

Hasan hocam yeri gelmişken Mosfet sürücü şemam üzerinde konuşmak isterim. Malum Fırçasız motor sürücü çalışmalarınızda sizde bayağı kayıp vermiştiniz.
Tecrübeleriniz benim için önemlidir.

Açıkçası daha önce IR serisi bir mosfet sürücü hiç kullanmamıştım. Bu ilk oldu. Ve şimdiye kadar 2 adet IRFZ44 ve 3 adet IR2101 bozmuş oldum. Sağlık olsun....

İlk başlarda Bende IR2104 kullanayım demiştim ama vazgeçtim sonradan. IR2101 benim için daha iyi.

Bugün 13 adet daha Dip kılıflı IR2101 mosfet sürücü aldım. Yaklaşık Kargoyla birlikte 46 lira civarı para verdim. Çin'de gerçekten çok ucuz.

Neyse internette örnek şemalara bakarak bende aşağıdaki şemayı birebir uyguladım.


Normalde Benim motorumun beslemesi 24V bu yüzden 7812 ile 12V ihtiyacımı karşıladım. Beslemede sıkıntım yok sanırım.

İnternette ne kadar şema incelediysem IR2101'in VB beslemesini diyot üzerinden vermişler. Bende 1N5819 1A Shottky diyot taktım. Neden kullanılıyor tam emin değilim ama sanırım bootstrap kapasitesi yüksek frekansta iletime geçip VS üzerindeki voltajı VB ye aktarabilir. Bu durumda 12V hattındaki voltajı yükseltip diğer komponentlere zarar vermesin diye kullanılıyor diye tahmin ediyorum.

O diyot bence orda olmalı. :)

Ama yukarıdaki şemada VB ile GND arasında 12V bir zener takmayı düşünüyorum. Hatta 13V olsa daha iyi olur. VB voltajı 13V'u geçmesin. Yanlız Mosfetlerin Gate bacakları ile Source bacakları arasında Zener atmak gerçekten gereklimi?


Kendim PCB karta mosfet sürücü bir modül yapacağım malzemeler gelene kadar. Delikli board üzerinde temazsızlık vs gibi problemler oluyor.

hasankara

hayır hayır yanlış anladın tabi ki oradaki diyot olacak onu kast etmedim. entegrenin direk giriş voltajını ayrı bir diyottan sağladığın zaman sıkıntı yaşayabiliyoruz onu kast ettim. yani senin devrende 13 volt meydana geldi besleme kaynağın bu 13 volta müdahale etmiyorsa bu ir2101 için problem meydana getirebiliyor. kaynağın çıkışı, yukarı (0v dan +12v) çektiği gibi aşağı(15v dan +12v) da çekmesi gerekiyor. devre içindeki diyot olmzsa olmaz zaten.

atıyorum senin kaynağın 15v dur 7812 de sadece +12 v a çekiyordur. bu durumdan dolayı entegre zarar görebiliyor. aşağıya çekmesi içinde beslemeye ters 12v zener takarsan aşağıya çekme işini bu zener görür. yine mosfetlerin gate sinde de bu durum meydana gelebiliyor. Vgs lere 12v ters yönde zener takmak yine fayda sağlıyor.

Mucit23

Peki Hocam IR2101 lere direk STM32 ile sinyal uyguluyorum. Araya ek bir koruma gereklimidir?