kıyılmış ac akım hesabı ?

Başlatan ilhan_mkp, 26 Haziran 2011, 15:51:17

z

Karelerin toplamını bulduktan sonra sonucu peryoda boleceksin. Çıkan sonucun da karekökünü alacaksın.

Eğer akımın 16 bit ise aritmetik değişkenlerin 32 bit olmalı. Böylece karelerin toplamı 32 bit registerde depolanmış olur. Karekökü aldığında tekrardan 16 bite dönmüş olursun.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ilhan_mkp

yani 18f serisiyle akım okursam işlemleri float olarak yapmam gerekir protonda float deerler için 32 bit yer kaplıyordu diye haırlıyom bu arm işlemciler bu işler için uygunmudur acemi biri  olarak piclerde pişmeden armye girsem acaba hayal kırıklığıyla sonuçlanırmı

Klein

Bu tür işlerde float kullanmak her zaman iyidir.  Eğer C biliyorsan pic ile pişmen çok zaruri değil. Ama PIC için çok daha fazla destek bulabileceğin gerçeği de ortada. CPU büyüdükçe özellikler artıyor , özellikler arttıkça registerler gibi ayar gerektiren birim sayısı artıyor , bunlar arttıkça işler zorlaşıyor. Ama datasheet okumayı iyi biliyorsan , o işlemci , bu işlemci çok farketmiyor.

@bunalmıs hocam
Dalgalar da dalga gerçekten. Mavi olan dalga PId ile belki  çok yüksek çözünürlüklü çıkış kontrolü ile mümkün. Ama diğerleri gerçekten zor. Yine de uğraşayım biraz.

Klein

Bu dalgalar için ilk aklıma gelen çözüm şu:
Dalganın şeklini bilmediğimizi varsayıyoruz.
Devre kalibrasyon modunda iken  çıkış yavaş yavaş artırılarak çıkışın tepkisi izlenir ve buradan bir lookup tablo oluşturulabilir. Daha sonra çıkış bu lookup tablo aracılığı ile yölendirilebilr.
Ama mavi olan aslında en zoru. Çok dar bir aralıkta kontrole izin veriyor. Belki bu zor olabilir.

z

Mavi olan zor. Diyelimki belli bir Kp için güzel ve kararlı bir cevap aldınız. Sistem tepkisi yataydan tırmanışa geçen bölgede bu Kp nin kendiliğinden artması ile aynı anlama gelir. Kp artınca sistem kararsızlığa yaklaşır. Fakat diğerleri daha da zor. Negatif bölge içeriyor. Negatif bölge 180 derece faz farkı demek bu da sistemin osilasyona gitmesi demek.

Nonlineer sistemleri 0. derece olarak düşünülürse işler kısmen kolay. En kötü ihtimalle lookup table ile bir şeyler yapılır. Fakat sistemler genelde 2 dereceden daha büyük derecededir.

Sistem derecesinin artması demek, yaptığınız müdahalenin sonucunun çok sonra ortaya çıkması demek. Yada o anda aldığınız tepki aslında şu anki ve geçmişteki girişlere bağlı demek. Bu da işleri büsbütün zorlaştırıyor.

PID malesef lineer sistemlerde destekli tahminler yapabilse de nonlineer sistemlerde işler değişiyor. Nonlineer sistemleri PID ile kontrol etmeden önce 3 integratorden oluşan sistemi PID ile kontrol etmeyi deneyin. İnsan çok adaptif bir varlıktır. Bir kaç gün içinde kendinizi adaptif hale getirip aşağıdaki oyunda başarılı olmayı deneyebilirsiniz. Unutmayın oyunun en zor bolümü 2 integratör içeriyor. Bunun 3 integratörlüsünü PID ile kontrol edeceklere bol şans.

http://www.cncdesigner.com/picproje/SinirTesti.rar

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

Mavi eğri ile endüstride karşılaşma ihtimalimiz , diğerlerine göre daha yüksek. Bu yüzden mavi üzerine biraz çalışmak istiyorum.
Elinizde mavi eğrinin denklemi varsa işimi biraz kolaylaştırırsınız. Aksi halde denklemini ya da lookup tablosunu çıkarmam gerekiyo ,  üşeniyorum açıkçaı :)

z

#51
Mavi eğri için endüktans elemanını kullanmayı deneyebilirsin.

Belli bir akım değerinden sonra nüve doyuma gitsin. Hem endüktans kullanarak işin de kolayına kaçmamış olursun.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ilhan_mkp

hocam çok gerçekçi bir soru oldu konu beni baygı aştı ama daha önce birakin cevabını sorusunu anlayamadığımız konuda canlı eğitim ;D

z

#53
Lineer olmayan sistemlerin kontrolu neden zor?

Bakkal hesabı yapalım.

Manava gittiniz 1kg domates seçtiniz, manavcı 1TL dedi. İyi ucuzmuş dediniz 1 kg daha ekle dediniz manavcı o zaman 3 TL dedi.
1.5 kg alayım, o zaman 5 TL.

Kardeşim dalga mı geçiyorsun ver 1kg al 1 TL yi.

Cebinizdeki paraya ne kadar domates alacağınızı bilemezsiniz.

Her defasında 1kg alıp 1TL odeyerek 10kg domatesi 10 TL ye alabilirsiniz. Fakat 10kg domates alacam dersenız manavcının size 2 TL mi 5 TL mi 10TL mi yoksa 100TL mi deyeceğinden emin olamazsınız. Alır ve sonucu görürsünüz.

Bu nedenle PID sistemin destekli atışları lineer sistemlerde işe yaramaz. Bu nedenle PID sistemin destekli atışları non lineer sistemlerde işe yaramaz.

Bu nedenle olmalı ki doğrusal olmayan sistemlerin analizi ülkemizde 4 senelik mühendislik okullarında verilmiyor. İllaki master gerekiyor.

Yurt dışı üniversitelerde de tahminen öyledir.






Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

Bir süredir; hem motivasyon eksikliği , hem de yoğunluk nedeniyle bu konu ile ilgilenemedim.
Biraz da bayram tatilini fırsat bilerek biraz çalıştım.

Yine küçük bir simülasyon programı hazırladım.

Konunun öncesini takip etmemiş arkadaşlar için:
Program küçük bir .exe uygulama. En yavaş makinede bile çalışır.

Biraz gerçekçi olması açısından bir hava valfini açıyoruz. Valfin açılması ile geçen havanın debisi oransal değil. Yani çıkışımız Non-Linear. Valf açısı-hava debisi arasındaki ilşki için , bobin akım eğrisi kullanıldı.
Bu eğriyi alttakigrafikte görebilirsiniz.
 
Üstte Değişken K isimli bir checkbox var. DeğişkenK işaretlendiği zaman , çıkış fonksiyonuna benzer şekilde , set değerne göre K değerini yeniden hesaplıyor. Bu sadece deneme için eklendi. Her zaman işlemeyebilir.

Bence eğrinin zorluğuna göre sonuç oldukça tatmin edici.

http://hotfile.com/dl/128520762/7e19267/PID_TEST_PRJ.rar.html

z

@Klein

PID algoritmasinin dogru oldugundan eminmisin? Valfi nasil modelledin? 

Bu sistemi kararsizliga sokmaya zorlamak icin KP yi cok genis aralikta degistirdim sistem banamisin demiyor. Bu bana bir terslik oldugunu soyluyor.

Eger bu sistemi gercekten programdaki grafikteki gibi  kontrol edebiliyorsan diyecek bir sey bulamiyorum. Fakat bir yerde muhakkak bir hata oldugunu dusunuyorum.

Istersen soyle yapalim. Sana nonlineer bir cihazi modelleyeyim. Sen bu modeli PID ile kontrol altinda tutmaya calis.

