Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Assembly de PID hesaplama

Başlatan omenek, 18 Şubat 2007, 23:42:28

omenek

http://rapidshare.com/files/17115911/s7200_turkce.pdf
(siemens s7200 PLC türkçe kullanım kitapçığından alıntı bir pid formülü))

Çıkış.....Oransal terim....İntegral terim......Türevsel terim
....I..............I........................I..........................I...................
....I..............I........................I..........................I...................
Mn   =    (Kc*en)   +  (Ki*en + MX)  + (Kd*(en – en-1) )

Mn=Döngü çıkış değeri   Kc=Kazanç  en=Hata  en-1=Bir önceki hata
Ki=İntegral sabiti  MX=İntegral sabitini bir önceki değeri  Kd=Türev sabiti

Yukarıdaki formülü PIC Assembly de yazmaya çalışıyorum ama negatif sayılarla başım biraz dertte.Normalde negatif sayılar msb bitinin 1 yapılmasıyla gösteriliyor fakat ben bir bayt ın tamamını kullanmak istiyorum bunun içinde başka bir değişkenin bitlerini kullanarak 9 uncu bir bit oluşturuyorum bu bitin durumuna göre bir baytlık bilginin negatif veya pozitif olduğunu anlıyorum.Her işlem yaparken bu flagları kontrol ediyorum +- işlemlerde complement değilde büyük olan sayıdan küçük olan sayıyı çıkarıp büyük olan sayının işareti neyse ilgili flagı 0 veya 1 yapıyorum.Hal böyle olunca programda uzadıkça uzuyor.Program daha bitmedi tamamlamam gereken eksik noktalar çok.
  Bu tür işlemler assembly de daha basit ve doğru bir şekilde nasıl yapılıyor.Bilgisi olan arkadaşlar yardımcı olurlarsa sevinirim.
LIST	P=16F84
	INCLUDE	"P16F84.INC"
;*************************************
	CBLOCK	H'00C'
	SAYAC, COUNT, USTBAYT, ALTBAYT, CARPAN, CARPILAN, HATA, SONHATA, ORANSAL, KAZANC, INTTERIM, TURTERIM, INTSABIT, TURSABIT, SETDEG, SABIT, HIZDEG, CIKIS, COPY, FARK, NEGATIF, TOPLAM1, TOPLAM2
	ENDC				
;*************************************
	ORG	H'000'
	GOTO	AYAR
;*************************************
AYAR
	CLRF	PORTA		;portlar restleniyor
	CLRF	PORTB	
	BSF	STATUS,5	;bank1
	MOVLW	B'11111111'
	MOVWF	TRISA		;a ve b portları giriş
	MOVLW	B'11111111'
	MOVWF	TRISB		;a ve b portları giriş	
	MOVLW	B'10101111'	;rbpu iptal,harici,wdt,1/128
	MOVWF	OPTION_REG
	CLRF	INTCON
	BCF	STATUS,5
	CLRF	TURTERIM
	CLRF	INTTERIM
	CLRF	ORANSAL
	CLRF	CIKIS
	CLRF	HATA
	CLRF	SONHATA
	MOVLW	D'1'
	MOVWF	KAZANC
	MOVLW	D'1'
	MOVWF	INTSABIT
	MOVLW	D'1'
	MOVWF	TURSABIT
	GOTO	BASLA
;*************************************
CARP
 	CLRF	USTBAYT
	CLRF	ALTBAYT
	MOVLW	D'8'
	MOVWF	COUNT
	MOVF	CARPILAN,W
	BCF	STATUS,0 
DONGU
 	RRF	CARPAN,F
	BTFSC	STATUS,0
	ADDWF	USTBAYT,F
	RRF	USTBAYT,F
	RRF	ALTBAYT,F
	DECFSZ	COUNT,F
	GOTO	DONGU
	RETURN
;*************************************
BASLA
	MOVF	TMR0,W
	MOVWF	HIZDEG		;actual hız değeri
	MOVF	PORTB,W
	MOVWF	SABIT		;istenen hız değeri
