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

📄 2007-3-5-pwm+fuzzy.txt

📁 运用模糊算法和PID调节控制开关磁阻电机的调速。采用的单片机是Intel的80c196KB,编程语言为PL/M.
💻 TXT
📖 第 1 页 / 共 2 页
字号:
MAIN:DO;
/***************************************************/
/*80C196KB CPU专用寄存器*/
/***************************************************/
DECLARE ZERO WORD AT (00H);  /*R*/
DECLARE AD_COMMAND  BYTE AT(02H);   /*W*/
DECLARE HSI_MODE BYTE AT (03H);  /*W*/
DECLARE HSI_TIME WORD AT (04H);  /*R*/
DECLARE HSO_TIME WORD AT (04H);  /*W*/
DECLARE HSI_STATUS BYTE AT (06H);  /*R*/
DECLARE HSO_COMMAND BYTE AT (06H);  /*W*/
DECLARE SBUF BYTE AT(07H);   /* R/W */
DECLARE INT_MASK BYTE AT (08H);  /*R W*/
DECLARE INT_PENDING BYTE AT (09H);  /*R W*/
DECLARE WATCHDOG BYTE AT (0AH);  /*W*/
DECLARE TIMER1 WORD AT (0AH);  /*R*/
DECLARE TIMER2 WORD AT (0CH);  /*R W*/
DECLARE IOC2 BYTE AT (0BH); /*W*/
DECLARE IOPORT0 BYTE AT (0EH); /*R*/
DECLARE IOPORT1 BYTE AT (0FH); /*R W*/
DECLARE IOPORT2 BYTE AT (10H); /*R W*/
DECLARE INT_PEND1 BYTE AT (12H); /*R W*/
DECLARE INT_MASK1 BYTE AT (13H); /*R W*/
DECLARE WSR BYTE AT (14H); /*R W*/
DECLARE IOS0 BYTE AT (15H); /*R*/
DECLARE IOC0 BYTE AT (15H); /*W*/
DECLARE IOS1 BYTE AT (16H); /*R*/
DECLARE IOC1 BYTE AT (16H); /*W*/
DECLARE IOS2 BYTE AT (17H); /*R*/
DECLARE SP WORD AT (18H); /*R W*/

/*****************************************************/
DECLARE (DIRECT,P,Q,ORDER) BYTE FAST;
DECLARE T1OVER WORD;
DECLARE PWM_WIDTH WORD;
DECLARE DISP_SPD(4) BYTE;
DECLARE DISP_BUFF(4) BYTE;
DECLARE (START_SIGN,BID) BYTE;
DECLARE R0 BYTE;
DECLARE (DISP_STATUS,SPD_STEP,FAULT) BYTE;
DECLARE (II,KK) WORD;
DECLARE COMM_8279 BYTE AT(0DFFFH);
DECLARE DATA_8279 BYTE AT(0DE00H);
DECLARE (AIM_SPD,CONV_SPD,RUN_SPD) WORD ;
DECLARE (TM1,TM2) WORD FAST;
DECLARE (TURNON,TURNOFF) WORD FAST;
DECLARE (E0,E1,EC) INTEGER;
DECLARE T_SPAN DWORD FAST;
DECLARE INT13 WORD AT(203AH) DATA(.KEY_PROCESS);
DECLARE DEFAULT_SPD WORD DATA(400);
DECLARE DIGI_CODE(10) BYTE DATA(3FH,30H,5BH,79H,74H,6DH,6FH,38H,7FH,7DH);
DECLARE FUZZY(225) BYTE DATA(0,0,0,1,1,2,3,3,4,5,5,6,7,7,7,
                                 1,1,2,2,3,3,4,4,5,5,6,7,7,7,8,
                                 2,2,3,3,3,4,4,5,5,6,6,7,7,7,8,
                                 3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,
                                 4,4,4,5,5,6,6,6,6,7,7,7,7,8,8,
                                 4,5,5,6,6,6,6,6,7,7,7,7,7,8,8,
                                 5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,
                                 6,6,6,6,6,7,7,7,7,7,8,8,8,8,8,
                                 6,6,6,7,7,7,7,7,8,8,8,8,8,9,9,
                                 6,6,7,7,7,7,7,8,8,8,8,8,9,9,10,
                                 6,6,7,7,7,7,8,8,8,8,9,9,10,10,10,
                                 6,6,7,7,7,8,8,8,9,9,9,10,10,10,11,
                                 6,7,7,7,8,8,9,9,10,10,11,11,11,12,12,
                                 6,7,7,7,8,9,9,10,10,11,11,12,12,13,13,
                                 7,7,7,8,9,9,10,11,11,12,13,13,14,14,14);
/*显示程序*/
DISPLAY:PROCEDURE;
  DECLARE I BYTE;
  DO CASE DISP_STATUS;
  DISP0:DO;      /*速度显示*/
    II=II+1;
    IF II>500 THEN DO;
    II=0;
    CONV_SPD=RUN_SPD;
    END;
    CALL CONVERSION;
    DO I=0 TO 3;
    DISP_BUFF(I)=DISP_SPD(I);
    END;
  END;
  DISP1:DO;      /*一般故障显示*/
    IF BITTST(.FAULT,1) THEN DISP_BUFF(0)=00H;
    ELSE DISP_BUFF(0)=40H;
    IF BITTST(.FAULT,2) THEN DISP_BUFF(1)=00H;
    ELSE DISP_BUFF(1)=40H;
    IF BITTST(.FAULT,3) THEN DISP_BUFF(2)=80H;
    ELSE DISP_BUFF(2)=0c0H;
    IF BITTST(.FAULT,4) THEN DISP_BUFF(3)=00H;
    ELSE DISP_BUFF(3)=40H;
  END;
  DISP2:DO;      /*电源故障显示*/
    DO I=0 TO 2;
      IF BITTST(.FAULT,0) THEN  DISP_BUFF(I)=00H;
      ELSE DISP_BUFF(I)=40H;
    END;
    DISP_BUFF(3)=0DEH;
  END;
  DISP3:DO;
    CONV_SPD=PWM_WIDTH;
    CALL CONVERSION;
      DO I=0 TO 3;
        DISP_BUFF(I)=DISP_SPD(I);
      END;
  END;
  DISP4:DO;
    CONV_SPD=300;
    CALL CONVERSION;
      DO I=0 TO 3;
        DISP_BUFF(I)=DISP_SPD(I);
      END;
  END;
  DISP5:DO;
    CONV_SPD=PWM_WIDTH;
    CALL CONVERSION;
      DO I=0 TO 3;
        DISP_BUFF(I)=DISP_SPD(I);
      END;
  END;
  DISP6:DO;
    CONV_SPD=SPD_STEP;
    CALL CONVERSION;
      DO I=0 TO 3;
        DISP_BUFF(I)=DISP_SPD(I);
      END;
  END;
  DISP7:DO;
    CONV_SPD=AIM_SPD;
    CALL CONVERSION;
      DO I=0 TO 3;
        DISP_BUFF(I)=DISP_SPD(I);
      END;
  END;
 END;
 IF START_SIGN=1 THEN DISP_BUFF(0)=(DISP_BUFF(0) OR 80H);
 IF DIRECT=1 THEN DISP_BUFF(1)=(DISP_BUFF(1) OR 80H);
 IF FAULT<1FH THEN DISP_BUFF(3)=(DISP_BUFF(3) OR 80H);
 CALL REFRESH;
END DISPLAY;

CONVERSION:PROCEDURE;
  DECLARE K BYTE;
  DECLARE NN BYTE;
  DECLARE DIGI_N(4) BYTE;
  DIGI_N(0)=CONV_SPD/1000;
  DIGI_N(1)=(CONV_SPD MOD 1000)/100;
  DIGI_N(2)=(CONV_SPD MOD 100)/10;
  DIGI_N(3)=CONV_SPD MOD 10;
  DO K=0 TO 3;
    NN=DIGI_N(K);
    DISP_SPD(K)=DIGI_CODE(NN);
  END;
END CONVERSION;

REFRESH:PROCEDURE;
  DECLARE J BYTE;
  COMM_8279=90H;
  DO J=0 TO 3;
    DATA_8279=DISP_BUFF(J);
  END;
END REFRESH;


/*键盘处理程序*/
KEY_PROCESS:PROCEDURE INTERRUPT 7 ;
  DECLARE KEY BYTE;
  DISABLE;
    COMM_8279=40H;
    KEY=DATA_8279;
    COMM_8279=0C2H;
  IF KEY>7 THEN KEY=KEY-8;
  ENABLE;
  DO CASE KEY;
  K0:DO;      /*启动键*/
   DISP_STATUS=0;   /*show run_spd*/
    IF START_SIGN=0 THEN  CALL START;
  END;
  K1:DO;     /*反向键*/
    IF (START_SIGN=0 AND RUN_SPD=0) THEN DO;
      IF DIRECT=1 THEN DIRECT=0;
      ELSE DIRECT=1;
    END;
    ELSE DO;
      START_SIGN=0;
      AIM_SPD=0;
      BID=1;
      CALL STOP;
    END;
  END;
  K2:DO;     /*显示切换键*/
    DISP_STATUS=DISP_STATUS+1;
    IF DISP_STATUS=8 THEN DISP_STATUS=0;
  END;
  K3:DO;     /*加速键*/
    DISP_STATUS=7;
    IF AIM_SPD<3500 THEN  AIM_SPD=AIM_SPD+SPD_STEP;
    IF AIM_SPD>3500 THEN  AIM_SPD=3500;
  END;
  K4:DO;     /*减速键*/
    DISP_STATUS=7;
    IF AIM_SPD>50 THEN AIM_SPD=AIM_SPD-SPD_STEP;
    IF AIM_SPD<50 THEN AIM_SPD=50;
  END;
  K5:DO;     /*停止键*/
    START_SIGN=0;
    AIM_SPD=0;
    CALL STOP;
  END;
  K6:DO;     /*步距调节键*/
    DISP_STATUS=6;
    IF SPD_STEP=100 THEN SPD_STEP=10;
    ELSE IF SPD_STEP=10 THEN SPD_STEP=1;
    ELSE SPD_STEP=100;
  END;
  K7:DO;     /*缺省速度键*/
    DISP_STATUS=7;
    AIM_SPD=DEFAULT_SPD;
  END;
END;
END KEY_PROCESS;



START:PROCEDURE;
  DECLARE PORT BYTE;
    DISABLE;
   /* INT_MASK=2DH;*/
    IOC2=80H;
    PWM_WIDTH=2;
    PORT=IOPORT1;
    IF BITTST(.PORT,7) THEN P=1;
    ELSE P=0;
    IF BITTST(.PORT,5) THEN Q=1;
    ELSE Q=0;
    TM1=0;
    T1OVER=0;
    CALL PWMTIME;
    START_SIGN=1;
    IF DIRECT=1 THEN DO;
      IF (P=1 AND Q=1) THEN DO;
        HSO_COMMAND=26H;
        HSO_TIME=TIMER1+02H;
         R0=0;
         R0=0;
         HSO_COMMAND=07H;
         HSO_TIME=TIMER1+02H;
         R0=0;
         R0=0;
      END;
      ELSE IF(P=1 AND Q=0) THEN DO;
        HSO_COMMAND=23H;
        HSO_TIME=TIMER1+02H;
        R0=0;
        R0=0;
        HSO_COMMAND=20H;
        HSO_TIME=TIMER1+02H;
         R0=0;
         R0=0;
         HSO_COMMAND=01H;
         HSO_TIME=TIMER1+02H;
         R0=0;
         R0=0;
         HSO_COMMAND=02H;
         HSO_TIME=TIMER1+02H;
         R0=0;
         R0=0;

      END;
      ELSE IF(P=0 AND Q=1) THEN DO;
        HSO_COMMAND=21H;
        HSO_TIME=TIMER1+02H;
        R0=0;
        R0=0;
        HSO_COMMAND=22H;
        HSO_TIME=TIMER1+02H;
         R0=0;
         R0=0;
         HSO_COMMAND=00H;
         HSO_TIME=TIMER1+02H;
         R0=0;
         R0=0;
         HSO_COMMAND=03H;
         HSO_TIME=TIMER1+02H;
         R0=0;
         R0=0;

      END;
      ELSE DO;
        HSO_COMMAND=27H;
        HSO_TIME=TIMER1+02H;
         R0=0;
         R0=0;
         HSO_COMMAND=06H;
         HSO_TIME=TIMER1+02H;
         R0=0;
         R0=0;
      END;
    END;
    ELSE DO;  /*顺时针转*/
      IF (P=0 AND Q=0) THEN DO;
        HSO_COMMAND=26H;
        HSO_TIME=TIMER1+02H;
         R0=0;
         R0=0;
         HSO_COMMAND=07H;
         HSO_TIME=TIMER1+02H;
         R0=0;
         R0=0;
      END;
      ELSE IF(P=1 AND Q=0) THEN DO;
        HSO_COMMAND=21H;
        HSO_TIME=TIMER1+02H;
        R0=0;
        R0=0;
        HSO_COMMAND=22H;
        HSO_TIME=TIMER1+02H;
         R0=0;
         R0=0;
         HSO_COMMAND=00H;
         HSO_TIME=TIMER1+02H;
         R0=0;
         R0=0;
         HSO_COMMAND=03H;
         HSO_TIME=TIMER1+02H;
         R0=0;
         R0=0;

      END;
      ELSE IF(P=0 AND Q=1) THEN DO;
        HSO_COMMAND=20H;
        HSO_TIME=TIMER1+02H;
        R0=0;
        R0=0;
        HSO_COMMAND=23H;
        HSO_TIME=TIMER1+02H;
         R0=0;
         R0=0;
         HSO_COMMAND=01H;
         HSO_TIME=TIMER1+02H;
         R0=0;
         R0=0;
         HSO_COMMAND=02H;
         HSO_TIME=TIMER1+02H;
         R0=0;
         R0=0;

      END;
      ELSE DO;
        HSO_COMMAND=27H;
        HSO_TIME=TIMER1+02H;
         R0=0;
         R0=0;

⌨️ 快捷键说明

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