Bir de programin grafiginde zamani gorsek iyi olur. Mesela referansi 100 yaptigimizda cikis bu degere ne kadar zamanda oturuyor.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

#56
Hocam PSet'i değil , K değerini değiştirin. Pset değişken K için başka bir sabit sağlıyor. Sabit K kullanıldığında bir işlevi yok. Değişken K işi de sadece deneme amaçlı.

Zamanı tam olarak gösteremiyorum. Timer kullandığım için zamanlar tutmuyor.  PID tutturma süresini tam olarak görmüyorum. Ama valfin 0 dan tam açık pozisyona gelmesi 60 periyot civarında sürüyor. Daha da hızlandırmayı  denedim ama Delphi timer kısıtlamaları yüzünden bu sefer de PID yavaş kalıyor.

procedure pid(setval:double;input:double);
begin
            error := (setval-input);
            output := output + kp * (error - olderror + (iconst * error) + (dconst * (error - olderror * 2 + oldolderror)));
             oldolderror:=olderror;
             olderror := error;
             if(output>100) then output:=100;
             if(output<1) then output:=1;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var y:double;
begin
            if(checkbox1.Checked) then
            begin
              pvar:=pconst/outset;
              edit1.Text := floattostr(Kp);
            end else pvar:=strtofloat(edit1.Text);

            pid(outset,flow);

            edOutput.Text := floattostr(output);
            edchopper.Text :=floattostr(flow);
            chart1.Series[0].Add(output,'');
            chart1.Series[1].Add(flow,'');
            chart1.Series[2].Add(outset,'');
            if chart1.Series[0].Count > chart1.BottomAxis.Maximum then
            begin
              chart1.BottomAxis.Maximum :=   chart1.Series[0].Count;
              chart1.BottomAxis.minimum :=   chart1.BottomAxis.Maximum-100;
            end;

end;

 procedure TForm1.Timer2Timer(Sender: TObject);
var y:double;
begin
            y:= (100/(100-output)) ;
            flow:=(flow*0.9)+(y*0.1); // valfi yavaşlatır.
end;



Modelleyeceğiniz eğri bu eğriye yakın olursa iyi olur. Önceki mesajlarda verdiğiniz iki eğri gibi olursa bütün motivasyonumu öldürür bilesiniz :)

z

#57
@Klein

Asagida, dogrusal davranmayan bir sistem var. Cikis buyuklugumuz, giris buyuklugumuzun integrali ile iliskili. Fakat lineerlik yok.
Bu sistemin ornek kullanimi delphi programda mevcut.

Amacimiz V degerini surekli ayarlayarak cikis buyuklugu olan result degerini belli bir set degerinde tutmak.
PID kismini sana birakiyorum.

//******************************************************************
//      Dogrusal davranmayan duzenek
//      Giris buyuklugu Voltaj +/- 10 v aralikta
//      Sistemin atikligi Dt
//      PID kontrolde kullandigin DT carpani
//      bu fonksiyona gelmek zorunda  Bu ornekte Dt=0.01
//
//      Sistem cikisimiz +/-20 araliginda
//      +/- 50 yi asarsa sistemimiz imha oluyor
//******************************************************************

function NonLinear(V,Dt:real):real;
begin
        i:=i+v*Dt;
        if i>=0 then result:=power(10,i/10)-1
        else result:=-power(10,abs(i)/10)+1
end;



unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls,math;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Pot: TScrollBar;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  i,y,V:real;
  cik:boolean;
implementation

{$R *.dfm}

//******************************************************************
//      Dogrusal davranmayan duzenek
//      Giris buyuklugu Voltaj +/- 10 v aralikta
//      Sistemin atikligi Dt
//      PID kontrolde kullandigin DT carpani
//      bu fonksiyona gelmek zorunda  Bu ornekte Dt=0.01
//
//      Sistem cikisimiz +/-20 araliginda
//      +/- 50 yi asarsa sistemimiz imha oluyor
//******************************************************************

function NonLinear(V,Dt:real):real;
begin

