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

📄 改猛.txt

📁 运用模糊算法和PID调节控制开关磁阻电机的调速。采用的单片机是Intel的80c196KB,编程语言为PL/M.
💻 TXT
📖 第 1 页 / 共 3 页
字号:

 MAIN_1:DO;
/*专用寄存器*/
DECLARE P0 BYTE AT(80H) REGISTER;
 DECLARE P00  BIT  AT(80H) REGISTER;
 DECLARE P01 BIT  AT(81H) REGISTER;
  DECLARE P02 BIT  AT(82H) REGISTER;
   DECLARE P03 BIT  AT(83H) REGISTER;
    DECLARE P04 BIT  AT(84H) REGISTER;
     DECLARE P05 BIT  AT(85H) REGISTER;
      DECLARE P06 BIT  AT(86H) REGISTER;
       DECLARE P07 BIT  AT(87H) REGISTER;
DECLARE P1 BYTE AT(90H) REGISTER;
DECLARE T2 BIT AT(90H) REGISTER;
DECLARE AA BIT AT(92H) REGISTER;
DECLARE BB BIT AT(93H) REGISTER;
DECLARE CC BIT AT(94H) REGISTER;
DECLARE QIN BIT AT(96H) REGISTER;

DECLARE PIN BIT  AT(95H) REGISTER;
DECLARE DD BIT  AT(97H) REGISTER;

DECLARE P2 BYTE AT(0A0H) REGISTER;
DECLARE A14   BIT AT(0A6H) REGISTER;
DECLARE A15   BIT AT(0A7H) REGISTER;
DECLARE P3 BYTE AT(0B0H) REGISTER;
DECLARE WR BIT AT(0B6H)  REGISTER;
 DECLARE RD BIT AT(0B7H)  REGISTER;
DECLARE PSW BYTE AT(0D0H) REGISTER;
DECLARE ACC BYTE AT(0E0H) REGISTER;
DECLARE B BYTE   AT(0F0H) REGISTER;
DECLARE DPL BYTE  AT(82H) REGISTER;
DECLARE DPH BYTE  AT(83H) REGISTER;
DECLARE PCON BYTE AT(87H) REGISTER;

DECLARE TCON BYTE AT(88H) REGISTER;
DECLARE TF1 BIT AT(8FH) REGISTER;
DECLARE TR1 BIT AT(8EH) REGISTER;
DECLARE TF0 BIT AT(8DH) REGISTER;
DECLARE TR0 BIT AT(8CH) REGISTER;

DECLARE TMOD BYTE AT(89H) REGISTER;
DECLARE TL0 BYTE AT(8AH) REGISTER;
DECLARE TL1 BYTE AT(8BH) REGISTER;
DECLARE TH0 BYTE AT(8CH) REGISTER;
DECLARE TH1 BYTE AT(8DH) REGISTER;
DECLARE IE BYTE AT(0A8H) REGISTER;
DECLARE IP BYTE AT(0B8H) REGISTER;
DECLARE SCON BYTE AT(98H) REGISTER;
DECLARE SBUF BYTE AT(99H) REGISTER;

DECLARE T2CON  BYTE AT(0C8H) REGISTER;
DECLARE TF2  BIT AT(0CFH) REGISTER;
DECLARE EXF2  BIT AT(0CEH) REGISTER;
DECLARE TR2  BIT AT(0CAH) REGISTER;
DECLARE T2MOD  BYTE AT(0C9H) REGISTER;
DECLARE RCAP2L  BYTE AT(0CAH) REGISTER;
DECLARE RCAP2H  BYTE AT(0CBH) REGISTER;
DECLARE TL2    BYTE AT(0CCH) REGISTER;
DECLARE TH2    BYTE AT(0CDH) REGISTER;
/********************************/


/*******************************/
DECLARE PL(4) BYTE  ;


