avatar_Mucit23

PID kontrol Sistemleri

Başlatan Mucit23, 30 Kasım 2011, 11:30:30

harddisk

Arkadaşlar eğer dosya görünmüyorsa diye birde böyle link vereyim rica ediyorum yardımcı olun bitirme projem ve çok az zamanım kaldı

http://s3.dosya.tc/server5/eE4h4x/Desktop.rar.html

F®T

Burayı incelersen faydası olur.

siteyi iyi araştırmıyorsunuz.en azında önceki projelerden bakıp çözme şansınız yüksek.

http://etepic.com/index.php/topic,266.msg2774.html#msg2774
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

harddisk

hatamın nerde olduğunu bulabilseydim yardım istemezdim emin olun.yine de sağolun....

F®T

Harddisk sizi kırmak için söylemedim.fakat biraz sitedeki bilgilerden faydalanmak gerekiyor.şimdi önce sıfır geçişini algılıyorsun.sonra kesmeye giriyorsun.sonra kesmede istediğin gecikmeden sonra triac tetik için çıkış üretiyorsun.kesmeden çıkıyorsun.şimdi 50 hz de peryod 20 ms de oluşuyor.siz bir alternansta iş yapacaksınız 10 ms. alternans yükselince veya istersen düşerse kesmeye girer.yaklaşık 0-10 ms lik bir arada gecikme verip alternansın istediğin zamanında ateşleme üretirsin.verdiğim örnekte bu tip bir yapı var.açıp incelersen faydasını görürsün.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

hasanemmii

Gerçi üzerinden bir yılı aşkın bir süre geçmiş ama dikkatimi çekti. Sayın Inventor proton için aşağıdaki satırları yazmış. Amaç eksili sonuçları elde etmek. Picbasic de böyle yapılır. Ete hocam anlattı defalarca. Ama protonda ne gerek olduğunu anlmış değilim. Protonda DWORD ile zaten + ve - sayılar saklanabiliyor. İşlem sonucu - çıktığında sonucun terslenip 1 eklenmesine gerek kalmıyor. Yanlışım varsa öğrenmek isterim.

