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

📄 main.plm

📁 说明:采用与C极其类似的PL/M-96语言编写。 单片机采用Intel的96系列KB; 开发环境为Wave6000; 该程序的功能为采用模糊滑膜变结构 控制算法
💻 PLM
📖 第 1 页 / 共 3 页
字号:
         HSO_COMMAND=01H;
         HSO_TIME=TIMER1+TURNOFF;
         R0=0;
         R0=0;
         HSO_COMMAND=02H;
         HSO_TIME=TIMER1+04H;
         R0=0;
         R0=0;
       END;
       T83:DO;
         HSO_COMMAND=21H;
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=02H;
         HSO_TIME=TIMER1+TURNOFF;
         R0=0;
         R0=0;
         HSO_COMMAND=03H;
         HSO_TIME=TIMER1+04H;
         R0=0;
         R0=0;
       END;
      END;
    END;
    ELSE IF AIM_SPD>=400 THEN DO;
      TURNON=T_SPAN/3;
      TURNOFF=T_SPAN/3;
      DO CASE ORDER;
       T70:DO;
         HSO_COMMAND=22H;
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=03H;
         HSO_TIME=TIMER1+TURNOFF;
         R0=0;
         R0=0;
         HSO_COMMAND=00H;
         HSO_TIME=TIMER1+04H;
         R0=0;
         R0=0;
       END;
       T71:DO;
         HSO_COMMAND=23H;
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=00H;
         HSO_TIME=TIMER1+TURNOFF;
         R0=0;
         R0=0;
         HSO_COMMAND=01H;
         HSO_TIME=TIMER1+04H;
         R0=0;
         R0=0;
       END;
       T72:DO;
         HSO_COMMAND=20H;
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=01H;
         HSO_TIME=TIMER1+TURNOFF;
         R0=0;
         R0=0;
         HSO_COMMAND=02H;
         HSO_TIME=TIMER1+04H;
         R0=0;
         R0=0;
       END;
       T73:DO;
         HSO_COMMAND=21H;
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=02H;
         HSO_TIME=TIMER1+TURNOFF;
         R0=0;
         R0=0;
         HSO_COMMAND=03H;
         HSO_TIME=TIMER1+04H;
         R0=0;
         R0=0;
       END;
      END;
    END;
    ELSE IF AIM_SPD>=200 THEN DO;
      TURNON=T_SPAN*3/5;
      TURNOFF=T_SPAN/3;
      DO CASE ORDER;
       T60:DO;
         HSO_COMMAND=22H;
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=03H;
         HSO_TIME=TIMER1+TURNOFF;
         R0=0;
         R0=0;
         HSO_COMMAND=00H;
         HSO_TIME=TIMER1+04H;
         R0=0;
         R0=0;
       END;
       T61:DO;
         HSO_COMMAND=23H;
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=00H;
         HSO_TIME=TIMER1+TURNOFF;
         R0=0;
         R0=0;
         HSO_COMMAND=01H;
         HSO_TIME=TIMER1+04H;
         R0=0;
         R0=0;

       END;
       T62:DO;
         HSO_COMMAND=20H;
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=01H;
         HSO_TIME=TIMER1+TURNOFF;
         R0=0;
         R0=0;
         HSO_COMMAND=02H;
         HSO_TIME=TIMER1+04H;
         R0=0;
         R0=0;

       END;
       T63:DO;
         HSO_COMMAND=21H;
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=02H;
         HSO_TIME=TIMER1+TURNOFF;
         R0=0;
         R0=0;
         HSO_COMMAND=03H;
         HSO_TIME=TIMER1+04H;
         R0=0;
         R0=0;

       END;
      END;
    END;
    ELSE  DO;
      TURNON=T_SPAN*4/5;
      TURNOFF=T_SPAN/5;
      DO CASE ORDER;
       T55:DO;
         HSO_COMMAND=22H;
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=03H;
         HSO_TIME=TIMER1+TURNOFF;
         R0=0;
         R0=0;
         HSO_COMMAND=00H;
         HSO_TIME=TIMER1+04H;
         R0=0;
         R0=0;
       END;
       T56:DO;
         HSO_COMMAND=23H;
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=00H;
         HSO_TIME=TIMER1+TURNOFF;
         R0=0;
         R0=0;
         HSO_COMMAND=01H;
         HSO_TIME=TIMER1+04H;
         R0=0;
         R0=0;

       END;
       T57:DO;
         HSO_COMMAND=20H;
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=01H;
         HSO_TIME=TIMER1+TURNOFF;
         R0=0;
         R0=0;
         HSO_COMMAND=02H;
         HSO_TIME=TIMER1+04H;
         R0=0;
         R0=0;

       END;
       T58:DO;
         HSO_COMMAND=21H;
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=02H;
         HSO_TIME=TIMER1+TURNOFF;
         R0=0;
         R0=0;
         HSO_COMMAND=03H;
         HSO_TIME=TIMER1+04H;
         R0=0;
         R0=0;
       END;
      END;
    END;
  END;
  ENABLE;
END HSO_PROCESS;

T1_INT:PROCEDURE INTERRUPT 0;
  T1OVER=T1OVER+1;
  IF T1OVER>50000 THEN T1OVER=0;
END T1_INT;

STOP:PROCEDURE;
DISABLE;
  IF T1OVER>5 THEN DO;
     HSO_COMMAND=06H;
     HSO_TIME=TIMER1+02H;
     R0=0;
     R0=0;
     HSO_COMMAND=07H;
     HSO_TIME=TIMER1+02H;
     R0=0;
     R0=0;
  END;
  ELSE DO;
    IF T_SPAN>18000  THEN DO;
     HSO_COMMAND=07H;
     HSO_TIME=TIMER1+02H;
     R0=0;
     R0=0;
     HSO_COMMAND=06H;
     HSO_TIME=TIMER1+02H;
     R0=0;
     R0=0;
    END;
    ELSE DO;
     TURNON=T_SPAN*5/6;
     TURNOFF=T_SPAN/2;
     IF DIRECT=1 THEN DO;
       DO CASE ORDER;
       S00:DO;
         HSO_COMMAND=23H;
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=02H;
         HSO_TIME=TIMER1+TURNOFF;
       END;
       S01:DO;
         HSO_COMMAND=20H;          /*此处原来为00H*/
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=03H;
         HSO_TIME=TIMER1+TURNOFF;
       END;
       S02:DO;
         HSO_COMMAND=21H;
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=00H;
         HSO_TIME=TIMER1+TURNOFF;
       END;
       S03:DO;
         HSO_COMMAND=22H;
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=01H;
         HSO_TIME=TIMER1+TURNOFF;
       END;
      END;
    END;
    ELSE DO;
      DO CASE ORDER;
       S10:DO;
         HSO_COMMAND=23H;
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=00H;
         HSO_TIME=TIMER1+TURNOFF;
       END;
       S11:DO;
         HSO_COMMAND=20H;       /*此处原来为00H*/
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=01H;
         HSO_TIME=TIMER1+TURNOFF;
       END;
       S12:DO;
         HSO_COMMAND=21H;
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=02H;
         HSO_TIME=TIMER1+TURNOFF;
       END;
       S13:DO;
         HSO_COMMAND=22H;
         HSO_TIME=TIMER1+TURNON;
         R0=0;
         R0=0;
         HSO_COMMAND=03H;
         HSO_TIME=TIMER1+TURNOFF;
       END;
      END;
    END;
  END;
  END;
ENABLE;
END STOP;

PWMTIME:PROCEDURE;
  IOC2=0C0H;
  HSO_COMMAND=0CEH;
  HSO_TIME=150;
  R0=0;
  R0=0;
  HSO_COMMAND=0E5H;
  HSO_TIME=150;
  R0=0;
  R0=0;
  CALL PWM_OUT;
END PWMTIME;

HSO_INT:PROCEDURE INTERRUPT 3;
    KK=KK+1;
    IF START_SIGN=0 THEN DO;
      IF KK>20 THEN DO;
        KK=1;
        CALL PWM;
      END;
      ELSE CALL PWM_OUT;
    END;
    ELSE DO;
      IF RUN_SPD<60 THEN DO;
        IF KK>300 THEN DO;
          KK=1;
          CALL PWM;
        END;
        ELSE CALL PWM_OUT;
      END;
      ELSE IF AIM_SPD>300 THEN DO;
        IF RUN_SPD<(AIM_SPD-300) THEN DO;
          IF KK>32 THEN DO;
            KK=1;
            CALL PWM;
          END;
          ELSE CALL PWM_OUT;
        END;
        ELSE DO;
          IF KK>400 THEN DO;
            KK=1;
            CALL PWM;
          END;
          ELSE CALL PWM_OUT;
        END;
      END;
      ELSE DO;
        IF KK>600 THEN DO;
            KK=1;
            CALL PWM;
        END;
        ELSE CALL PWM_OUT;
      END;
    END;
END HSO_INT;

PWM:PROCEDURE;
DECLARE(GE,GEC) BYTE;
DECLARE EE1 INTEGER;
DISABLE;
IF START_SIGN=0 THEN DO;
   PWM_WIDTH=PWM_WIDTH-1;
   IF T_SPAN>10000 THEN PWM_WIDTH=2;
   ELSE IF T1OVER>15 THEN PWM_WIDTH=2;
   IF PWM_WIDTH<2 THEN PWM_WIDTH=2;
END;
ELSE DO;/*E0 前次误差 E1 本次误差 EC 本次误差的变化率*/
    E1=SIGNED(AIM_SPD-RUN_SPD);
    EE1=E1;
    IF IABS(EE1)>42 THEN DO;
      IF AIM_SPD>RUN_SPD THEN EE1=42;
      ELSE EE1=-42;
    END;
    GE=UNSIGN(EE1/6+7);
    EC=E1-E0;
    IF IABS(EC)>7 THEN DO;
      IF E1>E0 THEN EC=7;
      ELSE EC=-7;
    END;
    GEC=UNSIGN(EC+7);
    PWM_WIDTH=PWM_WIDTH+FUZZY(GE*15+GEC);
    PWM_WIDTH=PWM_WIDTH-7;
    IF PWM_WIDTH>145 THEN PWM_WIDTH=145;
    IF PWM_WIDTH<2 THEN PWM_WIDTH=2;
    E0=E1;
END;
CALL PWM_OUT;
ENABLE;
END PWM;

PWM_OUT:PROCEDURE;
DISABLE;
    HSO_COMMAND=55H;
    HSO_TIME=PWM_WIDTH;
    R0=0;
    R0=0;
ENABLE;
END PWM_OUT;

/***主过程***/
MAINPROC:DO;
CALL TIME(500);
DISABLE;
  IOC0=05H;
  IOC1=66H;
  IOC2=80H;
  SP=0C0H;
  INT_MASK=2DH;
  INT_MASK1=23H;
  INT_PENDING=00H;
  INT_PEND1=00H;
  HSI_MODE=0FH;
  IOPORT1=0FFH;
  IOPORT2=0;

  COMM_8279=2FH;
  R0=0;
  R0=0;
  COMM_8279=01H;
  R0=0;
  R0=0;
  COMM_8279=0D3H;

  START_SIGN=0;
  AIM_SPD=0;
  DIRECT=0;
  FAULT=1FH;
  PWM_WIDTH=0;
  E0=0;
  E1=0;
  EC=0;
  DISP_STATUS=0;
  SPD_STEP=100;
  RUN_SPD=0;
  CONV_SPD=0;
  KK=0;
  DO II=0 TO 7;
    TM1=HSI_TIME;
    R0=0;
    R0=0;
  END;
ENABLE;

MAINLOOP:
DO;
     CALL BITCPL(.IOPORT2,6);
  IF START_SIGN=0 THEN DO;
    IF T_SPAN>100000 THEN DO;
       PWM_WIDTH=2;
       RUN_SPD=0;
    END;
    ELSE IF T1OVER>5 THEN DO;
       PWM_WIDTH=2;
       RUN_SPD=0;
    END;
  END;
  IF BID=1 THEN DO;
   IF RUN_SPD=0 THEN DO;
     IF DIRECT=1 THEN DIRECT=0;
     ELSE DIRECT=1;
     BID=0;
     AIM_SPD=DEFAULT_SPD;
     CALL START;
   END;
  END;
  CALL DISPLAY;
END;
GOTO MAINLOOP;
END MAINPROC;
END MAIN;
EOF;

⌨️ 快捷键说明

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