积分分离PID控制算法程序

  • 格式:doc
  • 大小:46.00 KB
  • 文档页数:28

希望对大家有所帮助,多谢您的浏览!

1 / 28 积分分离PID控制算法程序

2007-01-05 15:23

希望对大家有所帮助,多谢您的浏览!

2 / 28 ;**********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 码浮点数 希望对大家有所帮助,多谢您的浏览!

3 / 28 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 希望对大家有所帮助,多谢您的浏览!

4 / 28 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 ;设置采样次数 希望对大家有所帮助,多谢您的浏览!

5 / 28 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 希望对大家有所帮助,多谢您的浏览!

6 / 28 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