Bu arada proje rafta tozlandı  :(


Dim i as bit   ( i var bit )
Dim a   As Word   ( a var word )
Dim sonuc As Word ( sonuc var word )
Dim b As Word  ( b var word )

şimdi basit bir işlem yapalım

a=1000
b=500
i=0
sonuc=0

basla:
sonuc=a-b
i=sonuc.15
sonuc=abs sonuc
if i=1 then sonuc=-sonuc
Print At 1,1," sonuc = ",SDec sonuc

harddisk

Öncelikle ete hocama olmak üzere herkese teşekkür ederim.Projemiz uzun ve zorlu bir uğraş sonucu çalıştı aradan biraz zaman geçti ama ben yinede faydalanmak isteyen arkadaşlar için çalışma videosunu koyuyorum. Kısaca yapılanları anlatmak gerekirse öncelikle PID kontrölünü yapan proses kontrollü Emkonun cihazını kullanık. Cihaza anolog çıkış modülü taktık ve eklenen modülden alınan analog çıkış bizim tasarladığımız triyak tetikleme kartının girişi oldu. PIC(16F877A) gelen analog girişe göre şebekenin  sıfır geçişlerini algıladıktan sonra tetikleme darbesini MOC3021 optokuplörüne iletti. Optokuplörde triyakı yetkilendirdi. Ve istenilen etkin değerde gerilim değeri bu sayede yüke aktarılmış oldu. Hata maksimumken 220V etkin değer ile beslenen yük hata minumuma indikçe etkin değeri küçülen gerilim  değerleriyle sürüldü.

PID ile Sıcaklık Kontrolü

NOT:Videonun altında ilgili döküman mevcuttur....

iyi günler...

F®T

sonuç güzel olmuş.emeğinize sağlık.başarılı bir uygulama.tebrik ederim.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

0nur

Merhaba,

Şuan bir motorun istediğim referans değerinde sabit hızla dönmesi için bir proje üzerinde çalışıyorum. Encoderdan gelen bilgiler ile b0 ve timer1 kesmesini kullanarak motorun hızını ve yönünü tesbit edebiliyorum. PID konusunda yapılan çalışmaları inceledim ve kafama takılan birkaç noktayı sormak istiyorum.Öncelikle kodu vereyim;



Device 16F877   
Config hs_OSC , WDT_OFF, PWRTE_ON,  BODEN_OFF , LVP_OFF, CP_OFF 

Declare Xtal 20

'============================== LCD TANIMLAMALARI=====================================;

Declare LCD_DTPin = PORTD.4
Declare LCD_RSPin = PORTE.0
Declare LCD_ENPin = PORTE.1
Declare LCD_Interface =  4 ' 4-bit Interface
Declare LCD_Lines =  4
Declare LCD_Type  = alpha
Declare LCD_CommandUs = 2000
Declare LCD_DataUs = 50
All_Digital TRUE
Cls

'==========================================================================================================;           
'=====================================KESME TANIMLAMALARI ================================;             


On_Hardware_Interrupt GoTo bak              'Software int. oluştuğunda INT etiketine git.

OPTION_REG.6=0
T1CON=%00110001    ' -------->>>  |  DİSABLE   |   DİSABLE   |   PS1    |  PS0   |   T1OSCEN  |   T1SYNC   |  TMR1CS   |   TMR1ON   |
         
Symbol INTF = INTCON.1      'RB0 KESME BARAĞI
Symbol INTE = INTCON.4      'RB0 KESME YETKİ
Symbol GIE = INTCON.7       'GLOBAL INT. YETKI
Symbol PEIE=   INTCON.6
Symbol TMR1E=  T1CON.0      ' TMR1 ENABLE BİTİ
Symbol TMR1IF= PIR1.0       ' TMR1 TAŞMA BAYRAĞI
Symbol TMR1IE= PIE1.0


TMR1IE=1 ' TMR1 AŞIMI KESME OLUŞTURMA AKTİF ETME BİTİ
TMR1IF=0 ' TMR1 AŞIM KESME BAYRAĞI
PEIE=1 
INTE=1                      'RB0 Kesmesi aktif
GIE=1                       'Aktif O an Tüm kesmelere Yetki ver     


TMR1H=$0b
TMR1L=$dc

'==========================================================================================================;
'=====================================PWM TANIMLAMALARI ================================; 

CCP1CON=%00001100
Declare CCP1_Pin = PORTC.2   ' Select HPWM port and bit for CCP1 module. i.e. channel 1
Declare CCP2_Pin = PORTC.1   ' Select HPWM port and bit for CCP2 module. i.e. channel 2     
   
'==========================================================================================================;
'============================= GİRİŞ - ÇIKIŞ VE DEĞİŞKENLER ==========================;
     
Input PORTB     
     
Input PORTD         
TRISC=0
Dim T1 As Word   
Dim sayac As Word   
       
Dim sure As Byte

Dim redhiz  As Dword         
Dim motorhiz  As Dword
Dim redtam  As Word         
Dim redonda  As Word
Dim mtam As Dword
Dim monda As Dword
Dim yon As Bit
Dim a As Bit
Dim b As Bit
Dim t11 As Byte
Dim cycle As Byte
Dim ref As Byte
Dim Kp As Byte


Symbol yonbilgi=PORTD.1
Symbol mi=PORTC.0
Symbol mg=PORTC.1
Symbol led=PORTC.3
Symbol led2=PORTC.4

Symbol enc=PORTB.0       
Symbol enc2=PORTB.1       
Clear



'==========================================================================================================;
'============================= ANA DÖNGÜ ==============================================;


mi=0
mg=1


ref=10
Kp=50

basla:
HPWM 1,cycle,1000
motorhiz=((sayac)*3.75)*100       '60/16=3.75
mtam=motorhiz/100
monda=motorhiz//100
redhiz=(sayac*0.7732)             '(60/(485*26))*100~= 0.7732
redtam=redhiz/100
redonda=redhiz//100
cycle=kp*(ref-redtam)




Print At 1,1,"Set Degeri:",@ref,
Print At 2,1,"MOTOR: ",@mtam,".",Dec2 monda,
Print At 2,16,"RPM"
Print At 3,1,"SAFT : ",@redtam,".",Dec2 redonda,
Print At 3,16,"RPM"
Print At 4,1,"FREQ : ",@sayac,
Print At 4,13,"hz"



If yon=1 Then
Print At 4,16,"Cw ",
Else
Print At 4,16,"Cww",
EndIf






GoTo basla                 
               
'============================================== KESME ======================================================       

Disable
bak:
Context Save
If TMR1IF=1 Then
TMR1H=$0b
TMR1L=$dc
TMR1IF=0
Inc sure

If sure=10 Then
   sayac=T1   'sayac ve TICK word tipi olmalıdır , TICK gelen encoder puls adedidir
   T1=0
   sure=0
EndIf


GoTo CIK
EndIf
Inc T1

t11=T1//2

If t11=1 Then
a=enc
EndIf
If t11=0 Then
b=enc2
EndIf
yon=a^b



INTF=0 

CIK:
Context Restore
Return



ref=10
Kp=50
cycle=kp*(ref-redtam)


Burada redtam dediğim değişken benim encoderdan okuduğum motor şaftı devir bilgisi. Sadece oransal kont. kısmını yazdım muhtemelen bazı eksiklerim var. Sormak istediğim konu ; motoru istediğim devre sabitlemek için nasıl bir algoritma eklemeliyim ?


ete

#83
PID konusu çok ilgi duyduğum ancak şimdiye kadar hiç bir uygulama yapamadığım bir konu.
Çok fazla inceledim deneme programları yazdım ama uygulama olmayınca sonuç alamadım ve olayda kafama oturmadı tabiiki.
İnsan başta her şey standartmış gibi düşünüyor. Ama öyle değil maalesef. PID konusunda bütün her şey uygulanacak sisteme göre farklılık arz ediyor.
Bu nedenle oturup sakince düşünmek gerekiyor. Şİmdi biraz sesli düşünelim. Motorun devrini kim ayarlıyor? PWM_Duty değeri ayarlıyor. O halde pid hesapları sonunda hesaplayacağımız değer Duty değeri olmalıdır. Sen 8 bit PWM kullanıyorsun. (10 bit olsa daha iyi olurdu)
O halde hesaplayacağın değer 0-255 arası bir değer olmalıdır. Burası tamam ancak hız (devir) ile PWM arasında bir ilişki belirlemen gerekiyor. Öncelikle bir set değerin olmalı. Hız hangi değerde tutulacak? ikincisi yüksüz olarak bu hızı tutturmak için yaklaşık olarak hangi Duty değerini vermen gerektiğini bulman gerekiyor.  Örneklerle ilerleyelim;
Diyelimki set değerin 100 dev/dak. Bu devire ulaşmak için Duty olarak 127 veriyorsun . Şimdi pid konusuna dönebiliriz.
Yalnızca oransal kontrol yapacak isek okunan hız değeri 100'den büyük ise Duty değeri 127 den az olmalı, 100 den küçük ise 127 den büyük olması gerekecektir. Bunuda hata oranı belirleyecektir.
Hata=Set-Okunan şeklinde uygular isek ve Okunan diyelimki 95 olsun , Şİmdi hesabı yapalım. Hata=100-95=5
Şimdi oransal formülümüze bakalım Oransal=Kp*Hata şeklinde uygulanması gerekiyor. Ancak formülü bu şekilde kullanmamız uygun düşmeyecektir. Zira okunan hız 100 den küçük olduğu için 127 olan duty değerinin 127 den büyük hesaplanması gerekiyor idi. Burada hatamızı %5 gibi kabul edersek ve set değerimizi 5 birim artıracağımızı düşünürsek Oransal=127+1*hata/100 şeklinde  formülü uygulayabilirsin.  Bu durumda KP değerin 1 olacaktır. Anlayacağın ortama veya test sonuçlarına göre uygun değerler hesaplaman gerekiyor. Deneysel sonuçlara göre 5 birim artırmak işi çözmüyor ise Kp=1,05 veya 1,1 alınabilir. Dediğim gibi uygun değer ancak deneysel sonuçlar alınarak çözülebilir.

İşin bu kısmında biraz çalış türev integral kısımlarını dah asonra ekleyelim.
Hepsini uygular isen DUTY=Oransal+Türev+Integrel şeklinde hesaplanmış olacaktır.

Ete

0nur

#84
Şimdi mevcut sistem üzerinden örneklerle açıklayacak olursak;

Motora farklı iş süresi uygulayarak hızını ölçtüm. Ekteki gibi bir tablo elde ettim.

duty değeri arttırkça hızdaki değişim azalıyor. Burada hızla oynayınca torkuda düşürmüş oluyorum, motorun duty değerini düşürdüğümde istediğim torku elde edemiyorum.

Ekteki tabloda sol çizelge rpm değerleri, alt kısımdaki ise duty değerleri. Denklemi otomatik olarak oluşturdum belli bir hata ile değeri hesaplıyor.

Motorun 10 rpmde tutulacağını düşünür isek, duty değerini 10 verdiğimizde yaklaşık olarak 10.65 rpmlik bir çıkış elde ediyoruz.

Şimdi denkleme tekrar dönersek;

redtam = encoderdan gelen değerim
ref=10  ' istediğim devir değeri
Kp=50  ' oransal katsayım
cycle=10+kp*(ref-redtam)/100  'sadece oransal kont. kullandığımızı düşünürsek cycle değerim.

encoderdan gelen değer 10 duty verdiğimizde 10.65 olacak. Motoru zorladığımızı düşünür isek bu devir düşecek ve hata değerimiz büyüyecek.

zorlandığında örneğin devir 6 rpm e düştüğünü varsayalım. yeni hata değerimiz;

ref-redtam = 10-6 = 4 olacak.


Şuan dediğiniz işlemi şu şekilde yaptım.

cycle=10+(kp*(ref-redtam)/100)


If cycle>=255 Then
cycle=255
EndIf

Fakat redtam değeri büyük olduğunda cycle değerinin azalması gerekiyor burada nasıl bir işlem yapmalıyız.


0nur

Son düzenleme ile;

cycle=10+(kp*(ref-redtam))

ref=10
Kp=2.3


değerlerini verdim. Fakat salınımlar çok fazla. Motoru zorladığımda değeri referansa çekmeye çalışırken kpyi küçük tutarsam çok yetersiz kalıyor büyük tutarsam çok hızlı yükselip motor ani hızlanıp sonra duruyor. Sanırım denklemde artık sıkıntı yok tek eksiklik kp de

ete

Normalde hata pozitif yönde ise ekleme negatf yönde ise çıkarma yapmak gerekiyor.
Bu nedenle şöyle bir şey yapılabilir.
Hata=abs(ref-redtam)
If ref>redtam then
  Cycle=10+hata
Else
  Cycle=10-hata
Endif

Normal şartlarda çoğu zaman yalnızca oransal kontrol sistemi stabil tutmak için yeterli olmaz. Bu sende de böyle çıkmış görünüyor. Biliyorsun pid normalde 3 parametreden oluşuyor. İşin içine birde integral sokman gerekecek.

Ete

0nur

#87
Evet,

Burada hatanın etkisinin negatifmi pozitif mi olduğunu belirtmek için bir işlem yapmamız gerekiyordu ama bunu ifle yapmak işlem gecikmesine sebep olur diye düşündüm.

Şimdi PI kontrol üzerine çalışacam oransalda sorun yok gibi gözüküyor. Salınımların sebebi oransal kontrolden kaynaklanıyor bunları düzenlemek içinde inventor arkadaşımızın önceki konularda bahsettiği gibi integral kontrolüde işin içine sokmamız gerekiyor anladım kadarı ile. Ben biraz çalışayım aşamayı buraya tekrar yazacağım.


0nur

DC motorda tork kontrolunu yapabilirmiyiz? Bu konuyla ilgili bir çalismaniz oldumu?

ete

Tork kontrolü ile ilgili bir çalışmam olmadı. Tork kontrolü tabirini kafama oturtamadım. Tork dedğin şey senin redüktörlü motorun redüktör çıkışının dairesl kuvvetidir. Bunu kontrol etmek ne anlama geliyor biraz açıklarmısın?

Ete

Powered by EzPortal