//      integral etkiye sahip malzeme

        i:=i+v*Dt;

//      Malzemenin akimla orantili cikis buyuklugu
//      Bu ayni zamanda kontrol altinda tutmak istedigimiz buyukluk
//      Amacimiz voltaji ayarlayarak cikisi set pointe getirmek

        if i>=0 then result:=power(10,i/10)-1
        else result:=-power(10,abs(i)/10)+1

end;


procedure TForm1.Button1Click(Sender: TObject);
label dongu;
var
x:integer;
begin
        x:=0; i:=0;
        form1.DoubleBuffered:=true;
        image1.Canvas.Pen.color:=clwhite;
        Cik:=false;
Dongu:
        y:=Nonlinear(pot.Position/10,1E-2);

        if abs(y)>50 then
           begin
             application.MessageBox('Sistem imha oldu','Dikkat',MB_OK);
             halt;
           end;

        image1.Canvas.moveto(x,0);
        image1.Canvas.lineto(x,image1.Height);
        image1.Canvas.Pixels[x,image1.Height div 2]:=clblue;
        image1.Canvas.Pixels[x,image1.Height div 2 -trunc(y*10) ]:=clred;
        application.ProcessMessages;
        inc(x);
        if x>image1.Width then x:=0;
        if Cik then halt;
        goto dongu;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
        Cik:=true;
end;

end.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#58
Sistem şu haliyle oldukça sağır. Sistemi hızlandırarak zorlaştırmak için

        i:=i+v*Dt; ifadesi yerine

        i:=i+v*Dt*K; kullanabilirsin. Buradaki K 1 den daha büyük oldukça sistem daha hızlı tepki verir ve kontrol daha da atikleşir. Bu haliyle 1H bobin kullanmış olduk. K=10 almakla endüktansı 100mH yapmış oluruz. Bu uygulamada karşılaşılacak sistemlere benzeme açısından daha mantıklı olur.

function NonLinear(V,Dt:real):real;
begin
        i:=i+10*v*Dt;
        if i>=0 then result:=power(10,i/10)-1
        else result:=-power(10,abs(i)/10)+1
end;

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Klein

http://hotfile.com/dl/128597122/3e0adbd/NonLinearPID.rar.html

Bu BonLinear fonksiyonunun ilk hali ile yapılmış simülasyon.
Diğer mesajınızı şimdi gördüm.
Birazdan ona da bakacağım.

function NonLinear(V,Dt:real):real;
begin
//      integral etkiye sahip malzeme
NLOut:=NlOut+v*Dt;//      Malzemenin akimla orantili cikis buyuklugu
//      Bu ayni zamanda kontrol altinda tutmak istedigimiz buyukluk
//      Amacimiz voltaji ayarlayarak cikisi set pointe getirmek
if NlOut>=0 then result:=power(10,NlOut/10)-1
else result:=-power(10,abs(NlOut)/10)+1;
end;

procedure TForm1.Button2Click(Sender: TObject);
label dongu;
  var x:integer;
      z:double;
begin
  x:=0;
  i:=0;
  form1.DoubleBuffered:=true;
  image1.Canvas.Pen.color:=clwhite;
  Cik:=false;
  Dongu:
    pid(outset,y);
    y:=Nonlinear(pidout,kd);
    edit5.Text:=floattostr(pidout);
    edit6.Text:=floattostr(y);
    chart1.Series[0].Add(outset);
    chart1.Series[1].Add(y);
    if chart1.Series[0].Count > chart1.BottomAxis.Maximum then
    begin
      chart1.BottomAxis.Maximum :=   chart1.Series[0].Count;
      chart1.BottomAxis.minimum :=   chart1.BottomAxis.Maximum-100;
    end;

    if abs(y)>50 then
    begin
      application.MessageBox('Sistem imha oldu','Dikkat',MB_OK);
      exit;
    end;
  application.ProcessMessages;
  if Cik then exit;
  goto dongu;
end;