DECLARE S_ADC BYTE  ;          /*A/D转化切换控制参数*/
DECLARE VV BYTE  ;
DECLARE SS  BYTE   ;
DECLARE PP  BYTE   ;
DECLARE TT  BYTE   ;


 DECLARE PWM_V BYTE ;        /*VSS的最大值*/
  DECLARE T_V BYTE ;        /*采样时间*/
    DECLARE PWM_START BYTE ;        /*启动脉宽 */
      DECLARE PWM_STOP BYTE ;        /*停车脉宽*/
       DECLARE SPD_D BYTE ;        /*停车脉宽*/


DECLARE ADC0 BYTE AT (0000H) AUXILIARY;
DECLARE ADC1 BYTE AT (0001H) AUXILIARY;
DECLARE ADC2 BYTE AT (0002H) AUXILIARY;
DECLARE ADC3 BYTE AT (0003H) AUXILIARY;
DECLARE ADC4 BYTE AT (0004H) AUXILIARY;


DECLARE R0 BYTE  ;
DECLARE S_T0 BYTE  ;     /*定时器0切换控制*/
DECLARE S_T1 BYTE  ;    /*定时器1切换控制*/
DECLARE KEY_TL BYTE  ; /*键盘延时控制参数*/




DECLARE SPD_JS BYTE  ;     /*测速累计控制*/
DECLARE S_SPD BYTE  ;
DECLARE MM BYTE  ;
DECLARE TEM_S BYTE  ;
DECLARE TEM_I BYTE  ;
DECLARE TI BYTE  ;
DECLARE SPD_STEP BYTE  ;
DECLARE DISP_STATUS BYTE  ;


DECLARE SPD1 WORD AT (50H) MAIN ;
DECLARE ZXS  BYTE   ;

DECLARE SPD3  BYTE   ;
DECLARE SPD4  BYTE   ;
DECLARE SPD5  WORD   ;

DECLARE (DIRECT) BIT  ;
DECLARE (START_SIGN,BID ) BIT  ;

DECLARE ORDER  BYTE   ;
DECLARE KEY_STATUS BYTE AT (2C01H) AUXILIARY;

DECLARE DISP(4) BYTE AT (2C02H) AUXILIARY;
DECLARE ADC0809_0 BYTE AT ( 87FFH) AUXILIARY;
DECLARE ADC0809_1 BYTE AT ( 8FFFH) AUXILIARY;
DECLARE ADC0809_2 BYTE AT ( 97FFH) AUXILIARY;
DECLARE ADC0809_3 BYTE AT ( 9FFFH) AUXILIARY;
DECLARE ADC0809_4 BYTE AT (0A7FFH) AUXILIARY;
DECLARE DAC0832 BYTE AT (37FFH) AUXILIARY;
DECLARE T8253_0 BYTE AT (0C7FFH) AUXILIARY;
DECLARE T8253_1 BYTE AT (0CFFFH) AUXILIARY;
DECLARE T8253_2 BYTE AT (0D7FFH) AUXILIARY;
DECLARE CON_8253 BYTE AT (0DFFFH) AUXILIARY;

DECLARE TEM(1000) WORD AT (000FH) AUXILIARY;



DECLARE  AIM_SPD  WORD AT  (54H) MAIN;
DECLARE RUN_SPD WORD AT (52H) MAIN ;

DECLARE  SIG_VSS   BIT ;
DECLARE  SIG_VSS1  BIT ;
DECLARE  VSS_SPD(2)  WORD ;

DECLARE PWM_WIDTH  BYTE AT (45H) MAIN;
DECLARE (E0,E1,EC) BYTE;
DECLARE FUZZY(225) BYTE
CONSTANT(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);


/*********速度转换子程序**************/
CONVERSION:PROCEDURE ;
   IF ((SPD4=3 AND SPD3>=0E8H)OR(SPD4>3)) THEN
   DO;
   PL(0)=1;
   PL(1)=( SPD4*256+SPD3-1000 )/64H;
   PL(2)=( SPD4*256+SPD3-1000-PL(1)*100 )/0AH;
   PL(3)=(SPD4*256+SPD3-1000-PL(1)*100 -PL(2)*10 ) MOD
0AH;
   END;
   ELSE
   DO;
    PL(0)=0;


    PL(1)=((SPD4)*256 + SPD3)/64H;
    PL(2)=( SPD4*256+SPD3-PL(1)*100)/0AH;
    PL(3)=(SPD4*256+SPD3-PL(1)*100-PL(2)*10) MOD 0AH;
   END;





  END CONVERSION;
/*********显示子程序******************/

DISPLAY:PROCEDURE;


  DO CASE DISP_STATUS;
    DISP_0:DO; /*显示速度*/
          IF S_SPD=0 THEN
          DO;
           SPD3=LOW(RUN_SPD);
           SPD4=HIGH (RUN_SPD);
          END;
          ELSE IF S_SPD=1 THEN
          DO;
           SPD3=LOW(AIM_SPD);
           SPD4=HIGH (AIM_SPD);
           END;
           ELSE IF S_SPD=2 THEN
          DO;
           SPD3=LOW(SPD_STEP);
           SPD4=HIGH (SPD_STEP);
           END;
            ELSE IF S_SPD=3 THEN
          DO;
           SPD3=LOW(PWM_WIDTH );
           SPD4=HIGH (PWM_WIDTH );
           END;


            CALL  CONVERSION;


            IF (PL(0)=1 AND BID=0) THEN
             DO;
             WR=0;
             P0=02H;
             P2=57H;
             WR=1;
             END;

          ELSE IF  (PL(0)=1 AND BID=1) THEN


             DO;
             WR=0;
             P0=03H;
             P2=57H;
             WR=1;
             END;

          ELSE IF  (PL(0)=0 AND BID=0) THEN
             DO;
             WR=0;
             P0=00H;
             P2=57H;
             WR=1;
             END;

            ELSE IF  (PL(0)=0 AND BID=1) THEN
             DO;
             WR=0;
             P0=01H;
             P2=57H;
             WR=1;
             END;



           WR=0;

           P2=67H;
           P0=PL(2);

           R0=0;
            R0=0;

             P2=6FH;
            P0=PL(3);

             R0=0;
            R0=0;

            P2=5FH;
           P0=PL(1);

            R0=0;
            R0=0;


            WR=1;


           END;

           END;




        END DISPLAY;
   /***************PWM_OUT*********************/
 PWM_OUT:PROCEDURE;
        DISABLE;

         DO;
         CON_8253=72H;
         T8253_1=PWM_WIDTH ;
         T8253_1=00H;
         END;


        ENABLE;
      END  PWM_OUT;
  /**********************PID子程序***********/
  PID:PROCEDURE;
     DECLARE Q1 BYTE ;

      DECLARE SS1 BYTE ;


      DECLARE S1 WORD ;
        DECLARE S2 WORD ;

   DECLARE S_4 BIT ;

      DECLARE S3 BYTE ;
     DECLARE S_1 BIT ;
     DECLARE S_2 BIT ;
        DECLARE S_3 BIT ;

     IF AIM_SPD>=RUN_SPD  THEN DO;
      S_3=0;

      S1=AIM_SPD-RUN_SPD;
      S3=S1;
      IF S3>160 THEN S3=160;
      END;
    ELSE  IF AIM_SPD<RUN_SPD  THEN DO;
      S_3=1;
      S1=RUN_SPD-AIM_SPD;
       S3=S1;
      IF S3>160 THEN S3=160;
      END;

         IF  S_4=0 AND S_3=0 THEN DO;
      IF S1>=S2 THEN DO;
      S_1=0;
      SS1=S1-S2;
      END;
      IF S1<S2 THEN DO;
      S_1=1;
      SS1=S2-S1;
      END;
      IF SS1>40 THEN SS1=40;

      END;

   ELSE   IF  S_4=1 AND S_3=1 THEN DO;
      IF S1>=S2 THEN DO;
      S_1=1;
      SS1=S1-S2;
      END;
      IF S1<S2 THEN DO;
      S_1=0;
      SS1=S2-S1;
      END;
        IF SS1>40 THEN SS1=40;
      END;

   ELSE    IF  S_4=1 AND S_3=0 THEN DO;
      IF S1>=S2 THEN DO;
      S_1=0;
      SS1=S1+S2;
      END;
        IF SS1>40 THEN SS1=40;
      END;

   ELSE    IF  S_4=0 AND S_3=1 THEN DO;
      IF S1>=S2 THEN DO;
      S_1=1;
      SS1=S1+S2;
      END;
        IF SS1>40 THEN SS1=40;
      END;





     IF (S_3=0)AND(S_1=0) THEN
      PWM_WIDTH = PWM_WIDTH + SS1/20 +  S3/40;

     IF (S_3=0)AND(S_1=1) THEN
      PWM_WIDTH = PWM_WIDTH- SS1/20 +  S3/40;

     IF (S_3=1)AND(S_1=0) THEN
      PWM_WIDTH = PWM_WIDTH + SS1/20 - S3/40;

     IF (S_3=1)AND(S_1=1) THEN
      PWM_WIDTH = PWM_WIDTH - SS1/20- S3/40;




      IF (PWM_WIDTH>62 AND PWM_WIDTH<200)  THEN PWM_WIDTH=62;
    IF PWM_WIDTH<2 THEN PWM_WIDTH=2;
    IF PWM_WIDTH=0FFH THEN PWM_WIDTH=2;


      CALL PWM_OUT;



        S2=S1;
        S_4=S_3 ;
        END PID;
 PWM:PROCEDURE;          /*模糊控制*/

DECLARE(GE,GEC) BYTE;
DECLARE EE1 BYTE;
DECLARE SING1_SPD BYTE;
DECLARE SING2_SPD BYTE;
DECLARE SING3_SPD BYTE;


  DO;/*E0 前次误差 E1 本次误差 EC 本次误差的变化率*/
    IF  AIM_SPD>=RUN_SPD THEN DO;
       SING1_SPD=0;
       E1= (AIM_SPD-RUN_SPD)/2  ;
       IF E1>42  THEN E1=42 ;
       EE1=E1;
        GE= EE1/6 +7 ;
       END;
     ELSE DO;
       SING1_SPD=1;
       E1= (RUN_SPD-AIM_SPD)/2 ;
        IF E1>42  THEN E1=42 ;
        EE1=E1;
        GE= 7-EE1/6  ;
       END;




  IF SING3_SPD=0  AND SING1_SPD=0 THEN DO;

     IF  E1>=E0    THEN DO;
      SING2_SPD=0;
       EC=(E1-E0)/2 ;
      IF EC>7 THEN  EC=7;
      END;
    ELSE DO;
       SING2_SPD=1;
       EC=(E0-E1)/2 ;
      IF EC>7 THEN  EC=7;
      END;
     END;

   IF SING3_SPD=1  AND SING1_SPD=0 THEN DO;
      SING2_SPD=0;
      EC=(E1+E0) ;
      IF EC>7 THEN

         EC=7;



     END;

      IF SING3_SPD=0  AND SING1_SPD=1 THEN DO;
       SING2_SPD=1;
        EC=(E1+E0) ;
      IF EC>7 THEN


         EC=7;



     END;

     IF SING3_SPD=1  AND SING1_SPD=1 THEN DO;

     IF  E1>=E0    THEN DO;
      SING2_SPD=1;
       EC=(E1-E0) ;
      IF EC>7 THEN  EC=7;
      END;
    ELSE DO;
       SING2_SPD=0;
       EC=(E0-E1) ;
      IF EC>7 THEN  EC=7;
      END;
     END;







    IF  SING2_SPD=1  THEN
    GEC= 7-EC  ;
    ELSE  GEC= 7+EC;


    PWM_WIDTH=PWM_WIDTH+FUZZY(GE*15+GEC);
    IF PWM_WIDTH>=9 THEN
    PWM_WIDTH=PWM_WIDTH-7;
    ELSE  PWM_WIDTH=2;
    IF (PWM_WIDTH>124 AND PWM_WIDTH<255)  THEN PWM_WIDTH=124;
    IF PWM_WIDTH<2 THEN PWM_WIDTH=2;
    


    E0=E1;
    SING3_SPD=SING1_SPD;
END;
CALL PWM_OUT;

