Picproje Elektronik Sitesi

SERBEST BÖLGE => Programlama ve Algoritma => Konuyu başlatan: Mucit23 - 08 Temmuz 2014, 18:13:38

Başlık: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Mucit23 - 08 Temmuz 2014, 18:13:38
Selamlar,

Enkoderli DC motor üzerinde yapmaya çalıştığım bir uygulama var. Motorun dönüş hızını PWM ile ayarlayabiliyorum. Nekadar döndüğünü ise Motor üzerine Tümleşik Encoderden gelen pals'leri sayarak tespit ediyorum. Elimde motora dair bu iki parametre var.

Yapmaya çalıştığım şeyi kısaca açıklayayım. Encoderden gelen puls'lara göre Timer değerim otomatikmen Motorun dönüş yönüne göre artıyor veya azalıyor. Burada Motor üzerinde sabit bir mesafe belirleyebiliyorum kendime. Örneğin başlangıçta timer değeri 0 iken motor 10 tur döndüğünde timer değerim 4000 oluyor.

4000 benim sabit mesafem. Bu mesafe içerisinde tamamlamak şartıyla motora kalkış rampası uygulamam gerekiyor. Yani bu 4000 puls'lık mesafe içerisinde belirli bir ivmelenme oranına göre PWM Duty değerini örneğin %80 Yapmam gerekiyor.