;................................
	MOVF	HATA,W		;hata değeri hesaplanıyor
	MOVWF	SONHATA
	BCF	NEGATIF,1	;sonhata nın negatif flagı
	BTFSC	NEGATIF,0	;hatanın negatif flagı
	BSF	NEGATIF,1	;sonhata nın negatif flagı
	MOVF	SABIT,W
	MOVWF	SETDEG
	BCF	NEGATIF,0	;hatanın negatif flagı
	MOVF	HIZDEG,W
	SUBWF	SETDEG,W
	BTFSS	STATUS,2
	GOTO	$+4
	CLRF	HATA
	BCF	NEGATIF,0
	GOTO	ORANHES
	BTFSC	STATUS,0
	GOTO	$+6
	MOVF	SETDEG,W
	SUBWF	HIZDEG,W
	MOVWF	HATA
	BSF	NEGATIF,0	;hatanın negatif flagı
	GOTO	ORANHES
	MOVF	HIZDEG,W
	SUBWF	SETDEG,W
	MOVWF	HATA
	BCF		NEGATIF,0	
;.........................
ORANHES
	MOVF	HATA,W		;oransal terim hesaplanıyor
	MOVWF	CARPAN 
	MOVF	KAZANC,W
	MOVWF	CARPILAN
	CALL	CARP
	MOVF	ALTBAYT,W
	MOVWF	ORANSAL
	BCF	NEGATIF,2	;oransal negatif flagı
	BTFSC	NEGATIF,0	;hatanın negatif flagı
	BSF		NEGATIF,2	;oransal negatif flagı
;........................
INTEGHES
	MOVF	HATA,W		;integral terim hesaplanıyor
	MOVWF	CARPAN 
	MOVF	INTSABIT,W
	MOVWF	CARPILAN
	CALL	CARP
	MOVF	ALTBAYT,W
	MOVWF	COPY
	BTFSS	NEGATIF,0
	GOTO	INTEG1
	BTFSS	NEGATIF,3	;intterim negatif flagı
	GOTO	$+3
	ADDWF	INTTERIM,F
	GOTO	TUREVHES
	SUBWF	INTTERIM,W	;integral terim pozitifse
	BTFSC	STATUS,2
	GOTO	ESIT
	BTFSC	STATUS,0
	GOTO	$+6
	MOVF	INTTERIM,W
	SUBWF	COPY,W
	MOVWF	INTTERIM
	BSF	NEGATIF,3	;intterim negatif flagı
	GOTO	TUREVHES
	MOVF	COPY,W
	SUBWF	INTTERIM,F
	BCF	NEGATIF,3	;intterim negatif flagı
	GOTO	TUREVHES
INTEG1
	BTFSC	NEGATIF,3
	GOTO	$+3
	ADDWF	INTTERIM,F
	GOTO	TUREVHES
	SUBWF	INTTERIM,W	;integral terim negatif ise
	BTFSC	STATUS,2
	GOTO	ESIT
	BTFSC	STATUS,0
	GOTO	$+6
	MOVF	INTTERIM,W
	SUBWF	COPY,W
	MOVWF	INTTERIM
	BCF	NEGATIF,3	;intterim negatif flagı
	GOTO	TUREVHES
	MOVF	COPY,W
	SUBWF	INTTERIM,F
	BSF	NEGATIF,3	;intterim negatif flagı
	GOTO	TUREVHES	
ESIT
	CLRF	INTTERIM
	BCF	NEGATIF,3	
;........................	
TUREVHES				;türevsel terim hesaplanıyor
	BTFSS	NEGATIF,1
	GOTO	TUREVHES1
	BTFSS	NEGATIF,0
	GOTO	TUREVHES3
	MOVF	SONHATA,W	;hata ve sonhata negatifse
	SUBWF	HATA,W
	BTFSC	STATUS,2
	GOTO	ESIT1
	BTFSS	STATUS,0
	GOTO	$+6
	MOVF	SONHATA,W
	SUBWF	HATA,W
	MOVWF	FARK
	BSF	NEGATIF,4
	GOTO	TUREVHES4
	MOVF	HATA,W
	SUBWF	SONHATA,W
	MOVWF	FARK
	BCF	NEGATIF,4	;fark negatif flagı
	GOTO	TUREVHES4
TUREVHES1				;sonhata pozitifse
	MOVF	SONHATA,W
	SUBWF	HATA,W
	BTFSC	STATUS,2
	GOTO	ESIT1
	BTFSC	STATUS,0
	GOTO	TUREVHES2
	BTFSS	NEGATIF,0
	GOTO	$+6
	MOVF	HATA,W		;sonhata pozitif,hata negatifse
	ADDWF	SONHATA,W
	MOVWF	FARK
	BSF	NEGATIF,4
	GOTO	TUREVHES4
	MOVF	HATA,W		;sonhata ve hata pozitifse
	SUBWF	SONHATA,W
	MOVWF	FARK
	BSF	NEGATIF,4	;fark negatif flagı
	GOTO	TUREVHES4
TUREVHES2				;sonhata pozitifse ve hata>sonhata ise
	BTFSS	NEGATIF,0
	GOTO	$+6
	MOVF	HATA,W
	ADDWF	SONHATA,W
	MOVWF	FARK
	BSF	NEGATIF,4
	GOTO	TUREVHES4
	MOVF	SONHATA,W
	SUBWF	HATA,W
	MOVWF	FARK
	BCF	NEGATIF,4
	GOTO	TUREVHES4
TUREVHES3				;sonhata negatif,hata pozitifse
	MOVF	HATA,W
	ADDWF	SONHATA,W
	MOVWF	FARK
	BCF	NEGATIF,4
	GOTO	TUREVHES4		
ESIT1
	CLRF	FARK
	BCF	NEGATIF,4
TUREVHES4
	MOVF	FARK,W
	MOVWF	CARPAN 
	MOVF	TURSABIT,W
	MOVWF	CARPILAN
	CALL	CARP
	MOVF	ALTBAYT,W
	MOVWF	TURTERIM
	BCF	NEGATIF,5
	BTFSC	NEGATIF,4	;fark negatif flagı
	BSF	NEGATIF,5	;türevsel terim negatif flagı
;***********************************************************
IFADE1
	BTFSS	NEGATIF,2	;oransal negatif flagı
	GOTO	IFADE1_1
	BTFSS	NEGATIF,3	;intterim negatif flagı
	GOTO	$+6
	MOVF	ORANSAL,W	;oransal ve ıntterim negatifse
	ADDWF	INTTERIM,W
	MOVWF	TOPLAM1
	BSF	NEGATIF,6	;toplam1 negatif flagı
	GOTO	IFADE2	
;.......................		
	MOVF	ORANSAL,W	;oransal negatif,intterim pozitifse
	SUBWF	INTTERIM,W
	BTFSC	STATUS,2
	GOTO	IFADE1ESIT
	BTFSC	STATUS,0
	GOTO	$+6
	MOVF	INTTERIM,W
	SUBWF	ORANSAL,W
	MOVWF	TOPLAM1
	BSF	NEGATIF,6
	GOTO	IFADE2
;.......................
	MOVF	ORANSAL,W
	SUBWF	INTTERIM,W
	MOVWF	TOPLAM1
	BCF	NEGATIF,6
	GOTO	IFADE2
;.......................
IFADE1_1				;oransal pozitifse
	BTFSC	NEGATIF,3	;intterim negatif flagı
	GOTO	$+6
	MOVF	ORANSAL,W	;oransal ve ıntterim pozitifse
	ADDWF	INTTERIM,W
	MOVWF	TOPLAM1
	BCF	NEGATIF,6	;toplam1 negatif flagı
	GOTO	IFADE2
;........................	
	MOVF	ORANSAL,W	;oransal pozitif,intterim negatifse
	SUBWF	INTTERIM,W
	BTFSC	STATUS,2
	GOTO	IFADE1ESIT
	BTFSC	STATUS,0
	GOTO	$+6
	MOVF	INTTERIM,W
	SUBWF	ORANSAL,W
	MOVWF	TOPLAM1
	BCF	NEGATIF,6
	GOTO	IFADE2
;.......................
	MOVF	ORANSAL,W
	SUBWF	INTTERIM,W
	MOVWF	TOPLAM1
	BSF	NEGATIF,6
	GOTO	IFADE2
IFADE1ESIT
	CLRF	TOPLAM1
	BCF	NEGATIF,6
;************************************************************
IFADE2
	BTFSS	NEGATIF,5	;türterim negatif flagı
	GOTO	IFADE2_1
	BTFSS	NEGATIF,6	;toplam1 negatif flagı
	GOTO	$+6
	MOVF	TOPLAM1,W	;turterim ve toplam1 negatifse
	ADDWF	TURTERIM,W
	MOVWF	TOPLAM2
	BSF	NEGATIF,7	;toplam2 negatif flagı
	GOTO	SONUC	
;.......................		
	MOVF	TURTERIM,W	;turterim negatif,toplam1 pozitifse
	SUBWF	TOPLAM1,W
	BTFSC	STATUS,2
	GOTO	IFADE2ESIT
	BTFSC	STATUS,0
	GOTO	$+6
	MOVF	TOPLAM1,W
	SUBWF	TURTERIM,W
	MOVWF	TOPLAM2
	BSF	NEGATIF,7
	GOTO	SONUC
;.......................
	MOVF	TURTERIM,W
	SUBWF	TOPLAM1,W
	MOVWF	TOPLAM2
	BCF	NEGATIF,7
	GOTO	SONUC
;.......................
IFADE2_1				;turterim pozitifse
	BTFSC	NEGATIF,6	;toplam1 negatif flagı
	GOTO	$+6
	MOVF	TURTERIM,W	;turterim ve toplam1 pozitifse
	ADDWF	TOPLAM1,W
	MOVWF	TOPLAM2
	BCF	NEGATIF,7	;toplam2 negatif flagı
	GOTO	SONUC
;........................	
	MOVF	TURTERIM,W	;turterim pozitif,toplam1 negatifse
	SUBWF	TOPLAM1,W
	BTFSC	STATUS,2
	GOTO	IFADE2ESIT
	BTFSC	STATUS,0
	GOTO	$+6
	MOVF	TOPLAM1,W
	SUBWF	TURTERIM,W
	MOVWF	TOPLAM2
	BCF	NEGATIF,7
	GOTO	SONUC
;.......................
	MOVF	TURTERIM,W
	SUBWF	TOPLAM1,W
	MOVWF	TOPLAM2
	BSF	NEGATIF,7
	GOTO	SONUC
IFADE2ESIT
	CLRF	TOPLAM2
	BCF	NEGATIF,7
;*********************************************************
SONUC	
	BTFSC	NEGATIF,7	;sonuç negatifse çıkış=0 olacak
	CLRF	TOPLAM2
	MOVF	TOPLAM2,W		
	MOVWF	CIKIS
	GOTO	BASLA
;..........................
	END


http://rapidshare.com/files/17122188/pid.asm
kodları asm dosyası olarak rapide attım.

Uygun bir mod düzenlemesi yaptık OsmanAbi ;)

zafzaf82

@omenek yanlış anlama ama bu pid algoritmasını neye göre yaptın. Yani referansı nerden giriyon. Geri besleme anolog verimi yoksa dijitalmi. çıkışı nerden yolluyon. yolladıgın dac kaç bit. Örnekleme zamanın kaç ms. integrali hangi metodla hesapladın. Ayrık PID yi hangi programlama metoduyla gerçekledin. Çıkış negatif değerlerde alıyomu. Limitor koydunmu, Kp, KI ve Kd yi dışardanmı giriyon ???

/******Paralel Programlama Yöntemiyle PID Algoritması********
10  Kp=.... , Ki=..... , Kd=.....
20  Y1=0, X2=0   
30  read E1  // hatayı oku
40  E1a=Kp*E1 // oransal kontrol çıkışı 
50  X=E1+X1 // integrator için ara değişken hesabı 
60  E1b = Ki*X + Ki*X1  // integral kontrol çıkışı 
70  Y=E1 // Hatanın bir önceki değerini al
80  E1c = Kd*Y - Kd*Y1 // Türevsel kontrol çıkışı
90  U = E1a + E1b + E1c // Kontrol işareti 
100 out U 
110 X1=X // aradeğişkenlerin bir önceki değerini tut
120 Y1=Y
130 bekle(örnekleme zamanı kadar)
140 goto 30 // tekrar kontrol işaretini hesapla
150 END :)
Mikroişlemci bi araçtır, amaç değil.....

omenek

zafzaf82 kardeş öncelikle ilgilendiğin için çok sağol.
Bu formülü bulduğum linki ilk mesajda verdim hesaplama yöntemi nasıl onu bilmiyorum ama siemens s7200 plc lerde bu hesaplama yöntemi kullanılıyormuş.
Bu programı takogenerator geribeslemeli üniversal dc motorlarda kullanmayı düşünüyorum.Yazıdada belirttiğim gibi programın eksikleri çok.Şimdilik sadece formülü assemblyde uygulamaya çalışıyorum.

Kp  Ki    Kd  yi uygun değerler buluncaya kadar program içerisinde değiştireceğim sonrada bulduğum bu değerler programda sabit kalacak.Hız referans değeri program içerisinde farklı rutinlerde farklı değerler alacak.Gerçek hız değeri TMR0 içeriği olacak ,RA4 TOCKI ye gelen harici tako generator sinyali,TMR0 ı yaklaşık 100ms de bir okuyup tekrar sıfırlayacagım yani geri besleme digital.Hata yı program içerisinde bu değerleri karşılaştırarak buluyorum.Çıkış değerini uygun şekilde düzenleyip bu değerle triyak tetikleme gecikmesini sağlayacağım.(Faz açısı).Bu iş için pic in herhangi bir çıkışını kullanacağım.
Örnekleme zamanını 100ms düşünüyorum.Hesaplama sonucunda Negatif değer varsa bu değeri sıfır kabul ediyorum çünkü çıkışta negatif değerle işim olmuyor ama formül içerisinde negatif değerleri hesaplayabilmem gerekiyor malum çıkışı etkiliyor.

picusta

Bu algoritma için 8 bitlik sayilar yetmeyecek gibi. çünkü overflow sorunu ortaya çikacak. diyelim 255 'i 2 ile çarptiniz, sonuç 510, bunuda 8 bit ile ifade edemezsiniz.
Devamli zaman PID algoritmasi dediginiz gibi. Bunu mikro islemcide yapmak isterseniz örnekleme süresini de hesaba katmalisiniz. örnegin algoritmanizdaki KI yerine KI/Te gelmesi gerekir, KD ise KD*Te.
Tavsiyem asm ile ugrasmayin, C dilindeki signed int tipini ara hesaplamalar için kullanin, islemlerinizi de C'de yapin, sonra asm'de optimizasyon yapabilirsiniz.
Benzer bir sekilde FIR filtre yapmak için, ara hesaplamalarda 64 bitlik akü ve 32 bit hassasiyetinde katsayi kullandim, buna karsilik giris çikis 12 bit idi.

bigbey

Programı mutlaka Assembly dilinde yazıp bitirmeliyim diye düşünüyorsan böyle bir mecburiyet var ise register sorunun yok ise 16 bit olarak çalışmanı tavsiye ederim. Çarpma rutinin ve diğer hesaplamalarını 16 bit olarak tasarlar isen sanırım rahatca hesaplamalarını yapabilirsin.
TA6R

mesmert

Anladığım kadarıyla DC motor sürücüsü yapmaya çalışıyorsun tako generatoründen gelen dalgalı voltajı PID mantığı ile daha karlı bir şekilde okuyup ona göre SCR'leri sürmek istiyorsun - dediğin Tako genaratorün yön değiştirmesimi acaba?

omenek

picusta hocam çok haklısın biran önce C diline geçmek lazım ama uğraştığım işi en kısa zamanda teslim etmem gerekiyordu bu nedenle yazdığım kodlar üzerine yoğunlaştım  epey bir uğraşıdan sonra nihayet  sonuca ulaştım.
Motor değişken yüklere karşı,mükemmel değil ama  tatmin edici bir kararlılıkta çalışıyor tepki ve yerleşme süreside oldukça iyi.Yani yazdığım kodları biraz düzelttikten sonra  işimi gördü.Ama sizinde dediğiniz gibi çok
önemli uygulamalar için bu kodlar yetersiz.
Programın PID formülüyle ilgili olan bölümünü rapide attım belki birilerine lazım olur.
picusta hocam birde bu FIR filtre ne oluyor kısaca bilgi verebilirmisiniz.
bigbey hocam sizin önerinizde uygulanabilir.
mesmert hocam uygulama triyak ile faz açısını değiştirerek üniversal motor hız kontrolü ile ilgili.Tako sinyalinin yön değiştirmesi söz konusu değil gelen sinyaller düzeltilip kare dalga sinyal olarak PIC in TMR0 sayıcısını besliyor 100 ms lik zaman aralıklarında bu değeri okunup HIZDEG isimli registere kopyalanıyor bu değer formülde işlenerek faz açısı ayarlanıyor.


http://rapidshare.com/files/17746666/PIDPR.asm

mesmert

Alıntı yapılan: "omenek"picusta hocam çok haklısın biran önce C diline geçmek lazım ama uğraştığım işi en kısa zamanda teslim etmem gerekiyordu bu nedenle yazdığım kodlar üzerine yoğunlaştım  epey bir uğraşıdan sonra nihayet  sonuca ulaştım.
Motor değişken yüklere karşı,mükemmel değil ama  tatmin edici bir kararlılıkta çalışıyor tepki ve yerleşme süreside oldukça iyi.Yani yazdığım kodları biraz düzelttikten sonra  işimi gördü.Ama sizinde dediğiniz gibi çok
önemli uygulamalar için bu kodlar yetersiz.
Programın PID formülüyle ilgili olan bölümünü rapide attım belki birilerine lazım olur.
picusta hocam birde bu FIR filtre ne oluyor kısaca bilgi verebilirmisiniz.
bigbey hocam sizin önerinizde uygulanabilir.
mesmert hocam uygulama triyak ile faz açısını değiştirerek üniversal motor hız kontrolü ile ilgili.Tako sinyalinin yön değiştirmesi söz konusu değil gelen sinyaller düzeltilip kare dalga sinyal olarak PIC in TMR0 sayıcısını besliyor 100 ms lik zaman aralıklarında bu değeri okunup HIZDEG isimli registere kopyalanıyor bu değer formülde işlenerek faz açısı ayarlanıyor.


http://rapidshare.com/files/17746666/PIDPR.asm

Hocam bu son verdiğiniz kodları yüklemeniz mümkünmüdür.

omenek

http://rapidshare.com/files/23050786/pid.asm

Tarihi eski ve yeni diğer bütün upload larım durduğu halde bu neden silinmiş anlayamadım.Kolay gelsin.

mesmert

ben bunu sıcaklık ölçmek için kullanacam ama nasil uydurucam

omenek

O tür bir uygulama yapmadım ama sanırım örnekleme süresini epey uzun tutman gerekir,birkaç saniye gibi.Actual değer için TMR0 ın yerine analog girişlerden okuyacağın değeri kullanman gerekecek.PID hesaplama sonucu "CIKIS" registerindeki değerdir.Sonuçta benim yazdığım sadece PID hesaplaması yapan bir alt program,tasarlayacağın devreye göre ana programı oluşturman gerekiyor.Umarım  bu konuda bilgisi olan arkadaşlar
tecrübelerini paylaşırlar.Selamlar.

elmaalma

Alıntı yapılan: "omenek"http://rapidshare.com/files/23050786/pid.asm

Tarihi eski ve yeni diğer bütün upload larım durduğu halde bu neden silinmiş anlayamadım.Kolay gelsin.
Link tekrar silinmiş. Yeniden yükleyebilir misiniz?