END PWM;
 /**********************VSS********************/
  VSS:PROCEDURE;
     DECLARE  DIF_SPD  WORD ;

    IF START_SIGN=1 THEN
    DO;
      VSS_SPD(0)=RUN_SPD;

      IF  VSS_SPD(0)>=VSS_SPD(1) THEN DO;
       DIF_SPD=(VSS_SPD(0)-VSS_SPD(1))/5;
       VSS_SPD(1)=VSS_SPD(0)+ DIF_SPD;
       END;
       ELSE  DO;

        DIF_SPD=(VSS_SPD(1)-VSS_SPD(0))/5;
        VSS_SPD(1)=VSS_SPD(0)- DIF_SPD;
         END;

      IF  ( VSS_SPD(1)>=AIM_SPD) AND (SIG_VSS1=1)   THEN
      DO;
        SIG_VSS1=0;
        SIG_VSS=0;
        CON_8253=72H;
         T8253_1=02H;
         T8253_1=00H;
      END;
      ELSE   IF  ( VSS_SPD(1)<AIM_SPD) AND (SIG_VSS1=0)
THEN
       DO;
        SIG_VSS1=1;
        SIG_VSS=1;
        CON_8253=72H;
         T8253_1=PWM_V;
         T8253_1=00H;
      END;
        VSS_SPD(1)= VSS_SPD(0) ;
    END;



    END VSS;
  /*************启动子程*******************/
 START:PROCEDURE;
    DISABLE;

         CON_8253=72H;
         T8253_1=2;
         T8253_1=00H;

    START_SIGN=1;
    IF DIRECT=0 THEN DO;
        IF (PIN=1 AND QIN=1) THEN DO;
           AA=0;
           R0=0;
           R0=0;

           BB=1;
           R0=0;
           R0=0;

           CC=1;
           R0=0;
           R0=0;

           DD=0;
           R0=0;
           R0=0;
           END;
         ELSE IF (PIN=1 AND QIN=0) THEN DO;
            DD=1;
            R0=0;
            R0=0;

            AA=0;
            R0=0;
            R0=0;

            BB=0;
            R0=0;
            R0=0;

            CC=1;
            R0=0;
            R0=0;
            END;

          ELSE IF (PIN=0 AND QIN=0) THEN DO;
            CC=0;
            R0=0;
            R0=0;

            DD=1;
            R0=0;
            R0=0;

            AA=1;
            R0=0;
            R0=0;

            BB=0;
            R0=0;
            R0=0;
             END;
            ELSE IF (PIN=0 AND QIN=1) THEN DO;
            BB=1;
            R0=0;
            R0=0;

            CC=0;
            R0=0;
            R0=0;

            AA=1;
            R0=0;
            R0=0;

            DD=0;
            R0=0;
            R0=0;
            END;

         END;


        ELSE DO;
           IF (PIN=0 AND QIN=0) THEN DO;
            AA=0;
            R0=0;
            R0=0;

            BB=1;
            R0=0;
            R0=0;

            CC=1;
            R0=0;
            R0=0;

            DD=0;
            R0=0;
            R0=0;
            END;
           ELSE IF (PIN=1 AND QIN=0) THEN DO;
            BB=1;
            R0=0;
            R0=0;

            CC=0;
            R0=0;
            R0=0;

            AA=1;
            R0=0;
            R0=0;

            DD=0;
            R0=0;
            R0=0;
            END;
            ELSE IF (PIN=0 AND QIN=1) THEN DO;
            AA=0;
            R0=0;
            R0=0;

            DD=1;
            R0=0;
            R0=0;

            BB=0;
            R0=0;
            R0=0;

            CC=1;
            R0=0;
            R0=0;
            END;
            ELSE DO;
            CC=0;
            R0=0;
            R0=0;

            DD=1;
            R0=0;
            R0=0;

            AA=1;
            R0=0;
            R0=0;

            BB=0;
            R0=0;
            R0=0;
            END;

         END;
         ENABLE;
    END START;


/************停车子程序******************/
 STOP:PROCEDURE;
  IF DIRECT=0 THEN    /*正向停车*/

⌨️ 快捷键说明

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