Bir grafik çizmeye çalıştım.
(https://farm4.staticflickr.com/3873/14418650289_4abdb863b1_o.png)
Grafikteki Ti süresi bu işi yapmak için geçen süre. Bu sürenin ne olduğu önemli değil. Önemli olan verilen ivmelenme hızına göre 4000puls'lık mesafe içerisinde yapılması.

Örneğin ben ivmelenme oranını 1 veriririm. Motor 0-4000 puls'luk mesafe içerisinde 0-%80 Duty oranına (Ti)3 saniyede çıkarken, İvmelenme oranını 5 verdiğimde (Ti)1 saniyede çıkabilmeli. Bu 3 saniye veya 1 saniye gibi değerlerin bi önemi yok.

4000puls'lık mesafe işi çok aklımı karıştırdı. Yani Belirli bir ivmelenme oranına göre 0'dan %80 Duty'ye çıkabilirim ama Bu işi nasıl 4000 puls'lık süre içerisinde tamamlayacağım? Çok kafam karıştı.

Bu iş için nasıl bir algoritma kurabilirim? Veya nasıl bir yöntem izleyebilirim?


Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: trgtylcnky - 08 Temmuz 2014, 18:42:16
Şöyle bir sorun var: Diyelim ki PWM hızla doğru orantılı olsun, bu durumda 0-80 arasını ancak belli bir sürede çıkarsa 4000 pulse uzunluğunda yol kat edebilir. Yani bu ivmelenme hızı farklı değerler alamaz.

mesaj birleştirme:: 08 Temmuz 2014, 18:57:46

Bir hesap yaptım:
Çizdiğiniz grafikte eğime m diyelim. Burada PWM değerini de hız (v) olarak kabul edelim. Aynı zamanda pulse sayısını da yol (x) olarak kabul edelim.

v=mx
v=dx/dt   =>
dx/dt=mx  =>
dx/mx=dt   => iki tarafın integralini alalım
ln(x)/m=t+c  =>
x=C*e^mt    x(t) | t=0 =0 çünkü ilk başta hiç dönmemiş sayıyoruz yani C=0 =>
x=e^mt

Yani burada m sabit olduğuna göre x sadece zamana bağlı bir fonksiyon başka değişken yok.

Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Kabil ATICI - 08 Temmuz 2014, 19:36:33
Tam hızda 1 sn de kaç  pals alıyorsun.? (motor rpm değeri?)
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Mucit23 - 08 Temmuz 2014, 21:48:27
Hocam aldığım puls'sayısının süreyle ilgisi yok. Şöyle düşünün motor miline bağlı bir enkoder var. Biz timer ile enkoderden gelen puls'ları sayıyoruz. Yani enkoderden 100 puls geldiğinde timerin değeride 100 oluyor.

Burada Motora uyguladığımız Frekansın veya motorun dakikada kaç rpm hızla döndüğünün hiçbir önemi yok.

Şöyle düşünelim. Ben PWM duty oranını arttırmaya başladığım zaman Motor dönmeye başlıyor ve enkoderden kara dalga gelmeye başlıyor.. Timerin değeride 0'dan itibaren artmaya başlıyor. Bu duty arttırma işlemini öyle bir yapmalıyımki Duty oranı %80 olduğunda Timerin değeri tam 4000 olsun. Buradaki Duty arrtırma hızınıda ivmelenme oranına göre yapmalıyım

Bu iş için bir algoritma kurmam lazım. Yorum yaparsanız sevinirim.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: trgtylcnky - 08 Temmuz 2014, 22:28:27
Hocam bu timer pulse sayısını saymıyor mu? Ben de diyorum ki ancak belli bir ivmelenmeyle bu pulse sayısı %80 ile yakalanabilir. Hızı biraz daha çabuk arttırsanız %80 olduğunda daha 4000 pulse etmemiş olur, biraz yavaş arttırsanız 4000 çoktan geçilmiş olur.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Kabil ATICI - 08 Temmuz 2014, 22:34:25
 Duty oranı  %1 adımlarla artıracaksan olay lineer bir formüle dörer.
4000/80=50 yapar ki her 50 sayaç değerinde %1'lik Duty oranı artırman yeterli. Sonuçta %80'e 4000 darbenin sonunda erişirsin

Hız ne olursa olsun sonuçta sayıcı olayına göre olacağına göre tamam... İşlemci sayıcın bunu yakalayabilir mi bilmem...
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Mucit23 - 08 Temmuz 2014, 23:42:58
Alıntı yapılan: trgtylcnky - 08 Temmuz 2014, 22:28:27
Hocam bu timer pulse sayısını saymıyor mu? Ben de diyorum ki ancak belli bir ivmelenmeyle bu pulse sayısı %80 ile yakalanabilir. Hızı biraz daha çabuk arttırsanız %80 olduğunda daha 4000 pulse etmemiş olur, biraz yavaş arttırsanız 4000 çoktan geçilmiş olur.

Hocam sizin dediğiniz tam olarak birşey anlayamadım. Hız ve timerin artış hızı zaten Duty oranıyla orantılı bir şekilde artıyor. Yani öyle bir döngü kurmalıyımki Duty oranı arttırılırken enkoderden gelen puls sayısı 4000 olduğunda Duty oranım %80 olsun. Buradaki sorun Duty oranını lineer bir şekilde arttırsam bile Timerin artış hızının motorun devriyle alakalı olduğundan dolayı, timerin duty ile orantılı lineer bir artışının olmaması. Çünkü Duty oranını arttırmamla motor hızlanıyor dolayısıyla timerin artış hızıda artıyor. Problemim budur.

@ambar7 Hocam sizin dediğiniz mantık uyuyor aslında ama lineer bir artım olmuyor. Sebebi ise şöyle, Örneğin %10 duty açık iken 50 puls gelmesi örnek veriyorum 100ms sürerken, %70 duty verildiğinde motor dahada hızlanacağı için 50 puls gelmesi 10 ms'de gelecektir. Bu durumda gelen lineer olmayan bir artış söz konusu

Bu durumda yanılmıyorsam eğer aşağıdaki grafikteki gibi bir artış söz konusu oluyor.
(https://farm4.staticflickr.com/3875/14420771840_74ac757b96_o.png)

Farklı fikirler, Farklı yöntemleride deneyebilirim. Kullandığım MCU STM32 serisinden birşey.  72 Mhz'de çalışıyorum. Enkoderden gelen puls'leri Timer donanımsal olarak sayıyorum. Yani ben timerin değerini okuduğumda motor ilk dönmeye başladığından itibaren kaç puls'lık bir dönüş yapmış görebiliyorum.

Farklı yöntemler farklı fikirlerde deneyebilirim. Yeterki şu sorunu aşayım.

Vallahi rüyalarıma girmeye başladı.  :-X
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Kabil ATICI - 08 Temmuz 2014, 23:56:42
Pulse-Duty arasında bir linerite istedin. Sonuçta senin istediğin doğrusallığı veriyor olması gerekir.  (aslında çösünürlükten dolayı merdiven şeklindedir.
İşin içine başka parametreleri ekleyeceksen o zaman işin rengi değişir tabii.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: sadogan - 09 Temmuz 2014, 00:05:22
Farkılı bir fikir:
Motorun devri pwm değer artışına hemen çevap veremez.
4000 puls lik mesafeyi parcalara bölerek her parca için pwm
değerlerini deneme ile bulup ,motor un her parça için cevap verme süresi ölçülerek
belierlenen sürelerde deneme ile bulunan pwm değerleri ile test edilebilir.

Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: mistek - 09 Temmuz 2014, 00:15:12
(Sadece fikir)
PWM değerini lineer olarak arttırmayın.

Örneğin ilk 1000 pals için %40
Sonraki 1000 için %20
Sonraki için %10
Sonraki için %10 gibi.

Deneyerek sonuca varılır belki.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Mucit23 - 09 Temmuz 2014, 00:27:51
Belkide lineer bir artışa ihtiyacım yoktur

Yapmaya çalıştığım şey kısaca şudur. DC100W gücünde Enkoderli bir motorum var.  Bu motor halatlı bir düzenek ile bir nesneyi ileri geri hareket ettiriyor. Motorun diyelimki ileri yönde nekadar hareket edebileceği enkoder vasıtasıyla daha önce belirlenmiş sabit bir değer. Örneğin 0-30000 puls arası olabilir. Ben bu parametreye bağlı kalarak motorun ileri ve geri yöndeki hareketinde Motora Hızlanma rampası, ve yavaşlama rampası uygulamam gerekiyor.

Şuanda Motor için IR2101 Mosfetli H köprüsü kurdum. Motoru İstediğim şekilde devrini ayarlayarak ileri geri döndürebiliyorum. Enkoderden de kaç puls gelmiş timer ile sürekli takip edebiliyorum. Yani başlangıç noktasından itibaren motor nekadar dönmüş, Timerin değerine bakarak anlayabiliyorum. Bu iki temel konuyu çözdüğümü söyleyebilirim.

Bazı değişken parametrelerim olacak bu parametrelere uymam gerekiyor.

1-) Hızlanma ivmesi
2-) Max. Hız
3-) Yavaşlama ivmesi
4-) Min Hız.

Bundan sonra yapmam gereken start emrini aldıktan sonra Hızlanma ivmesinde belirtilen parametre doğrultusunda motoru max. Hız'a ulaştırıp belirli bir süre max hızda hareket ettikten sonra yavaşlama ivmesi doğrultusunda motoru yavaşlatıp min. Hız'a  indirip ardından motoru durdurmak.

Motorun Max. Hareketi 30000 puls olduğunu varsayarsak ben ilk 4000 puls'lık mesafe içerisinde motoru max. hıza(%80 Duty) ulaştırıp, 22000 puls'lık mesafede max hızda hareket ettirip geriye kalan 4000 pulslık mesafedede motoru min. hıza indirip durdurmayı hedeflemiştim. Anlaşılan mesafe ile orantılı olarak motorun duty oranında değişim yapmak mümkün değil. Belki tablo ile felan olur ama esnek olmaz. Çünkü bu parametreler değişebilmeli.

Ben ambar7 nin bahsettiği yöntemi bir deniyeyim. Dediğim gibi belkide lineer bir artışa ihtiyacım yoktur. Bu konuda ne düşünürsünüz bilmiyorum ama önemli olan motoru yavaş  bir şekilde kaldırmak değilmidir. Zaten ilk başta yavaş bir kalkış yapılıyor. Sonrasında hızlı bir şekilde set değerine ulaşacaktır.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: RaMu - 09 Temmuz 2014, 01:03:10
Aşağıda anlattığım olay şu;
deneme yanılmayla bunu yapabilirsin,
misal 1 milisaniyede bir pwm duty değerini %1 arttır
taki %80 e gelene kadar bunu tekrarla
encoderdan okunan değeri ölç,
enceder 4000 okuyamamışsa
1 milisaniyede bir değilde 2 milisaniyede bir pwm duty %1 arttır
4000 den fazla okumuşsa 1 milisaniyeden daha kısa süre aralıklarıyla pwm duty %1 arttır,
bu şekilde 4000 okumasına erişmek için gerekli süreyi bulursun,
ve bu sayede pwm duty oranını sabit zaman aralıklaruyla arttırdığın için
pwm duty artış ile zaman arasında lineer bir bağ olur.



Öncelikle pwm duty ile motor dönüş hıza arasındaki ilişkiyi bulmak lazım
yada pwm duty ile encoder değeri arasındaki ilişki,
yani misal pwm duty %1 iken encoder saniyede x okuyor
pwm duty %2 iken encoder saniyede y okuyor,
pwm duty %80 iken encoder saniyede z okuyor,
x y z 1 2 80 ise ne güzel olur
pwm duty ile motor dönüş hızı lineer değişiyor deriz ki
bence bu olası bir durumdur, büyük ihtimal böyle olacaktır,
ama yinede bunu gözlemleyip bir tablo çıkarmalısın,
(özellikle pwm in ilk %20 ye kadar artışında motor belki dönmeyecektir bile)

sonra;
artık motorun pwm duty değişimine göre kaç tur atacağını biliyor durumdayız,
şimdi kendimize (0 dan %80 duty e çıkma) zaman dilimi belirleyeceğiz,
anlaşılır olması açısından,
motor %80 pwm duty ile saniyede 80 tur atıyor yok yok encoderdan  saniyede 80 okunuyor diyelim,
%79 pwm encoder 79
.
.
.
%1 pwm encoder 1

