?? pid.c
字號:
;**********************************************************************
;最佳參數(shù):(此參數(shù)僅適用本系統(tǒng))
; 采樣周期10MS時(shí)
; KP=AFH*2,KI=46H,KD=F9*8H
; 運(yùn)算中以上參數(shù)全當(dāng)小數(shù)處理
; 即實(shí)際參數(shù)為:KP=0.6836*2 =1.3672
; KI=0.2734
; KD=0.9727*8=7.7813
;HURGE
;200710251556
;
;*****************************定義變量存儲區(qū)******************************
PH EQU 30H
PM EQU 31H
PL EQU 32H
IH EQU 33H
IM EQU 34H
IL EQU 35H
DH EQU 36H
DM EQU 37H
DL EQU 38H
KP EQU 39H ;P參數(shù)
KI EQU 3AH ;I參數(shù)
KD EQU 3BH ;D參數(shù)
EK0 EQU 3CH
EK1 EQU 3DH
PEKH EQU 3EH
OLDKEY EQU 3FH
UK0H EQU 40H
UK0L EQU 41H
EI EQU 42H
PEKL EQU 43H
IEKH EQU 44H
IEKL EQU 45H
DEKH EQU 46H
DEKL EQU 47H
EKI EQU 48H
EK2 EQU 49H
UK1H EQU 4AH
UK1L EQU 4BH
;----------------------------------------------------------------------------
ORG 0000H
AJMP MAIN
ORG 0003H ;外部中斷0入口地址
AJMP AINT
ORG 000BH ;定時(shí)器T0中斷服務(wù)入口地址
AJMP T0INT
;*****************************************************-----------------------
; 主程序
;*****************************************************-----------------------
ORG 100H
MAIN: MOV SP,#50H ;初始化堆棧
;初始化數(shù)據(jù)段
MOV PH,#07H
MOV PM,#0H
MOV PL,#0H
MOV IH,#02H
MOV IM,#08H
MOV IL,#0H
MOV DH,#09H
MOV DM,#09H
MOV DL,#06H
;******************************************
MOV KP,#0AFH ;P參數(shù) (.AFH)*2=1.3672
MOV KI,#046H ;I參數(shù) (.46H)=0.2734
MOV KD,#0F9H ;D參數(shù) (.F9H)*8=7.7813
;*******************************************
MOV EK0,#00H ;e(0)
MOV EK1,#00H ;e(-1)
MOV PEKH,#00H ;
MOV OLDKEY,#00H ;存按鍵值
MOV UK0H,#00H ;數(shù)據(jù)暫存
MOV UK0L,#00H
MOV EI,#50H ;門限電壓值
MOV PEKL,#00H
MOV IEKH,#00H
MOV IEKL,#00H
MOV DEKH,#00H
MOV DEKL,#00H
MOV EKI,#00H
MOV EK2,#00H
MOV UK1H,#00H
MOV UK1L,#00H
MOV R0,#30H
MOV R2,#00H
MOV R3,#00H
MOV R4,#00H
MOV R5,#00H
MOV R6,#00H
MOV R7,#00H
MOV TMOD,#01H ;初始化定時(shí)器Xms
MOV TH0,#0E0H
MOV TL0,#0BFH
MOV IE,#82H ;開定時(shí)中斷
SETB TR0 ;啟用定時(shí)器0
MAINLOOP:
LCALL DISP ;調(diào)用顯示
LCALL KEYP
JMP MAINLOOP
;*****************************************************
; 中斷處理
;*****************************************************
;---------------------10MS定時(shí)中斷處理------------------
T0INT: PUSH ACC
PUSH DPL
PUSH DPH
;啟用AD轉(zhuǎn)換
;*****************************************
;——方法1 地址方式
MOV DPTR,#3FFFH
MOVX @DPTR,A
;_____________________
;——方法2 IO方式
CLR P2.7
; NOP
; NOP
; ;AD轉(zhuǎn)換start
; CLR P2.6
; CLR P3.6
; NOP
; NOP
; SETB P2.6
; SETB P3.6
MOV IE,#083H ;開外部中斷
;賦計(jì)數(shù)初值
MOV TH0,#0E0H
MOV TL0,#0BFH
POP DPH
POP DPL
POP ACC
RETI
;--------------------------------------------------------------
;---------------外部中斷處理-----------------------------------
AINT: PUSH ACC
PUSH PSW
PUSH DPL
PUSH DPH
SETB PSW.3
;AD運(yùn)算 讀AD轉(zhuǎn)換值
;**********************************
;——方法1 地址方式
; MOV DPTR,#3FFFH
; NOP
; MOVX A,@DPTR
;——方法2 IO方式
CLR P2.6
CLR P3.7
NOP
MOV A,P0
NOP
SETB P3.7
SETB P2.6
;AD轉(zhuǎn)換end
;----------------------
; CLR C
; SUBB A,#00H ;誤差修正
MOV IE,#82H ;關(guān)外部中斷
ADD A,#80H ;采樣值轉(zhuǎn)化為偏移二進(jìn)制
;******************************************************************
;位置式PID算法,算法為UK0=UK1+(EK0-EK1)*KP+Kc*EK0*KI+(EK0-2EK1+EK2)*KD;當(dāng)EKO不大于門限電壓時(shí),Kc取1,其他取0
;PID運(yùn)算,R7為正負(fù)標(biāo)志,EK0為本次誤差,EK1為上次誤差,EK2為上上次誤差
;PEKL為P運(yùn)算結(jié)果低位,PEKH為P運(yùn)算結(jié)果高位
;IEKL為I運(yùn)算結(jié)果低位,IEKH為I運(yùn)算結(jié)果高位
;DEKL為D運(yùn)算結(jié)果低位,DEKH為D運(yùn)算結(jié)果高位
;UK0H為本次PID運(yùn)算結(jié)果高位,UK0L為低位
;UK1H為上次PID運(yùn)算結(jié)果高位,UK1L為低位
MOV EK0,A
;*****************比例運(yùn)算*********************
PPP:
JNB ACC.7,PP1
MOV R7,#01H ;存負(fù)號標(biāo)志
PP1: CLR C
SUBB A,EK1 ;EK0-EK1
JNB PSW.2,PP2 ;判斷是否溢出并處理
CJNE R7,#01H,PP3 ;判斷正負(fù)溢出
MOV R7,#00H ;清負(fù)標(biāo)志
MOV A,#80H ;正溢出給正最大值
JMP PP2
PP3: MOV A,#7FH ;負(fù)溢出給正負(fù)最小值
PP2: MOV R7,#00H ;無益出清負(fù)標(biāo)志
JNB ACC.7,PPP0 ;判斷EK0-EK1是否為負(fù)
CPL A ;負(fù)值取其絕對值(取反加一)
INC A
MOV R7,#01H ;值負(fù)標(biāo)志
PPP0:
MOV B,KP ;運(yùn)算完成2(EK0-EK1)*KP 通過1次左移運(yùn)算實(shí)現(xiàn)
MUL AB
CLR C
RLC A
MOV PEKL,A
MOV A,B
RLC A
MOV PEKH,A
JNB ACC.7,PPP1 ;運(yùn)算有溢出給最大值,并結(jié)束左移運(yùn)算
MOV PEKH,#7FH
MOV PEKL,#0FFH
PPP1: CJNE R7,#01H,PP5 ;被乘數(shù)為負(fù)結(jié)果處理(還原為補(bǔ)碼)
MOV R7,#00H
MOV A,PEKL
CPL A ;取反
ADD A,#01H ;加一
MOV PEKL,A ;送低位結(jié)果
MOV A,PEKH
CPL A ;取反
ADDC A,#00H ;加進(jìn)位位
MOV PEKH,A ;送高位結(jié)果
PP5: ;比例運(yùn)算結(jié)束
;***************************
;********積分運(yùn)算********
III: MOV A,EK0
JNB ACC.7,II1 ;判斷正負(fù)
MOV R7,#01H ;置負(fù)標(biāo)志
CPL A ;負(fù)值取其絕對值(取反加一)
INC A
II1:
MOV B,KI
MUL AB ;EK0*KI
MOV IEKL,A
MOV IEKH,B
CJNE R7,#01H,II3 ;EK0為負(fù)值的處理(還原成補(bǔ)碼)
MOV R7,#00H
MOV A,IEKL
CLR C
CPL A
ADD A,#01H
MOV IEKL,A
MOV A,IEKH
CPL A
ADDC A,#00H
MOV IEKH,A
II3: ;積分運(yùn)算結(jié)束
;**************微分運(yùn)算 *********
DDD: MOV A,EK0
JNB ACC.7,DD1
MOV R7,#01H ;存負(fù)號標(biāo)志
DD1: CLR C
SUBB A,EK1 ;EK0-EK1
JNB PSW.2,DD2 ;判斷是否溢出并處理
CJNE R7,#01H,DD3 ;判斷正負(fù)溢出
MOV R7,#00H ;清負(fù)標(biāo)志
MOV A,#80H
JMP DD2
DD3: MOV A,#7FH
DD2: MOV R7,#00H ;清負(fù)標(biāo)志
MOV EKI,A
MOV A,EK2
JNB ACC.7,DD4
MOV R7,#01H ;存負(fù)號標(biāo)志
DD4: CLR C
SUBB A,EK1 ;EK2-EK1
JNB PSW.2,DD5 ;判斷是否溢出并處理
CJNE R7,#01H,DD6 ;判斷正負(fù)溢出
MOV R7,#00H ;清負(fù)標(biāo)志
MOV A,#80H
JMP DD5
DD6: MOV A,#7FH
DD5: MOV R7,#00H ;清負(fù)標(biāo)志
JNB ACC.7,DD7
MOV R7,#01H
DD7: ADD A,EKI
JNB PSW.2,DDD1 ;判斷是否溢出并處理
CJNE R7,#01H,DDD2 ;判斷正負(fù)溢出
MOV R7,#00H ;清負(fù)標(biāo)志
MOV A,#80H
JMP DDD1
DDD2: MOV A,#7FH
DDD1: MOV R7,#00H ;清負(fù)標(biāo)志
MOV EKI,A ;做(EK0-2EK1+EK2)
JNB ACC.7,DDD0 ;判斷(EK0-2EK1+EK2是否為負(fù)
CPL A
INC A
MOV R7,#01H
DDD0: MOV B,KD ;運(yùn)算完成8(EK0-2EK1+EK2)*KD,通過3次左移運(yùn)算實(shí)現(xiàn)
MUL AB
CLR C
RLC A
MOV DEKL,A
MOV A,B
RLC A
MOV DEKH,A
JNB ACC.7,DDD3 ;運(yùn)算有溢出給最大值,并結(jié)束左移運(yùn)算
MOV DEKH,#7FH
MOV DEKL,#0FFH
JMP DDD5
DDD3: MOV A,DEKL
CLR C
RLC A
MOV DEKL,A
MOV A,DEKH
RLC A
MOV DEKH,A
JNB ACC.7,DDD4 ;運(yùn)算有溢出給最大值,并結(jié)束左移運(yùn)算
MOV DEKH,#7FH
MOV DEKL,#0FFH
JMP DDD5
DDD4: MOV A,DEKL
CLR C
RLC A
MOV DEKL,A
MOV A,DEKH
RLC A
MOV DEKH,A
JNB ACC.7,DDD5 ;運(yùn)算有溢出給最大值
MOV DEKH,#7FH
MOV DEKL,#0FFH
DDD5: CJNE R7,#01H,DDD6
MOV R7,#00H
MOV A,DEKL
CLR C
CPL A
ADD A,#01H
MOV DEKL,A
MOV A,DEKH
CPL A
ADDC A,#00H
MOV DEKH,A
DDD6: ;*********微分運(yùn)算結(jié)束*********
;************求和運(yùn)算*****************
MOV UK0H,UK1H ;Uk(k-1)運(yùn)算結(jié)果給UK0
MOV UK0L,UK1L
MOV R1,#UK0H ;Uk(k-1)+P運(yùn)算結(jié)果給UK0
MOV R0,#UK0L
MOV R2,PEKL
MOV R3,PEKH
LCALL FADD
MOV R1,#UK0H ;Uk(k-1)+P+D運(yùn)算結(jié)果給UK0
MOV R0,#UK0L
MOV R2,DEKL
MOV R3,DEKH
LCALL FADD
MOV A,EK0 ;門限比較
JNB ACC.7,UUUU0 ;判斷正負(fù)
CPL A ;負(fù)值取其絕對值(取反加一)
INC A
UUUU0: CLR C
SUBB A,EI ;門限電壓為3FH
JNC UUU ;過門限電壓去掉積分項(xiàng)
MOV R1,#UK0H
MOV R0,#UK0L
MOV R2,IEKL
MOV R3,IEKH
LCALL FADD
;Uk(k-1)+P+D+I運(yùn)算結(jié)果給UK0
UUU: ;------存UK0值
MOV UK1H,UK0H
MOV UK1L,UK0L
;-----------進(jìn)位處理-------
MOV A,UK0H
JNB ACC.7,UUU0 ;判斷PID運(yùn)算結(jié)果正負(fù)(判斷高八位最高為是否為1)
MOV A,UK0L ;為負(fù)時(shí)判斷低八位是否為80H
JB ACC.7,SPID ;低八位最高位大于80H時(shí)不進(jìn)位
MOV A,UK0H
CJNE A,#80H,UKA2 ;判斷高八位為80H時(shí)也不進(jìn)位(進(jìn)位則會溢出)
JMP SPID
UKA2: DEC A ;高八位小于80H時(shí)進(jìn)位(進(jìn)位即高八位減一因?yàn)槭秦?fù)數(shù))
MOV UK0H,A
JMP SPID
UUU0: MOV A,UK0L ;正數(shù)處理
JNB ACC.7,SPID ;判斷低位是否大于80H,不大不做進(jìn)位處理
MOV A,UK0H ;判斷高位是否為7FH,是不做進(jìn)位處理(進(jìn)位則溢出)
CJNE A,#7FH,UKA5
JMP SPID
UKA5: INC A ;低八位大于80H時(shí)進(jìn)位(進(jìn)位即高8位加一 正數(shù))
MOV UK0H,A
SPID: MOV A,UK0H
END1: ADD A,#80H ;回歸原碼
;-----------------------PID運(yùn)算結(jié)束------------------
;DA轉(zhuǎn)換
MOV DPTR,#0DFFFH
MOVX @DPTR,A
MOV EK2,EK1
MOV EK1,EK0
POP DPH
POP DPL
POP PSW
POP ACC
RETI
;兩位加法子程序,帶溢出處理
FADD: ;和運(yùn)算程序,加數(shù)高位地址入口R1,低位R0,被加數(shù)高位入口R3,低位R2,出口高位地址入口R1,低位R0
MOV A,@R0
CLR C
ADD A,R2 ;完成低8位加
MOV @R0,A
MOV A,@R1 ;和送低位和入口地址
JNB ACC.7,FADD1 ;判斷加數(shù)正負(fù)
MOV R7,#01H ;置負(fù)標(biāo)志
FADD1: ADDC A,R3 ;高8位加
MOV @R1,A ;和送高位和入口地址
JNB PSW.2,FADD2 ;判斷是否溢出并處理
CJNE R7,#01H,FADD3 ;判斷正負(fù)溢出
MOV R7,#00H ;清負(fù)標(biāo)志
MOV @R1,#80H ;正溢出給正最大值
MOV @R0,#00H
JMP FADD2
FADD3: MOV @R1,#7FH ;負(fù)溢出給正最小值
MOV @R0,#0FFH
FADD2: MOV R7,#00H ;清負(fù)標(biāo)志
RET
;**********************************************************OK
;鍵盤采樣與處理子程序 R4設(shè)定標(biāo)志
;**********************************************************OK
;__________________________________-
KEYP: SETB P1.7 ;延時(shí)
NOP
NOP
CLR P1.7
CLR RI
MOV SCON,#10H ;串行口工作與方式0
REP1: JNB RI,REP1
MOV A,SBUF
CJNE A,OLDKEY,NEXT ;判斷按鍵是否結(jié)束
LJMP BACK
NEXT: CJNE A,#0DFH,NEXT1 ;運(yùn)行鍵是否按下
MOV OLDKEY,A
;置運(yùn)行
SETB TR0
MOV R4,#00H
LJMP BACK2
NEXT1: CJNE A,#0FEH,NEXT2 ;設(shè)定鍵是否按下
MOV R4,#01H ;置設(shè)定標(biāo)志
CLR TR0
;關(guān)AD轉(zhuǎn)換
LJMP BACK
NEXT2: CJNE A,#0FDH,NEXT3 ;切換鍵是否按下
INC R0
INC R0
INC R0
CJNE R0,#39H,N1
MOV R0,#30H
N1: INC R2
CJNE R2,#03H,NN1
MOV R2,#00H
NN1:
LJMP BACK
NEXT3: CJNE R4,#00H,NEXT4 ;是否設(shè)定
LJMP BACK
NEXT4: CJNE A,#0FBH,NEXT5 ;位選鍵是否按下
INC R6
CJNE R6,#03H,N2
MOV R6,#00H
N2:
MOV OLDKEY,A
LJMP BACK1
NEXT5: CJNE A,#0F7H,NEXT6 ;上升鍵是否
INC @R1
CJNE @R1,#0AH,N3
MOV @R1,#00H
N3: LJMP BACK
NEXT6: CJNE A,#0EFH,BACK3 ;下降鍵是否按下
CJNE @R1,#00H,N4
MOV @R1,#0AH
N4: DEC @R1
BACK3: LJMP BACK
;_______----BACK2:PID參數(shù)轉(zhuǎn)換程序-------------------_______________
BACK2: ;P參數(shù)轉(zhuǎn)換
MOV A,PH
MOV B,#4
DIV AB
MOV R5,B
MOV B,#64H
MUL AB
MOV KP,A
MOV A,R5
MOV B,#0AH
MUL AB
ADD A,PM
MOV B,#4
DIV AB
MOV R5,B
MOV B,#0AH
MUL AB
ADD A,KP
MOV KP,A
MOV A,R5
MOV B,#0AH
MUL AB
ADD A,PL
MOV B,#4
DIV AB
ADD A,KP
MOV KP,A
;I參數(shù)轉(zhuǎn)換
MOV A,IH
MOV B,#4
DIV AB
MOV R5,B
MOV B,#64H
MUL AB
MOV KI,A
MOV A,R5
MOV B,#0AH
MUL AB
ADD A,IM
MOV B,#4
DIV AB
MOV R5,B
MOV B,#0AH
MUL AB
ADD A,KI
MOV KI,A
MOV A,R5
MOV B,#0AH
MUL AB
ADD A,IL
MOV B,#4
DIV AB
ADD A,KI
MOV KI,A
;D參數(shù)轉(zhuǎn)換
MOV A,DH
MOV B,#4
DIV AB
MOV R5,B
MOV B,#64H
MUL AB
MOV KD,A
MOV A,R5
MOV B,#0AH
MUL AB
ADD A,DM
MOV B,#4
DIV AB
MOV R5,B
MOV B,#0AH
MUL AB
ADD A,KD
MOV KD,A
MOV A,R5
MOV B,#0AH
MUL AB
ADD A,DL
MOV B,#4
DIV AB
ADD A,KD
MOV KD,A
JMP BACK1
BACK: MOV OLDKEY,A
BACK1: MOV A,R0
ADD A,R6
MOV R1,A
RET
;*************************************************************88
; 顯示程序 88
;*************************************************************88
DISP:
MOV DPTR,#TABLE
MOV A,R2
ADD A,#0AH
MOVC A,@A+DPTR
MOV P1,A
SETB P2.0
CALL DELAY
CLR P2.0
MOV A,#0DH
MOVC A,@A+DPTR
MOV P1,A
SETB P2.1
CALL DELAY
CLR P2.1
MOV A,@R0
MOVC A,@A+DPTR
MOV P1,A
SETB P2.2
CALL DELAY
CLR P2.2
INC R0
MOV A,@R0
MOVC A,@A+DPTR
MOV P1,A
SETB P2.3
CALL DELAY
CLR P2.3
INC R0
MOV A,@R0
MOVC A,@A+DPTR
MOV P1,A
SETB P2.4
CALL DELAY
CLR P2.4
DEC R0
DEC R0
RET
DELAY: MOV R7,#30h
LOOP: NOP
DJNZ R7,LOOP
RET
;;TT DB 0FCH,18H,(1MS) 0F8H, 30H,(2MS) 0f6h,3ch(2.5MS) 0F4H,48H, (3MS) 0F0H,60H,(4MS) 0ECH,78H, 0E0H,0BFH (10MS) 0D8H,0F0H ;采樣周期存儲區(qū)
TABLE: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH,73H,30H,5EH,40H ;分別為0 1 2 3 4 5 6 7 8 9 P I D - 的字形碼
END
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -