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

📄 zhiliu.asm

📁 直流电机PID控制程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;Zhiliu.asm
;直流电机闭环调速实验
    
;***************根据CHECK配置信息修改下列符号值*******************
  INTR_IVADD  EQU       01CCH       ;INTR对应的中断矢量地址
   INTR_OCW1  EQU       0A1H        ;INTR对应PC机内部8259的OCW1地址
   INTR_OCW2  EQU       0A0H        ;INTR对应PC机内部8259的OCW2地址
     INTR_IM  EQU       0F7H        ;INTR对应的中断屏蔽字
  PCI_INTCSR  EQU       9438H       ;PCI卡中断控制寄存器地址
        IOY0  EQU       9C00H       ;片选IOY0对应的端口始地址
;*****************************************************************
    MY8255_A  EQU       IOY0+00H*4  ;8255的A口地址
    MY8255_B  EQU       IOY0+01H*4  ;8255的B口地址
    MY8255_C  EQU       IOY0+02H*4  ;8255的C口地址
 MY8255_MODE  EQU       IOY0+03H*4  ;8255的控制寄存器地址

           PC8254_COUNT0  EQU       40H         ;PC机内8254定时器0端口地址
 PC8254_MODE  EQU       43H         ;PC机内8254控制寄存器端口地址

      STACK1  SEGMENT   STACK
              DW        64 DUP(?)
         TOP  LABEL     WORD
      STACK1  ENDS

        DATA  SEGMENT
      TABLE1  DB        'Assumed Fan Speed:(/s)',0AH,0DH,'$'            ;字符串变量
      TABLE2  DB        'Current Fan Speed:(/s)',0AH,0DH,'$'            ;字符串变量
         ENT  DB        0AH,0DH,'$' ;换行,回车
      CS_BAK  DW        ?           ;保存INTR原中断处理程序入口段地址的变量
      IP_BAK  DW        ?           ;保存INTR原中断处理程序入口偏移地址的变量
      IM_BAK  DB        ?           ;保存INTR原中断屏蔽字的变量
     CS_BAK1  DW        ?           ;保存定时器0中断处理程序入口段地址的变量
     IP_BAK1  DW        ?           ;保存定时器0中断处理程序入口偏移地址的变量
     IM_BAK1  DB        ?           ;保存定时器0中断屏蔽字的变量
      
          TS  DB        14H         ;采样周期
        SPEC  DW        ?           ;转速给定值
       IBAND  DW        0060H       ;积分分离值
         KPP  DW        1060H       ;比例系数
         KII  DW        0010H       ;积分系数
         KDD  DW        0020H       ;微分系数

          YK  DW        ?
          CK  DB        ?
        VADD  DW        ?
          ZV  DB        ?
         ZVV  DB        ?
          TC  DB        ?
        FPWM  DB        ?
        CK_1  DB        ?
        EK_1  DW        ?
       AEK_1  DW        ?
         BEK  DW        ?
        AAAA  DB        ?
         VAA  DB        ?
         BBB  DB        ?
         VBB  DB        ?
        MARK  DB        ?
          R0  DW        ?
          R1  DW        ?
          R2  DW        ?
          R3  DW        ?
          R4  DW        ?
          R5  DW        ?
          R6  DW        ?
          R7  DB        ?
          R8  DW        ?
        DATA  ENDS

        CODE  SEGMENT
              ASSUME    CS:CODE,DS:DATA

      START:  MOV       AX,DATA
              MOV       DS,AX

              MOV       DX,OFFSET TABLE1        ;显示字符串1
              MOV       AH,09H
              INT       21H


              MOV       AH,01H
              INT       21H
              MOV       BL,10H
              MUL       BL
              MOV       BX,AX
              MOV       AH,01
              INT       21
              AND       AH,00H
              ADD       AX,BX
              MOV       SPEC,AX









             ; MOV       AX,SPEC     ;显示给定值
              CALL      DECSHOW
              MOV       DX,OFFSET ENT           ;回车,换行
              MOV       AH,09H
              INT       21H
              MOV       DX,OFFSET TABLE2        ;显示字符串2
              MOV       AH,09H
              INT       21H

              CLI
              MOV       AX,0000H
              MOV       ES,AX

              MOV       DI,0020H
              MOV       AX,ES:[DI]
              MOV       IP_BAK1,AX  ;保存定时器0中断处理程序入口偏移地址
              MOV       AX,OFFSET TIMERISR
              MOV       ES:[DI],AX  ;设置实验定时中断处理程序入口偏移地址
              ADD       DI,2
              MOV       AX,ES:[DI]
              MOV       CS_BAK1,AX  ;保存定时器0中断处理程序入口段地址
              MOV       AX,SEG TIMERISR
              MOV       ES:[DI],AX  ;设置实验定时中断处理程序入口段地址       ..........................................

              IN        AL,21H      ;??????????????????????????????????????????????????????????????????????????????? 系统中断的地址?
              MOV       IM_BAK1,AL  ;保存INTR原中断屏蔽字
              AND       AL,0F7H
              OUT       21H,AL      ;打开定时器0中断屏蔽位
                
              MOV       DX,PCI_INTCSR           ;初始化PCI卡中断控制寄存器
              MOV       AX,1F00H    ;向PCI_INTCSR中写入003F1F00H
              OUT       DX,AX
              ADD       DX,2
              MOV       AX,003FH
              OUT       DX,AX

              MOV       DI,INTR_IVADD
              MOV       AX,ES:[DI]
              MOV       IP_BAK,AX   ;保存INTR原中断处理程序入口偏移地址
              MOV       AX,OFFSET MYISR
              MOV       ES:[DI],AX  ;设置当前中断处理程序入口偏移地址
              ADD       DI,2
              MOV       AX,ES:[DI]
              MOV       CS_BAK,AX   ;保存INTR原中断处理程序入口段地址
              MOV       AX,SEG MYISR
              MOV       ES:[DI],AX  ;设置当前中断处理程序入口段地址
          
              MOV       DX,INTR_OCW1
              IN        AL,DX
              MOV       IM_BAK,AL   ;保存INTR原中断屏蔽字
              AND       AL,INTR_IM
              OUT       DX,AL       ;打开INTR的中断屏蔽位
                             
               
              MOV       VADD,0000H  ;变量的初始化
              MOV       ZV,00H
              MOV       ZVV,00H
              MOV       CK,00H
              MOV       YK,0000H
              MOV       CK_1,00H
              MOV       EK_1,0000H
              MOV       AEK_1,0000H
              MOV       BEK,0000H
              MOV       BBB,00H
              MOV       VBB,00H
              MOV       R0,0000H
              MOV       R1,0000H
              MOV       R2,0000H
              MOV       R3,0000H
              MOV       R4,0000H
              MOV       R5,0000H
              MOV       R6,0000H
              MOV       R7,00H
              MOV       R8,0000H
              MOV       MARK,00H
              MOV       FPWM,01H
              MOV       AAAA,7FH
              MOV       VAA,7FH
              MOV       TC,00H

              MOV       AL,80H      ;初始化8255
              MOV       DX,MY8255_MODE
              OUT       DX,AL
              MOV       AL,00H
              MOV       DX,MY8255_B
              OUT       DX,AL

              MOV       DX,PC8254_MODE          ;初始化PC机定时器0,定时1ms
              MOV       AL,36H
              OUT       DX,AL
              MOV       DX,PC8254_COUNT0
              MOV       AL,8FH
              OUT       DX,AL
              MOV       AL,04H
              OUT       DX,AL

              STI

         M1:  MOV       AL,TS       ;判断采样周期到否?
              SUB       AL,TC
              JNC       M1          ;没到则继续等待

              MOV       TC,00H      ;采样周期到,将采样周期变量清0
              MOV       AL,ZVV
              MOV       AH,00H
              MOV       YK,AX       ;得到反馈量YK
              CALL      PID         ;调用PID子程序,得到控制量CK
              MOV       AL,CK       ;把控制量转化成PWM输出
              SUB       AL,80H
              JC        IS0
              MOV       AAAA,AL
              JMP       COU
        IS0:  MOV       AL,10H      ;电机的启动值不能低于10H
              MOV       AAAA,AL
        COU:  MOV       AL,7FH
              SUB       AL,AAAA
              MOV       BBB,AL

              MOV       AX,YK       ;将反馈值YK送到屏幕显示
              CALL      DECSHOW

              MOV       DL,0DH      ;回车
              MOV       AH,02H
              INT       21H
                
              MOV       AH,1        ;判断是否有按键按下
              INT       16H
              JZ        M1          ;无按键则跳回继续等待,有则退出

       EXIT:  CLI
              MOV       AL,00H      ;退出时停止电机运转
              MOV       DX,MY8255_B
              OUT       DX,AL

              MOV       DX,PC8254_MODE          ;恢复PC机定时器0状态
              MOV       AL,36H
              OUT       DX,AL
              MOV       DX,PC8254_COUNT0
              MOV       AL,00H
              OUT       DX,AL
              MOV       AL,00H
              OUT       DX,AL
               
              MOV       DX,PCI_INTCSR           ;恢复PCI卡中断控制寄存器
              MOV       AX,0000H
              OUT       DX,AX

              MOV       AX,0000H    ;恢复INTR原中断矢量
              MOV       ES,AX
              MOV       DI,INTR_IVADD
              MOV       AX,IP_BAK   ;恢复INTR原中断处理程序入口偏移地址
              MOV       ES:[DI],AX
              ADD       DI,2
              MOV       AX,CS_BAK   ;恢复INTR原中断处理程序入口段地址
              MOV       ES:[DI],AX

⌨️ 快捷键说明

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