登录
首页 单片机论坛
回帖 发帖
正文

主题:[求助]增量式PID算法的汇编程序

点击:6972 回复:9

求哪位大虾帮我贴上来吧,谢谢。
05-06-05 23:38
PID:  MOV R5,#00H     ;[PID算法子程序]
      MOV R4,2DH                  ;取Nx值
      MOV R3,#00H
      MOV R2,#28H                 ;取40度值
      LCALL CPL1
      LCALL DSUM                  ;求(Nx-28H)的值
      MOV R0,#5AH                 ;赋乘法运算暂存单元地址首址
      MOV R5,#05H
      MOV R4,#1CH                 ;赋参数(5.12)
      LCALL MULT                  ;调无符号数乘法
      MOV 31H,5BH
      MOV 32H,5AH                 ;存放结果的有效值
      MOV R5,31H
      MOV R4,32H              ;取双字节的Ur(设定值)
      MOV R3,2AH
      MOV R2,#00H             ;取双字节的Ui(k)(实测值)
      ACALL CPL1              ;取Ui(k)的补码
      ACALL DSUM              ;计算E(k)
      MOV 39H,R7
      MOV 3AH,R6              ;存E(K)
      MOV R5,35H
      MOV R4,36H              ;取KI参数
      MOV R0,#4AH
      ACALL MULT1             ;计算PI=KI*E(K)
      MOV R5,39H
      MOV R4,3AH              ;取E(K)
      MOV R3,3BH
      MOV R2,3CH              ;取E(K-1)
      ACALL CPL1
      ACALL DSUB              ;求E(K)-E(K-1)
      MOV R5,33H
      MOV R4,34H               ;取Kp参数
      MOV R0,#46H
      ACALL MULT1             ;求Kp*[E(K)-E(K-1)]
      MOV R5,49H
      MOV R4,48H
      MOV R3,4DH
      MOV R2,4CH
      ACALL DSUM              ;求Kp*[E(K)-E(K-1)]+KI*E(K)
      MOV 4AH,R7
      MOV 4BH,R6              ;保存上式之和
      MOV R5,39H
      MOV R4,3AH              ;取E(K)
      MOV R3,3DH
      MOV R2,3EH              ;取E(K-2)
      ACALL DSUM              ;计算E(K)+E(K-2)
      MOV A,R7
      MOV R5,A
      MOV A,R6
      MOV R4,A
      MOV R3,3BH
      MOV R2,3CH              ;取E(k-1)
      ACALL CPL1
      ACALL DSUM              ;求出E(K)+E(K-2)-2*E(K-1)
      MOV A,R7
      MOV R5,A
      MOV A,R6
      MOV R4,A
      MOV R3,3BH
      MOV R2,3CH
      ACALL CPL1
      ACALL DSUM
      MOV R5,37H
      MOV R4,38H        ;取Kd参数
      MOV R0,#46H
      ACALL MULT1       ;求出Pd=Kd*[E(K)+E(K-2)-2*E(K-1)]
      MOV R5,49H
      MOV R4,48H        ;取Pd
      MOV R3,4AH    
      MOV R2,4BH        ;取Kp*[E(K)-E(K-1)]+KI*E(K)
      ACALL DSUM        ;计算Pd+PI
      MOV A,R7
      MOV R3,A
      MOV A,R6          ;取Pd+PI
      MOV R2,A
      MOV R5,2FH
      MOV R4,30H        ;取P(k-1)
      ACALL DSUM        ;求P(K)=Pd+Pp+P(K-1)
      MOV 2FH,R7
      MOV 30H,R6        ;存P(k)到P(k-1)
      MOV 29H,2FH
      MOV 3DH,3BH
      MOV 3EH,3CH       ;存E(K-1)到E(K-2)
      MOV 3BH,39H
      MOV 3CH,3AH       ;存E(K)到E(k-1)
      MOV A,31H        ;取设定值
      CJNE A,2AH,AA2  ;比较设定值与实测值
  AA3: CLR 20H         ;清电炉标志
  AA1:  RET
  AA2:   JNC AA3
SETB 20H                ;清风扇标志位
MOV R3,39H
MOV R2,3AH
LCALL CPL1
MOV A,R3
MOV R7,A
MOV A,R2
MOV R6,A
      MOV R5,42H
      MOV R4,43H       ;取K(风扇)参数
      MOV R0,#5AH
      ACALL MULI1      ; 计算P`=K*E(K),且结果防在51H,50H单元中
      MOV 28H,5BH     ;取8位有效值,放到28H单元中
      AJMP AA1
06-10-18 15:04
这个是温控系统中的一段
后面的什么电炉电扇就别管了
06-10-18 15:06
这是pid中调用的几个子程序!
;**********************************************************
DSUM:  MOV A,R4   ;[双字节加法子程序]:(R5R4)+(R3R2)-->(R7R6)        ADD A,R2
      MOV R6,A
      MOV A,R5
      ADDC A,R3
      MOV R7,A
      RET
;**********************************************************
CPL1:   MOV A,R2    ;[双字节求补子程序]:(R3R2)求补
      CPL A
      ADD A,#01H
      MOV R2,A    
      MOV A,R3
      CPL A
      ADDC A,#00H
      MOV R3,A
      RET
;**********************************************************
MULT1:  MOV A,R7    ;[双字节有符号数乘法]:被乘数(R7R6),乘数(R5R4)          RLC A
        MOV 5CH,C   ;被乘数符号C1-->5CH位
        JNC POS1    ;为正数则转
        MOV A,R6    ;为负数则求补
        CPL A
        ADD A,#01H
        MOV R6,A
        MOV A,R7
        CPL A
        ADDC A,#00H
        MOV R7,A
POS1: MOV A,R5      ;取乘数
      RLC A        ;乘数符号C2-->5DH位
      MOV 5DH,C
      JNC POS2     ;为整数则转
      MOV A,R4
      CPL A
      ADD A,#01H
      MOV R4,A
      MOV A,R5
      CPL A
      ADDC A,#00H
      MOV R5,A
POS2: ACALL MULT     ;调双字节无符号数乘法子程序
      MOV C,5CH
      ANL C,5DH
      JC TPL        ;负负相乘则转
      MOV C,5CH
      ORL C,5DH
      JNC TPL       ;正正相乘则转
      DEC R0
      MOV A,@R0
      CPL A
      ADD A,#01H
      MOV @R0,A
      INC R0
      MOV A,@R0
      CPL A
      ADDC A,#00H
      MOV @R0,A
TPL:  RET
;**********************************************************
MULT:   MOV A,R6
      MOV B,R4     ;取低位相乘
      MUL AB
      MOV @R0,A
      MOV R3,B
      MOV A,R4
      MOV B,R7
      MUL AB
      ADD A,R3
      MOV R3,A
      MOV A,B
      ADDC A,#00H
      MOV R2,AMOV A,R6
      MOV B,R5
      MUL AB
      ADD A,R3
      INC R0
      MOV @R0,A
      CLR 5BH
      MOV A,R2
      ADDC A,B
      MOV R2,A
      JNC LAST
      SETB 5BH    ;置进位标志
LAST: MOV A,R7
      MOV B,R5
      MUL AB
      ADD A,R2
      INC R0
      MOV @R0,A   ;存积的第二字节
      MOV A,B
      ADDC A,#00H
      MOV C,5BH
      ADDC A,#00H
      INC R0      
MOV @R0,A            
      RET
      END
06-10-18 15:08
再给你算法的式子
那一串东西就是按这个编的
06-10-18 15:19
5楼
该帖内容不符合相关规定!
06-10-18 15:34

引用 louisignal 在 2006-10-18 15:19:00 发言【内容省略】

对老兄顶礼膜拜中,不过式子还没有上来哟!!!
06-10-22 12:20
up
06-10-24 11:10
好贴当然顶!
谢谢共享表情
07-04-08 20:05
请问,程序中Nx和40度值具体指什么?
07-06-14 16:53

工控新闻

更多新闻资讯