积分分离PID控制算法程序.docx

上传人:b****2 文档编号:11623553 上传时间:2023-06-01 格式:DOCX 页数:24 大小:22.12KB
下载 相关 举报
积分分离PID控制算法程序.docx_第1页
第1页 / 共24页
积分分离PID控制算法程序.docx_第2页
第2页 / 共24页
积分分离PID控制算法程序.docx_第3页
第3页 / 共24页
积分分离PID控制算法程序.docx_第4页
第4页 / 共24页
积分分离PID控制算法程序.docx_第5页
第5页 / 共24页
积分分离PID控制算法程序.docx_第6页
第6页 / 共24页
积分分离PID控制算法程序.docx_第7页
第7页 / 共24页
积分分离PID控制算法程序.docx_第8页
第8页 / 共24页
积分分离PID控制算法程序.docx_第9页
第9页 / 共24页
积分分离PID控制算法程序.docx_第10页
第10页 / 共24页
积分分离PID控制算法程序.docx_第11页
第11页 / 共24页
积分分离PID控制算法程序.docx_第12页
第12页 / 共24页
积分分离PID控制算法程序.docx_第13页
第13页 / 共24页
积分分离PID控制算法程序.docx_第14页
第14页 / 共24页
积分分离PID控制算法程序.docx_第15页
第15页 / 共24页
积分分离PID控制算法程序.docx_第16页
第16页 / 共24页
积分分离PID控制算法程序.docx_第17页
第17页 / 共24页
积分分离PID控制算法程序.docx_第18页
第18页 / 共24页
积分分离PID控制算法程序.docx_第19页
第19页 / 共24页
积分分离PID控制算法程序.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

积分分离PID控制算法程序.docx

《积分分离PID控制算法程序.docx》由会员分享,可在线阅读,更多相关《积分分离PID控制算法程序.docx(24页珍藏版)》请在冰点文库上搜索。

积分分离PID控制算法程序.docx

积分分离PID控制算法程序

积分分离PID控制算法程序

2007-01-0515:

23

;**********P10,积分分离PID控制算法程序 ********

;T、TD、TI、KP依次从30H,33H,36H,39H开始。

;A,B,C,A',的值依次存在BLOCK1,BLOCK2,BLOCK3 BLOCK4 的地址里

;这里B'与C值相同

; 这里R(k)给的是定值

ORG 0000H

E EQU 20H ; 一阈值

GK EQU 23H ;G(k)

GK1 EQU 26H ;G(k-1)

FK EQU 29H ;F(k)

FK1 EQU 2CH ;F(k-1)

BLOCK1 EQU 50H ;A

BLOCK2 EQU 53H ;B

BLOCK3 EQU 56H ;C

BLOCK4 EQU 5AH ;A'

UK EQU 5DH ;存放结果

BUFF EQU 43H ;暂存区

BUFF1 EQU 46H

BUFF2 EQU 49H

BUFFR0 EQU 4CH

REC EQU 63H ;采样次数

RK EQU 66H ;R(k)

CK EQU 69H ;采样数据始址

EK EQU 6CH ;存放偏差值E(k)的始址

EK1 EQU 70H ;存放E(k-1)的始址

TEST:

 MOV RK,#01H ;常数Rk 1.25的BCD码浮点数

MOV RK+1,#12H

MOV RK+2,#50H

; MOV E,#7EH ;设定一阈值0.001的BCD码浮点数

; MOV E+1,#10H

; MOV E+2,#00H

MOV E,#00H ;阈值为0.3

MOV E+1,#30H

MOV E+2,#00H

MOV 3CH,#01H ;常数1的BCD码浮点数

MOV 3DH,#10H

MOV 3EH,#00H

MOV 40H,#01H ;常数2的BCD码浮点数

MOV 41H,#20H

MOV 42H,#00H

MOV 30H,#01H ;T 2.34的BCD 码浮点数

MOV 31H,#23H

MOV 32H,#40H

MOV 33H,#01H ;Td 3.54的BCD码浮点数

MOV 34H,#35H

MOV 35H,#40H

MOV 36H,#01H ;Ti 1.12的BCD码浮点数

MOV 37H,#11H

MOV 38H,#20H

MOV 39H,#01H ;Kp 1.25的BCD码浮点数

MOV 3AH,#12H

MOV 3BH,#50H

MOV R0,#E ; 将其转换成二进制浮点操作数

LCALL BTOF

MOV R0,#RK

LCALL BTOF

MOV R0,#3CH

LCALL BTOF

MOV R0,#40H

LCALL BTOF

MOV R0,#39H

LCALL BTOF

MOV R0,#36H

LCALL BTOF ;将其转换成二进制浮点操作数

MOV R0,#33H ;指向BCD码浮点操作数Td

LCALL BTOF ;将其转换成二进制浮点操作数

MOV R0,#30H ;指向BCD码浮点操作数T

LCALL BTOF ;将其转换成二进制浮点操作数

MOV R1, #BUFFR0 ;保存30H中的值 即T值

LCALL FMOVR0

MOV R1, #36H ;计算A值(1+T/Ti+Td/T).Kp

LCALL FDIV

MOV R1,#3CH ;常数1

LCALL FADD

MOV R0,#33H ;保存33H中的值

MOV R1,#BUFF

LCALL FMOVR0

MOV R1,#BUFFR0

LCALL FDIV

MOV R1,#30H ;30H里存的是T/Ti+1

LCALL FADD

MOV R1,#39H

LCALL FMUL

MOV R1 ,#BLOCK1 ;将结果保存在BLOCK1中

LCALL FMOVR0

MOV R1,#BUFFR0 ;30H恢复原值

MOV R0,#30H

LCALL FMOV

MOV R1,#BUFF ;33H恢复原值

MOV R0,#33H

LCALL FMOV

MOV R0,#40H ;计算B的值Kp.(1+2.Td/T)

MOV R1,#33H

LCALL FMUL

MOV R1,#30H

LCALL FDIV

MOV R1,#3CH

LCALL FADD

MOV R1,#39H

LCALL FMUL

MOV R1,#BLOCK2 ;保存B值到BLOCK2中

LCALL FMOVR0

MOV R0,#39H ;计算C的值Kp.Td/T

MOV R1,#33H

LCALL FMUL

MOV R1,#30H

LCALL FDIV

MOV R1,#BLOCK3 ;保存C值到BLOCK3中

LCALL FMOVR0

MOV R0,#33H ;计算A',保存33H中的值

MOV R1,#BUFFR0

LCALL FMOVR0

MOV R1,#30H

LCALL FDIV

MOV R1,#3CH

LCALL FADD

MOV R1,#39H

LCALL FMUL

MOV R1,#BLOCK4 ;保存A'值到BLOCK4中

LCALL FMOVR0

MOV R1,#BUFFR0 ;恢复33H中的值

LCALL FMOV

MOV R0,#EK1 ;将EK1,FK1,GK1设初值0

LCALL FCLR

MOV R0,#FK1

LCALL FCLR

MOV R0,#GK1

LCALL FCLR

MOV REC,#04H ;设置采样次数

LOOP:

 MOV CK,#01H ;采样数据暂时给了一个定值

MOV CK+1,#10H

MOV CK+2,#00H

MOV R0,#CK

LCALL BTOF

MOV R0,#RK ;保存R(k)中的值

MOV R1,#BUFFR0

LCALL FMOVR0

MOV R1,#CK

LCALL FSUB ;计算R(k)-C(k)的值送给E(k)

MOV R1,#EK

LCALL FMOVR0

MOV R1,#BUFFR0

LCALL FMOV ;恢复R(K)的值,释放、BUFFR0

MOV R0,#BUFFR0 ;EK存到BUFFR0

MOV R1,#EK

LCALL FMOV

LCALL FABS ;求EK的绝对值

MOV R1,#E ;判断EK的绝对值与E的大小

LCALL FCMP

JC PID ;EK<=E时转PID控制程序否则PD程序

CJNE A,#00H,PD

LJMP PID

PD:

 MOV R0,#BLOCK4

MOV R1,#BUFFR0 ;保存A'的值

LCALL FMOVR0

MOV R1,#EK

LCALL FMUL

MOV R1,#FK1

LCALL FSUB

MOV R1,#UK ;结果存在UK中

LCALL FMOVR0

MOV R1,#BUFFR0 ;恢复A'

LCALL FMOV

MOV R0,#BLOCK3 ;计算B'.E(k)这里B'值与C值同

MOV R1,#BUFFR0 ;保存B'

LCALL FMOVR0

MOV R1,#EK

LCALL FMUL

MOV R1,#FK ;B'.EK存到FK中

LCALL FMOVR0

MOV R1,#BUFFR0 ;恢复B'

LCALL FMOV

LJMP OUT

PID:

 MOV R0,#BLOCK1 ;计算A.E(k)+G(K-1)

MOV R1,#BUFFR0 ;保存A

LCALL FMOVR0

MOV R1,#EK

LCALL FMUL

MOV R1,#GK1

LCALL FADD

MOV R1,#UK ;计算结果存入UK中

LCALL FMOVR0

MOV R1,#BUFFR0 ;恢复A值

LCALL FMOV

MOV R0,#BLOCK2 ;计算U(k)-B.E(k)+C.E(k-1)

MOV R1,#BUFFR0 ;保存B到BUFFR0

LCALL FMOVR0

MOV R1,#EK

LCALL FMUL

MOV R1,#BUFF ;B.E(k)保存到BUFF

LCALL FMOVR0

MOV R0,#UK

MOV R1,#BUFF1 ;UK保存到BUFF1

LCALL FMOVR0

MOV R1,#BUFF

LCALL FSUB

MOV R1,#BUFF ;U(k)-BE(k)保存到BUFF

LCALL FMOVR0

MOV R0,#BLOCK3 ;计算C.E(k-1)

MOV R1,#BUFF2 ;保存C到BUFF2

LCALL FMOVR0

MOV R1,#EK1

LCALL FMUL

MOV R1,#BUFF

LCALL FADD

MOV R1,#GK ;U(k)-BE(k)+CE(k-1)保存到GK

LCALL FMOVR0

MOV R1,#BUFF2 ;恢复C值释放BUFF2

LCALL FMOV

MOV R0,#UK ;恢复UK值释放BUFF1

MOV R1,#BUFF1

LCALL FMOV

MOV R0,#BLOCK2 ;恢复B

MOV R1,#BUFFR0

LCALL FMOV

OUT:

 MOV R0,#GK1 ;G(k)-->G(k-1)

MOV R1,#GK

LCALL FMOV

MOV R0,#FK1 ;F(k)-->F(K-1)

MOV R1,#FK

LCALL FMOV

MOV R0,#EK1 ;E(K)-->E(K-1)

MOV R1,#EK

LCALL FMOV

MOV R0,#UK ;UK转换成BCD码浮点数输出

LCALL FTOB

LCALL DELAY ;等待采样时刻

DJNZ REC,NEXT1

SJMP $

NEXT1:

 LJMP LOOP

DELAY:

 MOV R7,#02H

DELAY1:

 MOV R6,#0FFH

DELAY2:

 DJNZ R6,DELAY2

DJNZ R7,DELAY1

RET

; (1) 标号:

 FSDT 功能:

浮点数格式化

;入口条件:

待格式化浮点操作数在[R0]中。

;出口信息:

已格式化浮点操作数仍在[R0]中。

;影响资源:

PSW、A、R2、R3、R4、位1FH 堆栈需求:

 6字节

FSDT:

 LCALL MVR0 ;将待格式化操作数传送到第一工作区中

LCALL RLN ;通过左规完成格式化

LJMP MOV0 ;将已格式化浮点操作数传回到[R0]中

; (2) 标号:

 FADD 功能:

浮点数加法

;入口条件:

被加数在[R0]中,加数在[R1]中。

;出口信息:

OV=0时,和仍在[R0]中,OV=1时,溢出。

;;影响资源:

PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:

 6字节

FADD:

 CLR F0 ;设立加法标志

SJMP AS ;计算代数和

; (3) 标号:

 FSUB 功能:

浮点数减法

;入口条件:

被减数在[R0]中,减数在[R1]中。

;出口信息:

OV=0时,差仍在[R0]中,OV=1时,溢出。

;影响资源:

PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:

6字节

FSUB:

 SETB F0 ;设立减法标志

AS:

 LCALL MVR1 ;计算代数和。

先将[R1]传送到第二工作区

MOV C,F0 ;用加减标志来校正第二操作数的有效符号

CLR A ; ********?

应加的一条语句

RRC A

XRL A,@R1

MOV C,ACC.7

ASN:

 MOV 1EH,C ;将第二操作数的有效符号存入位1EH中

XRL A,@R0 ;与第一操作数的符号比较

RLC A

MOV F0,C ;保存比较结果

LCALL MVR0 ;将[R0]传送到第一工作区中

LCALL AS1 ;在工作寄存器中完成代数运算

MOV0:

 INC R0 ;将结果传回到[R0]中的子程序入口

INC R0

MOV A,R4 ;传回尾数的低字节

MOV @R0,A

DEC R0

MOV A,R3 ;传回尾数的高字节

MOV @R0,A

DEC R0

MOV A,R2 ;取结果的阶码

MOV C,1FH ;取结果的数符

MOV ACC.7,C ;拼入阶码中

MOV @R0,A

CLR ACC.7 ;不考虑数符

CLR OV ;清除溢出标志

CJNE A,#3FH,MV01;阶码是否上溢?

 ******** 应为#40H

SETB OV ;设立溢出标志

MV01:

 MOV A,@R0 ;取出带数符的阶码

RET

MVR0:

 MOV A,@R0 ;将[R0]传送到第一工作区中的子程序

MOV C,ACC.7 ;将数符保存在位1FH中

MOV 1FH,C

MOV C,ACC.6 ;将阶码扩充为8bit补码

MOV ACC.7,C

MOV R2,A ;存放在R2中

INC R0

MOV A,@R0 ;将尾数高字节存放在R3中

MOV R3,A ;

INC R0

MOV A,@R0 ;将尾数低字节存放在R4中

MOV R4,A

DEC R0 ;恢复数据指针

DEC R0

RET

MVR1:

 MOV A,@R1 ;将[R1]传送到第二工作区中的子程序

MOV C,ACC.7 ;将数符保存在位1EH中

MOV 1EH,C

MOV C,ACC.6 ;将阶码扩充为8bit补码

MOV ACC.7,C

MOV R5,A ;存放在R5中

INC R1

MOV A,@R1 ;将尾数高字节存放在R6中

MOV R6,A

INC R1

MOV A,@R1 ;将尾数低字节存放在R7中

MOV R7,A

DEC R1 ;恢复数据指针

DEC R1

RET

AS1:

 MOV A,R6 ;读取第二操作数尾数高字节

ORL A,R7

JZ AS2 ;第二操作数为零,不必运算

MOV A,R3 ;读取第一操作数尾数高字节

ORL A,R4

JNZ EQ

MOV A,R6 ;第一操作数为零,结果以第二操作数为准

MOV R3,A

MOV A,R7

MOV R4,A

MOV A,R5

MOV R2,A

MOV C,1EH

MOV 1FH,C

AS2:

 RET

EQ:

 MOV A,R2 ;对阶,比较两个操作数的阶码

XRL A,R5

JZ AS4 ;阶码相同,对阶结束

JB ACC.7,EQ3;阶符互异

MOV A,R2 ;阶符相同,比较大小

CLR C

SUBB A,R5

JC EQ4

EQ2:

 CLR C ;第二操作数右规一次

MOV A,R6 ;尾数缩小一半

RRC A

MOV R6,A

MOV A,R7

RRC A

MOV R7,A

INC R5 ;阶码加一

ORL A,R6 ;尾数为零否?

JNZ EQ ;尾数不为零,继续对阶

MOV A,R2 ;尾数为零,提前结束对阶

MOV R5,A

SJMP AS4

EQ3:

 MOV A,R2 ;判断第一操作数阶符

JNB ACC.7,EQ2;如为正,右规第二操作数

EQ4:

 CLR C

LCALL RR1 ;第一操作数右规一次

ORL A,R3 ;尾数为零否?

JNZ EQ ;不为零,继续对阶

MOV A,R5 ;尾数为零,提前结束对阶

MOV R2,A

AS4:

 JB F0,AS5 ;尾数加减判断

MOV A,R4 ;尾数相加

ADD A,R7

MOV R4,A

MOV A,R3

ADDC A,R6

MOV R3,A

JNC AS2

LJMP RR1 ;有进位,右规一次

AS5:

 CLR C ;比较绝对值大小

MOV A,R4

SUBB A,R7

MOV B,A

MOV A,R3

SUBB A,R6

JC AS6

MOV R4,B ;第一尾数减第二尾数

MOV R3,A

LJMP RLN ;结果规格化

AS6:

 CPL 1FH ;结果的符号与第一操作数相反

CLR C ;结果的绝对值为第二尾数减第一尾数

MOV A,R7

SUBB A,R4

MOV R4,A

MOV A,R6

SUBB A,R3

MOV R3,A

RLN:

 MOV A,R3 ;浮点数规格化

ORL A,R4 ;尾数为零否?

JNZ RLN1

MOV R2,#0C1H;阶码取最小值 ******?

应为#C0H

RET

RLN1:

 MOV A,R3

JB ACC.7,RLN2;尾数最高位为一否?

CLR C ;不为一,左规一次

LCALL RL1

SJMP RLN ;继续判断

RLN2:

 CLR OV ;规格化结束

RET

RL1:

 MOV A,R4 ;第一操作数左规一次

RLC A ;尾数扩大一倍

MOV R4,A

MOV A,R3

RLC A

MOV R3,A

DEC R2 ;阶码减一

CJNE R2,#0C0H,RL1E;阶码下溢否?

 ***** 应改为CJNE R2,#0BFH,RL1E;

CLR A

MOV R3,A ;阶码下溢,操作数以零计

MOV R4,A

MOV R2,#0C1H ; ******应改为MOV R2,#0C0H

RL1E:

 CLR OV

RET

RR1:

 MOV A,R3 ;第一操作数右规一次

RRC A ;尾数缩小一半

MOV R3,A

MOV A,R4

RRC A

MOV R4,A

INC R2 ;阶码加一

CLR OV ;清溢出标志

CJNE R2,#40H,RR1E;阶码上溢否?

MOV R2,#3FH ;阶码溢出

SETB OV

RR1E:

 RET

; (4) 标号:

 FMUL 功能:

浮点数乘法

;入口条件:

被乘数在[R0]中,乘数在[R1]中。

;出口信息:

OV=0时,积仍在[R0]中,OV=1时,溢出。

;影响资源:

PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:

6字节

FMUL:

 LCALL MVR0 ;将[R0]传送到第一工作区中

MOV A,@R0

XRL A,@R1 ;比较两个操作数的符号

RLC A

MOV 1FH,C ;保存积的符号

LCALL MUL0 ;计算积的绝对值

LJMP MOV0 ;将结果传回到[R0]中

MUL0:

 LCALL MVR1 ;将[R1]传送到第二工作区中

MUL1:

 MOV A,R3 ;第一尾数为零否?

ORL A,R4

JZ MUL6

MOV A,R6 ;第二尾数为零否?

ORL A,R7

JZ MUL5

MOV A,R7 ;计算R3R4×R6R7-→R3R4

MOV B,R4

MUL AB

MOV A,B

XCH A,R7

MOV B,R3

MUL AB

ADD A,R7

MOV R7,A

CLR A

ADDC A,B

XCH A,R4

MOV B,R6

MUL AB

ADD A,R7

MOV R7,A

MOV A,B

ADDC A,R4

MOV R4,A

CLR A

RLC A

XCH A,R3

MOV B,R6

MUL AB

ADD A,R4

MOV R4,A

MOV A,B

ADDC A,R3

MOV R3,A

JB ACC.7,MUL2;积为规格化数否?

 R7四舍五入

MOV A,R7 ;左规一次

RLC A

MOV R7,A

LCALL RL1

MUL2:

 MOV A,R7

JNB ACC.7,MUL3

INC R4

MOV A,R4

JNZ MUL3

INC R3

MOV A,R3

JNZ MUL3

MOV R3,#80H

INC R2

MUL3:

 MOV A,R2 ;求积的阶码

ADD A,R5

MD:

 MOV R2,A ;阶码溢出判断

JB ACC.7,MUL4

JNB ACC.6,MUL6

MOV R2,#3FH ;阶码上溢,设立标志

SETB OV

RET

MUL4:

 JB ACC.6,MUL6

MUL5:

 CLR A ;结果清零(因子为零或阶码下溢)

MOV R3,A

MOV R4,A

MOV R2,#41H

MUL6:

 CLR OV

RET

; (5) 标号:

 FDIV 功能:

浮点数除法

;入口条件:

被除数在[R0]中,除数在[R1]中。

;出口信息:

OV=0时,商仍在[R0]中,OV=1时,溢出。

;影响资源:

PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:

 5字节

FDIV:

 INC R0

MOV A,@R0

INC R0

ORL A,@R0

DEC R0

DEC R0

JNZ DIV1

MOV @R0,#41H;被除数为零,不必运算

CLR OV

RET

DIV1:

 INC R1

MOV A,@R1

INC R1

ORL A,@R1

DEC R1

DEC R1

JNZ DIV2

SETB OV ;除数为零,溢出

RET

DIV2:

 LCALL MVR0 ;将[R0]传送到第一工作区中

MOV A,@R0

XRL A,@R1 ;比较两个操作数的符号

RLC A

MOV 1FH,C ;保存结果的符号

LCALL MVR1 ;将[R1]传送到第二工作区中

LCALL DIV3 ;调用工作区浮点除法

LJMP MOV0 ;回传结果

DIV3:

 CLR C ;比较尾数的大小

MOV A,R4

SUBB A,R7

MOV A,R3

SUBB A,R6

JC DIV4

LCALL RR1 ;被除数右规一次

SJMP DIV3

DIV4:

 CLR A ;借用R0R1R2作工作寄存器

XCH A,R0 ;清零并保护之

PUSH ACC

CLR A

XCH A,R1

PUSH ACC

MOV A,R2

PUSH ACC

MOV B,#10H ;除法运算,R3R4/R6R7-→R0R1

DIV5:

 CLR C

MOV A,R1

RLC A

MOV R1,A

MOV A,R0

RLC A

MOV R0,A

MOV A,R4

RLC A

MOV R4,A

XCH A,R3

RLC A

XCH A,R3

MOV F0,C

CLR C

SUBB A,R7

MOV R2,A

MOV A,R3

SUBB A,R6

ANL C,/F0

JC DIV6

MOV R3,A

MOV A,R2

MOV R4,A

INC R1

DIV6:

 DJNZ B,DIV5

MOV A,R6 ;四舍五入

CLR C

RRC A

SUBB A,R3

CLR A

ADDC A,R1 ;将结果存回R3R4

MOV R4,A

CLR A

ADDC A,R0

MOV R3,A

POP ACC ;恢复R0R1R2

MOV R2,A

POP ACC

MOV R1,A

POP ACC

MOV R0,A

MOV A,R2 ;计算商的阶码

CLR C

SUBB A,R5

LCALL MD ;阶码检验

LJMP RLN ;规格化

; (6) 标号:

 FCLR 功能:

浮点数清零

;入口

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2