Eğer ben her saniyede pwm duty i %1 arttırırsam
enceder toplamda (0 dan 80 e kadar sayıların toplamı) değerini gösterir,
(80*81)/2 = 3240
toplamda 4000 olmasını istiyorduk
(4000/3240) saniyede bir pwm duty %1 arttırılmalı demektir,
yani 1.2346 saniyede bir pwm duty %1 arttırılmalı,

tabi burada pwm duty %1 iken dahi motorun döndüğünü,
pwm duty oranıyla motorun dönüş hızının doğru orantılı olduğunu
varsaydık, böyle değilse
bu oranlarda aynı hesaba dahil edilir.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: trgtylcnky - 09 Temmuz 2014, 04:38:23
O zaman dinamik bir sistem olarak ele alıp şöyle düşünelim:
F=m*a
[Motorun uyguladığı kuvvet]-[Sürtünme]=[Hareket eden toplam kütle]*[ivme]
Motorun uyguladığı kuvvet motorun çektiği akımla doğru orantılıdır. Motor harekete geçmeden önce en fazla stall torku kadar tork uygulayabilir. Bu durumda  statik sürtünmeyi de hesaba katıp ne kadar tork uygulanacağını dolayısıyla PWM değerini bulursunuz. Bu değer sizin ihtiyacınız olan torkun stall torka oranıdır.
İlk hareketten sonra hızı sürekli kontrol edersiniz. Mesela bakarsınız 10 pulse kaç saniyede gelmiş, hızı bulursunuz. Eğer sizin planladığınız hızdan (sabit ivmeyle v=a*t) fazla ise PWM yüzdesini düşürür, az ise artırırsınız.
Ya da ilk hareketten sonra mesafeyi sürekli kontrol edersiniz ki bu bence daha kolay. Planlanan mesafeyi x=(1/2)*a*t^2 olarak bulup encoderden okuduğunuz değer bunu geçiyorsa PWM düşürür gerisinde kalıyorsa arttırırsınız.
Ama yine de söylüyorum, ilk baştaki dediğiniz iş şuna benziyor: 0'dan 100'e 3 saniyede çıkan bir arabayla 6 saniyede çıkan bir araba düşünün, 6 saniyede çıkan bu hızlanma esnasında daha fazla yol almış olur, bunu değiştiremeyiz bence.

Karışık yazdığımın farkındayım. Aslında anlamdığımdan. Mesela hızlanmanın sonunda ulaşılacak %80 max hızın %80'i mi yoksa sadece PWM %80 mi? Sabit ivmeli bir hızlanma mı istiyorsunuz ve bu sabitlik ne kadar önemli?

Reprap Marlin yazılımında bu gibi hareketleri planlayan bir algoritma var. Ben anlamadım ama belki siz anlarsınız: https://github.com/ErikZalm/Marlin/blob/Marlin_v1/Marlin/planner.cpp
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: EGE - 09 Temmuz 2014, 08:37:26
Ben şöyle yapıyorum ,

Start yapıldığında motor beslemesini bir rezistans üzerinden geçir istediğin süre sonunda rezistansı devreden çıkart motor direk besleme ile çalışsın.

Stop zamanına yaklaştığında  yine Rezistansı devreye sok kısa bir süre içinde yine devreden çıkart .

Zaten bu istediklerin kıssa bir zaman dilimleri  içinde kalkış ve durma olacağı için rezistans çok fazla ısınmayacaktır.
Elektirkçilerde   yay şeklinde olan rezistansları rahatlıkla kullanabilirsin.   
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: hasankara - 09 Temmuz 2014, 08:56:12
pid le estimate yapacaksın. özetle ivme fonksiyonu çıkışı ile hedef eğri fonksiyon çıkışları sürekli olarak belli bir sıklıkta pid kontrol içinde karşılaştırma yaparak motora pwm uygulayacak. burada 3 farklı yoğunlaşman gereken nokta var. 1.pid 2.ivme fonksiyonu 3.hedef eğri fonksiyonu. pid için çok kasmana gerek olmayabilir.

        if (IFS0bits.T4IF) {
            IFS0bits.T4IF = 0;
            if (ReadADC10(9) > 910)if (OC1RS > 0)OC1RS--;
            if (ReadADC10(9) < 908)if (OC1RS < 1000)OC1RS++;
        }

bu şekilde basit bir işlem de olsa işlemciye fazla yük bindirmeyerek işini görebilir. kontrol algoritmasını daha da geliştirerek mesela gerçek bir pid algoritması kullanarak, hedeflediğin eğriye daha yakın şekilde sonuç alman mümkün, tabi bu tercihleri yaparken araç gereçlerinin sınırlarını her zamanda göz önünde bulundurman gerek işlemci hızı vs. aynı zamanda sen bu kodda if içindeki karşılaştırmaları, iki fonksiyonun çıkışlarını karşılaştırarak yapacaksın ve iki fonksiyonda dinamik olacak elbette kontrole girmeden önce fonksiyonların çıkışları güncellenmiş olacak.

ivme fonksiyonu; encoderden gelen değerlerin değişimleri ne kadar sürede olduğunu hesaplayacak. yani atıyorum 300 dür, ilk 300 olduğu andan itibaren timerin sayıyordur ve 1 artmasıyla birlikte timer den capture yaparsın, yani değeri okuyup timeri 0 larsın. okuduğun timer değeri ivme fonksiyon çıkış parametren olacak, ama dikkat edeceğin diğer nokta timer değeri artması demek ivmenin düşmesi demek yani ters orantı var. yaaani çıkış parametren a^-1 aslında, katsayısı var bunun daha ama en son deneme yanılma yapacağın için sadece hedef fonksiyon çıkışına katsayı koyman yeterli olacak. buna göre değerlendirmeni yapacaksın.

hedef fonksiyonu ise; ivmenin senin istediğin şekilde seyredeceği fonksiyondur. bu fonksiyon özel tanımlı bir fonksiyon olabilir, yani encoder 500.cü değerde ivme şu olsun 600.cü değerde ivme şu olsun yada exponansiyel artmasını istersin exp(encoder) şeklinde hedef ivme değerleri elde edebileceğin bir fonksiyon olabilir bu. anladığım kadarıyla sabit ivmeyle kontrol yapmak istiyorsun(1 veririm, 5 veririm demene göre). bu durumda benim yaptığım gibi hiç fonksiyona gerek olmadan belli bir sayıdan büyük mü ve küçük mü diyerek işin içinden sıyrılabilirsin. yani encoder kaçıncı değer olduğunun önemi yoktur hedef ivmen hep aynı değer zaten.

        if (new_capture) {
            new_capture = 0;
            if (capture < 910)if (pwm > 0)     pwm--;
            if (capture > 908)if (pwm < 255) pwm++;
        }


ivme= capture^-1 old için dikkat ettiysen ilk yazdığım kodla farklı olarak küçükse değeri azalt büyükse değeri arttır deyişim. 910 ve 908 ise senin vereceğin sabit hedef ivme değerinin katsayısıyla çarpılmış olan sayısal değeri. tüm bu kontrol kodlarını da if(encoder<4000) kontrolü içerisine aldığında bu yazdıkların sadece başlangıçta etkin olan bir kod bloku haline gelmiş olur.

mesaj birleştirme:: 09 Temmuz 2014, 09:18:22

birde şimdi fark ettim ilk hızsız başlayacağı için yeni encoder bilgisi hiç alınamayacak ve pwm e müdahale edilemeyecek.

if (new_capture||another_timer_flg) {
            new_capture = 0;
            another_timer_flg=0
            if (capture < 910)if (pwm > 0)     pwm--;
            if (capture > 908)if (pwm < 255) pwm++;
        }


bunun için başka bir timer ile de kontrol blokuna girmesini sağlamamız gerekiyor. motor hiç dönmez iken yeni capture alınamayacak. en kötü ihtimalle belli bir sürede (timeout gibi düşünebilirsin) bu algoritmaya girmesi gerekiyor.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Mucit23 - 09 Temmuz 2014, 12:23:22
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.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Kabil ATICI - 09 Temmuz 2014, 12:32:08
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.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Mucit23 - 09 Temmuz 2014, 16:10:14
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ç?
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Kabil ATICI - 09 Temmuz 2014, 17:35:35
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.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: RaMu - 09 Temmuz 2014, 21:48:12
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 :)
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: hasankara - 09 Temmuz 2014, 23:52:34
ş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 (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.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: RaMu - 10 Temmuz 2014, 00:20:09
Fotoların linkini
[*img*]   [*/img*]  arasına *lar olmadan
koyarsanız forumda direk görebiliriz.

Örnek sizin linkini verdiğiniz foto;
(http://upload.wikimedia.org/wikipedia/commons/thumb/5/5e/Gauss_Newton_illustration.png/800px-Gauss_Newton_illustration.png)
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: hasankara - 10 Temmuz 2014, 11:32:32
ş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.

(http://s12.postimg.cc/z7hc7zkd5/ivme_pid_2.jpg) (http://postimg.cc/image/z7hc7zkd5/)

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.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Mucit23 - 10 Temmuz 2014, 12:55:01
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?
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: hasankara - 10 Temmuz 2014, 13:32:23
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.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Mucit23 - 10 Temmuz 2014, 13:57:57
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....
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: hasankara - 10 Temmuz 2014, 15:35:36
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 (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.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Mucit23 - 10 Temmuz 2014, 18:18:21
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.
(https://farm4.staticflickr.com/3917/14620438405_4ecdb0f223_o.jpg)

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.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: hasankara - 10 Temmuz 2014, 20:51:44
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.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Mucit23 - 10 Temmuz 2014, 23:44:38
Peki Hocam IR2101 lere direk STM32 ile sinyal uyguluyorum. Araya ek bir koruma gereklimidir?
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: kralsam - 11 Temmuz 2014, 08:27:23
Alıntı yapılan: Mucit23 - 10 Temmuz 2014, 23:44:38
Peki Hocam IR2101 lere direk STM32 ile sinyal uyguluyorum. Araya ek bir koruma gereklimidir?
Selamlar hocam,
Frekansına göre uygun bir optocoupler takmanda fayda var. Ama çalışma frekansına dikkat et. Beni bir ara çok uğraştırmıştı. Ben ayrıca MCU kısmınıda DC-DC konvertor ile yalıtıp topraklarıda ayırmıştım. Tavsiye ederim.

İyi çalışmalar.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Erol YILMAZ - 11 Temmuz 2014, 11:00:02
Alıntı yapılan: Mucit23 - 10 Temmuz 2014, 23:44:38
Peki Hocam IR2101 lere direk STM32 ile sinyal uyguluyorum. Araya ek bir koruma gereklimidir?

Sinyalleri bozmayacak şekilde araya 2k2 lık bir direnç olabilir.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Mucit23 - 11 Temmuz 2014, 17:20:07
2K2  Direnç güzel olur. Ekleyeceğim.

Dün saat 15:00 da verdiğim IR2101 siparişim bugün saat 12:00 civarı kapıma geldi.  Kargocuları alkışladım.  :D Ben yetişirse yarın yoksa pazartesi anca alırım diye umut ediyordum.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: hasankara - 12 Temmuz 2014, 19:11:02
Direnç olarak ben her kanala 120 ohm seri bağladım. Tepki suresi gecikmeye başlayabilir fazla değer takarsan. Çok farkını goremeyebilirsin belki uç noktalarda yani ilk başta veya en sonda pwm uygularken farklılık görülebilir diye düşünüyorum. Ama minimum bir 100 ohm civarı takmak gerekiyor. Denetleyici çok fazla gurultu alabiliyor çünkü ben bizzat yaşadım. Denetleyici 5 Sn de bir reset atabiliyordu direk bağlayınca.

Bende istanbula geldiğim için şimdi gördüm yazını.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Mucit23 - 18 Temmuz 2014, 17:27:19
Mosfet sürücü için kartımı hazırladım.
(https://farm4.staticflickr.com/3852/14496331829_4c1ce3bb02_z.jpg)
Akşama çalışmalara devam edeceğim
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Mucit23 - 20 Temmuz 2014, 14:52:16
Arkadaşlar konuya herhangi bir çözüm getiremedim. Sorumu tekrarlamak istiyorum.

iki adet değişken değerim var.

1. PWM duty değerim, 0-1000 arası bir değer alabiliyor.
2. Encoderden gelen pals'ların sayısının tutulduğu Enc_Count. Bu değerde motor döndüğü sürece sürekli artıyor.

Amacım tam olarak öyle

Bir start butonum var. Bu butona bastığım zaman Duty artmaya başlayacak. Motor dönmeye başladığı zaman Encoder değeride artmaya başlıyor. Bu duty arttırma işlemini Enc_Count değerine göre yapmalıyım. Yani arada Duty Değerini öyle bir arttırmalıyımki Duty değeri 800 olduğunda Enc_Count Değerim 2000 olsun.

Bu dediğim değerler örnektir ve Artışın lineer veya logaritmik olması önemli değil.

Ağır matematiksel işlemler kullanamam.

Belki Encoderin Anlık değeriyle Set değeri arasındaki fark'dan yola çıkarak birşeyler yapılabilir fakat nasıl yaparım bilmiyorum. Sabahtan beri kağıt kalemle karalama yapıyorum Arada bir bağıntı kuramadım bir türlü. Değişik fikirlere ihtiyacım var.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: ete - 20 Temmuz 2014, 16:15:53
Bu iş bilmece gibi bir şey. Aklıma bir yol geliyor ama bu yolu uygulayabilmek için bazı şeylerin bilinmesi gerekiyor.
Encoder 2000 sayında duty değeri 800 olacak ise birim duty değeri başına encoderin 2,5 sayması yada enocderin 2,5 değeri karşısında duty değerinin 1 artması gerekecektir. Bu durumda duty=1 değerini verip encoderin 2,5 saymasını beklemek yada duty=2 değerini verip encoderin 5 saymasını beklemek gerekecektir.
Önce elimizdekilere bakmamız gerekiyor. Motor sıfır duty ile kalkışa geçmeyecektir. O halde motorun dönmesi için min duty değerini kendimiz verelim. Sonuçta Enc_Count=2000 olunca Duty=800 olması gerektiği için aralarındaki ilişki Enc_Count değeri duty değerinin 2,5 katı diyebiliriz. O halde ,
Duty değerini 2 ile başlatıp belirli bir noktaya kadar bu duty değerini biz artıralım. Adımlar şöyle olabilir;
- Duty=2 , ile başlayıp Enc_Count=5 oluncaya kadar bekleyelim, olunca
- Duty=4 yapalım ve Enc_Count=10 oluncaya kadar bekleyelim, olunca
- Duty=6 yapalım ve Enc_Count=15 oluncaya kadar bekleyelim, olunca
- Bu şekilde duty değerini 2 şerli olarak artıralım ve Enc_Count değeri (Duty*2,5 ) oluncaya kadar bekleyelim.
Motor belirli bir hıza ulaşınca artık duty için biz değer belirlemeyelim ve Enc_Count değerinden değer alalım. Kısaca Duty=Enc_Count/2,5 şeklinde hesaplansın.

Bu açıklamaya göre işi 3 safhalı bir iş olarak görebiliriz.
1. Safhada , Duty değerini sen belirleyecek ve buna karşılık Enc_Count değerinin Duty*2,5 olmasını bekleyeceksin.
2. Motor belirli bir hıza ulaşınca  artık Enc_Count değerine bakılarak karşılığında Duty=Enc_Count/2,5 formülüne göre duty değeri belirlenecektir. Bu işin 2. safhasını oluşturacak ve ,
3. Sonuçta Enc_Count değerinin 2000 değerine ulaşıp ulaşmadığı kontrol edilerek ulaşınca işlem tamamlanacaktır.

Ete

Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Mucit23 - 20 Temmuz 2014, 16:42:50
Hocam bu yöntem üzerinde biraz çalıştım ama şöyle bir sıkıntı yaşadım. Bunu çözersem olur.

Duty Değerim 0-1000 arası bir değer alıyor ama motor ilk kalkışı ortalama 80-90 ile yapıyor. Ben genellikle motora %10 duty yani sayısal olarak 100 vererek kaldırıyorum.

Hatırlarsanız daha önceden 4000 ile örnek vermiştim ve 4000 puls'lık mesafe içerisinde %80 duty'ye ulaşmak için 4000/80=50 yani encoder'deki her 50 puls'lık bir artışın sonunda duty değerimi 1 arttırmam gerekiyordu.

Bunu denedim şöyle bir sıkıntı yaşadım.

Motor yavaş dönüyorkan enkoderdeki 50'lik artışları tespit edebiliyorum. Fakat motor hızlandıkça encoder değerini bir okumamla diğer bir okumam arasında bakıyorum enkoder değeri 120 artmış. Motor birazdaha hızlanıyor bakıyorum bir önceki okumamla yeni okumam arasında 355 fark var.
İşlemci 72Mhz'de çalışmasına rağmen bu sonuçları aldım.

Yukarıdaki değerler örnek fakat işin aslı şudurki kullandığım mcu hızından dolayı bu işi takip edemiyor.


Şöyle birşey aklıma geldi.

Farzedelim Encoder Set değerimiz 2000 olsun ve Hedeflenen duty değerimizde 800 olsun. O halde 2000/800'den 2,5 artışta duty değerini 1 veya her 5 artışta duty değerini 2 arttırmak gerekli. 

Dedimki bir önceki okuduğum encoder değerini bir değişkende tutayım ve yeni encoder değerinden çıkartarak aradaki artış miktarını bulayım. Buna fark diyelim.

Fark Değerini ilk kez okuyoruz ve baktık Fark değerimiz 30 oldu. Bu durumda (30/5)*2=12 yapar. Yani duty değerine 12 ekledik.

Bir sonraki okumamızda fark değerini 67 bulduk.  67 değeri 5'e tam bölünmez. Ama biz 5'e tam bölünen kadar bir artış yapmamız gerekli. Yani (65/5)*2=26 değer arttırdık. Fakat 67 değerinin 5'e bölümünden kalan 2 puls'lık bir elde değeri var. Bu değer Sonuç olarak kayıptır. Bunu nasıl değerlendiririm? Bu işlemi tekrar denemek istiyorum.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: hasankara - 20 Temmuz 2014, 16:51:16

if(timer_flg)
{
duty++;
timer=0;
timer_flg=0;
}
else if(enc_flg&&duty>50)
{
duty=(enc*8)/20;
timer=0;
enc_flg=0;
}


duty değerine direk hüküm edebildiğin için kontrol algoritmalarına ihtiyacın olmayabilir, belki ilk kısım için kontrol algoritması kurulabilir, zaten ilk kısmı ilk anda harekete başlayabilmesi için gerekiyor. motorun yükü değişkenlik göstermeyecekse ve problemin bundan ibaretse bu ufak kod işini görebilir. motor yükü değişkenlik gösterecekse, duty fullemene rağmen motorun dönmemesi bile ihtimaller arasında olmalı.

enc_flg bayrağı, enc değerinin güncellenmesiyle birlikte sürekli set edilir. timer hızını ve duty>50 kısmını kendin, motora göre ayarlaman gerekir. yinede bi tutarsızlık var gibi, özellikle ilk parça ile ikinci parçanın arasında bir uyumsuzluk olabilmesi muhtemel gibi ama bu problemin için aklıma pek fazla bir şey gelmiyor.

rotanı duty-enc yerine hız-zaman şeklinde belirler isen daha sağlıklı bir hedefin olmuş olabilir. her şey güllük gülistanlık olabilir. hayattan daha çok zevk alabilirsin.



mesaj birleştirme:: 20 Temmuz 2014, 16:57:11

else if(enc_flg&&enc>200&&duty>50) bu satır böyle olsun. 200 değerini yine motora göre kurcalayacaksın.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: Mucit23 - 20 Temmuz 2014, 18:48:01
Hasan hocam sizin kodları inceliyorum. Fakat sizin kodlardan önce ete hocamın bahsettiği yöntem üzerine çalışıyordum.

yaptım oldu

int old_counter=0,carry=0,increment=0,fark=0;
uint16_t duty=100;
set_adc_pwm(duty);
   while(Encoder_GetCounter()<2000)
{
  fark=(Encoder_GetCounter()-old_counter)+carry;
  old_counter=Encoder_GetCounter();
  carry=fark%25;
  increment=fark/25;
  duty+=increment*10;
  set_adc_pwm(duty);
   }


Böyle birşey oldu.

Fakat aklıma yatmayan bir iki nokta var. 1. Bu yöntemde duty arttırımı tamamiyle encoderin artmasına bağlı. Mesela ilk başta Duty değerini 100 veriyorumya motor boştaken dönüyor. Döndüğü zaman hızlanıyor ve max hıza ulaşıyor.

Fakat start işlemi yapmadan elimle motor biraz milini sıkıştırıyorum motor duty değeri 100 olduğu için hafif bir sıkışma ile dönemiyor. Dönmeyince encoder artmıyor ve motorun duty değeri artmıyor.

Pek aklıma yatmadı bu yöntem. Bu işi ters yapıyorum gibime geliyor. Bence duty değeri ne olursa olsun artacak. Yani encoderden bağımsız olarak Hedefe yani 800'e doğru artacak. Fakat artım oranı değişmesi gerekiyor sanırım. Yani Encoderin Set değeriyle arasındaki fark çok fazla ise duty'değeri onar onar artacak. Fark az ise birer birer artacak. Tam olarak emin değilim ama bunun üzerindede düşünmek lazım.

Hasan hocam Timer değişiklik kesmesini kullanmıyordum ama sizin mesajınızı okuyunca aklıma geldi. Biraz bakayım bu konuya

Valla işi gücü bırakıp basit bir for döngüsü kurasım var.
Başlık: Ynt: Sabit mesafede değişken hızlı ivmelenme Algoritması
Gönderen: RaMu - 20 Temmuz 2014, 20:02:05
Program yeterince hızlı çalışmıyorsa
aslında asmde yazmalısın
ama asmye gelene kadar
algoritmanı daha hızlı çalışacak hale getirebilirsin,
misal
Encoder_GetCounter() fonksiyonunun aldığı değer 3 defa kullanılmış
ve her seferinde fonksiyon çalıştırılarak bu değer öğrenilmiş,
bu şuna benziyor
lcd nin 2,1 karakterini kullanmam lazım
bunun için 3 defa lcd den bu değeri okuyorum
bunun yerine bir defa okuyup bu değeri bir değişkene atsam ve 3 defa kullansam
programım daha hızlı çalışır,
yani şöyle


//   Encoder_GetCounter() fonksiyonunda bu fonksiyonun döndüreceği değer
//encoder_deger değişkenine yazılır.

   while(Encoder_GetCounter()<2000)
     {
          fark=(encoder_deger-old_counter)+carry;
          old_counter=encoder_deger;
          carry=fark%25;
          increment=fark/25;
          duty+=increment*10;
          set_adc_pwm(duty);
   }


Ayrıca çarpma işlemini varsa denetleyicinin donanımsal çarpma ünitesi yapıyormu
yani derleyici bunu sağlıyormu kontrol etmek lazım,
donanımsal çarpma tek komut çevriminde yapılabiliyor,
aksi halde donanımsala nazaran çok uzun sürebilir, kaydırma ile çarpma yapılıyor.