⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zhiliu.asm

📁 直流电机PID控制程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
                  
              MOV       DX,INTR_OCW1            ;恢复INTR原中断屏蔽寄存器的屏蔽字
              MOV       AL,IM_BAK
              OUT       DX,AL
            
              MOV       DI,0020H
              MOV       AX,IP_BAK1  ;恢复定时器0中断处理程序入口偏移地址
              MOV       ES:[DI],AX
              ADD       DI,2
              MOV       AX,CS_BAK1  ;恢复定时器0中断处理程序入口段地址
              MOV       ES:[DI],AX
        
              MOV       AL,IM_BAK1
              OUT       21H,AL      ;恢复屏蔽字
                
              STI
              MOV       AX,4C00H
              INT       21H


            
       MYISR  PROC      NEAR        ;系统总线INTR中断处理程序
              PUSH      AX
              PUSH      CX
              PUSH      DX
              MOV       AX,DATA
              MOV       DS,AX
          
              MOV       AL,MARK
              CMP       AL,01H
              JZ        IN1

              MOV       MARK,01H
              JMP       IN2

        IN1:  MOV       MARK,00H    ;计算转速
         VV:  MOV       DX,0000H
              MOV       AX,03E8H
              MOV       CX,VADD
              CMP       CX,0000H
              JZ        MM1
              DIV       CX
         MM:  MOV       ZV,AL
              MOV       VADD,0000H
        MM1:  MOV       AL,ZV
              MOV       ZVV,AL

        IN2:  MOV       DX,PCI_INTCSR           ;清PCI卡控制寄存器标志位
              SUB       DX,19H
              IN        AL,DX
              MOV       DX,PCI_INTCSR
              ADD       DX,2
              MOV       AX,003FH
              OUT       DX,AX
       
              MOV       DX,INTR_OCW2            ;向PC机内部8259发送中断结束命令
              MOV       AL,20H
              OUT       DX,AL
              MOV       AL,20H
              OUT       20H,AL
              POP       DX
              POP       CX
              POP       AX
              IRET
       MYISR  ENDP
                                 
    TIMERISR  PROC      NEAR        ;PC机定时器0中断处理程序
              PUSH      AX
              PUSH      CX
              PUSH      DX
              MOV       AX,DATA
              MOV       DS,AX

              INC       TC          ;采样周期变量加1
              CALL      KJ
              CLC
              CMP       MARK,01H
              JC        TT1

              INC       VADD
              CMP       VADD,0700H  ;转速值溢出,赋极值
              JC        TT1

              MOV       VADD,0700H
              MOV       MARK,00H
        TT1:  MOV       AL,20H      ;中断结束,发EOI命令
              OUT       20H,AL
              POP       DX
              POP       CX
              POP       AX
              IRET
    TIMERISR  ENDP

          KJ  PROC      NEAR        ;PWM子程序
              PUSH      AX
              CMP       FPWM,01H    ;PWM为1,产生PWM的高电平
              JNZ       TEST2
              CMP       VAA,00H
              JNZ       ANOT0

              MOV       FPWM,02H
              MOV       AL,BBB
              CLC
              RCR       AL,01H
              MOV       VBB,AL
              JMP       TEST2
      ANOT0:  DEC       VAA
              MOV       AL, 01H     ;PB0=1 电机转动
              MOV       DX, MY8255_B
              OUT       DX,AL

      TEST2:  CMP       FPWM,02H    ;PWM为2,产生PWM的低电平
              JNZ       OUTT
              CMP       VBB,00H
              JNZ       BNOT0
 
              MOV       FPWM,01H
              MOV       AL,AAAA
              CLC
              RCR       AL,01H
              MOV       VAA,AL
              JMP       OUTT

      BNOT0:  DEC       VBB
              MOV       AL,00H      ;PB0=0 电机停止
              MOV       DX,MY8255_B
              OUT       DX,AL

       OUTT:  POP       AX
              RET
          KJ  ENDP
      
        PID:  MOV       AX,SPEC     ;PID子程序
              SUB       AX,YK       ;求偏差EK
              MOV       R0,AX
              MOV       R1,AX
              SUB       AX,EK_1
              MOV       R2,AX
              SUB       AX,AEK_1    ;求BEK
              MOV       BEK,AX
              MOV       R8,AX
              MOV       AX,R1       ;求偏差变化量AEK
              MOV       EK_1,AX
              MOV       AX,R2
              MOV       AEK_1,AX
              TEST      R1,8000H
              JZ        EK1         ;若偏差EK为正数,则不需要求补码
              NEG       R1          ;若偏差EK为负数,则求偏差EK的补码
        EK1:  MOV       AX,R1       ;判断偏差EK是否在积分分离值的范围内
              SUB       AX,IBAND
              JC        II          ;在积分分离值范围内,则跳转到II,计算积分项
              MOV       R3,00H      ;若不在积分分离值范围内,则将积分项清0
              JMP       DDD         ;计算微分项
         II:  MOV       AL,TS       ;计算积分项,结果放在R3变量中(R3=EK*TS/KII)
              MOV       AH,00H      ;其中TS和KII均为正数,所以R3的正负由EK决定
              MOV       CX,R1
              MUL       CX
              MOV       CX,KII
              DIV       CX
              MOV       R3,AX
              TEST      R0,8000H    ;判断积分项的正负
              JZ        DDD         ;为正数,则跳转去计算微分项
              NEG       R3          ;为负数,则将积分项的结果求补码
        DDD:  TEST      BEK,8000H   ;判断BEK的正负
              JZ        DDD1        ;为正数,则BEK不变
              NEG       BEK         ;为负数,则求BEK的补码
       DDD1:  MOV       AX,BEK      ;计算微分项(R4=KDD*BEK/8TS)
              MOV       CX,KDD
              MUL       CX
              PUSH      AX
              PUSH      DX
              MOV       AL,TS
              MOV       AH,00H      ;将微分项缩小8倍,防止溢出
              MOV       CX,0008H
              MUL       CX
              MOV       CX,AX
              POP       DX
              POP       AX
              DIV       CX
              MOV       R4,AX
              TEST      R8,8000H    ;判断微分项的正负
              JZ        DD1         ;为正数,则结果不需要求补码
              NEG       R4          ;为负数,则微分项结果R4求补码
        DD1:  MOV       AX,R3       ;积分项和微分项相加,结果放在R5变量中
              ADD       AX,R4
              MOV       R5,AX
              JO        L9          ;判断溢出
         L2:  MOV       AX,R5
              ADD       AX,R2
              MOV       R6,AX       ;R6=R5+R2=积分项+微分项+AEK
              JO        L3
         L5:  MOV       AX,R6       ;计算KPP*R6
              MOV       CX,KPP
              IMUL      CX
              MOV       CX,1000H
              IDIV      CX
              MOV       CX,AX
              RCL       AH,01H      ;判断溢出,溢出赋极值
              PUSHF
              RCR       AL,01H
              POPF
              JC        LLL1
              CMP       CH,00H
              JZ        LLL2
              MOV       AL,7FH
              JMP       LLL2
       LLL1:  CMP       CH,0FFH
              JZ        LLL2
              MOV       AL,80H
       LLL2:  MOV       R7,AL       ;CK=CK_1+CK
              ADD       AL,CK_1
              JO        L8
        L18:  MOV       CK_1,AL
              ADD       AL,80H
              MOV       CK,AL
              RET
         L8:  TEST      R7,80H      ;CK溢出处理程序
              JNZ       L17
              MOV       AL,7FH      ;若为正溢出,则赋给正极值7FH
              JMP       L18
        L17:  MOV       AL,80H      ;若为负溢出,则赋给赋极值80H
              JMP       L18
         L9:  TEST      R3,8000H
              JNZ       L1
              MOV       R5,7FFFH    ;若为正溢出,则赋给正极值7FFFH
              JMP       L2
         L1:  MOV       R5,8000H    ;若为负溢出,则赋给负极值8000H
              JMP       L2
         L3:  TEST      R2,8000H
              JNZ       L4
              MOV       R6,7FFFH
              JMP       L5
         L4:  MOV       R6,8000H
              JMP       L5

     DECSHOW  PROC      NEAR        ;完成两位十进制数显示子程序
              MOV       DX,0
              MOV       BX,10       ;计算AX/10
              DIV       BX

              ADD       AL,30H      ;商+30H,即为十位数ASCII码
              MOV       AH,0EH
              INT       10H

              ADD       DL,30H      ;余+30H,即为个位数ASCII码
              MOV       AH,2
              INT       21H
              RET
     DECSHOW  ENDP

        CODE  ENDS
              END       START

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -