找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3161|回复: 0
收起左侧

PID SERVO Encoder control de posicion motor

[复制链接]
ID:360941 发表于 2018-6-28 12:02 | 显示全部楼层 |阅读模式
PID SERVO CONTROL
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
SET POINT -50 A 50  PULSOS
CORRESPONDE -180 A 180 GRADOS
ss.jpg 0.png

单片机源程序如下:
  1. _pid:

  2. ;ENCODER.c,31 ::                 void pid(float pid_in)
  3. ;ENCODER.c,38 ::                 error=setpoint-pid_in;
  4.         MOVF       FARG_pid_pid_in+0, 0
  5.         MOVWF      R4+0
  6.         MOVF       FARG_pid_pid_in+1, 0
  7.         MOVWF      R4+1
  8.         MOVF       FARG_pid_pid_in+2, 0
  9.         MOVWF      R4+2
  10.         MOVF       FARG_pid_pid_in+3, 0
  11.         MOVWF      R4+3
  12.         MOVF       _setpoint+0, 0
  13.         MOVWF      R0+0
  14.         MOVF       _setpoint+1, 0
  15.         MOVWF      R0+1
  16.         MOVF       _setpoint+2, 0
  17.         MOVWF      R0+2
  18.         MOVF       _setpoint+3, 0
  19.         MOVWF      R0+3
  20.         CALL       _Sub_32x32_FP+0
  21.         MOVF       R0+0, 0
  22.         MOVWF      _error+0
  23.         MOVF       R0+1, 0
  24.         MOVWF      _error+1
  25.         MOVF       R0+2, 0
  26.         MOVWF      _error+2
  27.         MOVF       R0+3, 0
  28.         MOVWF      _error+3
  29. ;ENCODER.c,39 ::                 up=kp*error;
  30.         MOVF       _kp+0, 0
  31.         MOVWF      R4+0
  32.         MOVF       _kp+1, 0
  33.         MOVWF      R4+1
  34.         MOVF       _kp+2, 0
  35.         MOVWF      R4+2
  36.         MOVF       _kp+3, 0
  37.         MOVWF      R4+3
  38.         CALL       _Mul_32x32_FP+0
  39.         MOVF       R0+0, 0
  40.         MOVWF      _up+0
  41.         MOVF       R0+1, 0
  42.         MOVWF      _up+1
  43.         MOVF       R0+2, 0
  44.         MOVWF      _up+2
  45.         MOVF       R0+3, 0
  46.         MOVWF      _up+3
  47. ;ENCODER.c,40 ::                 if (ti!=0) ki=(kp/ti);
  48.         CLRF       R4+0
  49.         CLRF       R4+1
  50.         CLRF       R4+2
  51.         CLRF       R4+3
  52.         MOVF       _ti+0, 0
  53.         MOVWF      R0+0
  54.         MOVF       _ti+1, 0
  55.         MOVWF      R0+1
  56.         MOVF       _ti+2, 0
  57.         MOVWF      R0+2
  58.         MOVF       _ti+3, 0
  59.         MOVWF      R0+3
  60.         CALL       _Equals_Double+0
  61.         MOVLW      1
  62.         BTFSC      STATUS+0, 2
  63.         MOVLW      0
  64.         MOVWF      R0+0
  65.         MOVF       R0+0, 0
  66.         BTFSC      STATUS+0, 2
  67.         GOTO       L_pid0
  68.         MOVF       _ti+0, 0
  69.         MOVWF      R4+0
  70.         MOVF       _ti+1, 0
  71.         MOVWF      R4+1
  72.         MOVF       _ti+2, 0
  73.         MOVWF      R4+2
  74.         MOVF       _ti+3, 0
  75.         MOVWF      R4+3
  76.         MOVF       _kp+0, 0
  77.         MOVWF      R0+0
  78.         MOVF       _kp+1, 0
  79.         MOVWF      R0+1
  80.         MOVF       _kp+2, 0
  81.         MOVWF      R0+2
  82.         MOVF       _kp+3, 0
  83.         MOVWF      R0+3
  84.         CALL       _Div_32x32_FP+0
  85.         MOVF       R0+0, 0
  86.         MOVWF      _ki+0
  87.         MOVF       R0+1, 0
  88.         MOVWF      _ki+1
  89.         MOVF       R0+2, 0
  90.         MOVWF      _ki+2
  91.         MOVF       R0+3, 0
  92.         MOVWF      _ki+3
  93.         GOTO       L_pid1
  94. L_pid0:
  95. ;ENCODER.c,41 ::                 else ki=0;
  96.         CLRF       _ki+0
  97.         CLRF       _ki+1
  98.         CLRF       _ki+2
  99.         CLRF       _ki+3
  100. L_pid1:
  101. ;ENCODER.c,42 ::                 ui=ui_ + (ki*t_muestreo*error);
  102.         MOVF       _ki+0, 0
  103.         MOVWF      R0+0
  104.         MOVF       _ki+1, 0
  105.         MOVWF      R0+1
  106.         MOVF       _ki+2, 0
  107.         MOVWF      R0+2
  108.         MOVF       _ki+3, 0
  109.         MOVWF      R0+3
  110.         MOVF       _error+0, 0
  111.         MOVWF      R4+0
  112.         MOVF       _error+1, 0
  113.         MOVWF      R4+1
  114.         MOVF       _error+2, 0
  115.         MOVWF      R4+2
  116.         MOVF       _error+3, 0
  117.         MOVWF      R4+3
  118.         CALL       _Mul_32x32_FP+0
  119.         MOVF       _ui_+0, 0
  120.         MOVWF      R4+0
  121.         MOVF       _ui_+1, 0
  122.         MOVWF      R4+1
  123.         MOVF       _ui_+2, 0
  124.         MOVWF      R4+2
  125.         MOVF       _ui_+3, 0
  126.         MOVWF      R4+3
  127.         CALL       _Add_32x32_FP+0
  128.         MOVF       R0+0, 0
  129.         MOVWF      FLOC__pid+4
  130.         MOVF       R0+1, 0
  131.         MOVWF      FLOC__pid+5
  132.         MOVF       R0+2, 0
  133.         MOVWF      FLOC__pid+6
  134.         MOVF       R0+3, 0
  135.         MOVWF      FLOC__pid+7
  136.         MOVF       FLOC__pid+4, 0
  137.         MOVWF      _ui+0
  138.         MOVF       FLOC__pid+5, 0
  139.         MOVWF      _ui+1
  140.         MOVF       FLOC__pid+6, 0
  141.         MOVWF      _ui+2
  142.         MOVF       FLOC__pid+7, 0
  143.         MOVWF      _ui+3
  144. ;ENCODER.c,44 ::                 kd=kp*td;
  145.         MOVF       _kp+0, 0
  146.         MOVWF      R0+0
  147.         MOVF       _kp+1, 0
  148.         MOVWF      R0+1
  149.         MOVF       _kp+2, 0
  150.         MOVWF      R0+2
  151.         MOVF       _kp+3, 0
  152.         MOVWF      R0+3
  153.         MOVF       _td+0, 0
  154.         MOVWF      R4+0
  155.         MOVF       _td+1, 0
  156.         MOVWF      R4+1
  157.         MOVF       _td+2, 0
  158.         MOVWF      R4+2
  159.         MOVF       _td+3, 0
  160.         MOVWF      R4+3
  161.         CALL       _Mul_32x32_FP+0
  162.         MOVF       R0+0, 0
  163.         MOVWF      FLOC__pid+0
  164.         MOVF       R0+1, 0
  165.         MOVWF      FLOC__pid+1
  166.         MOVF       R0+2, 0
  167.         MOVWF      FLOC__pid+2
  168.         MOVF       R0+3, 0
  169.         MOVWF      FLOC__pid+3
  170.         MOVF       FLOC__pid+0, 0
  171.         MOVWF      _kd+0
  172.         MOVF       FLOC__pid+1, 0
  173.         MOVWF      _kd+1
  174.         MOVF       FLOC__pid+2, 0
  175.         MOVWF      _kd+2
  176.         MOVF       FLOC__pid+3, 0
  177.         MOVWF      _kd+3
  178. ;ENCODER.c,45 ::                 d_error=error-error_;
  179.         MOVF       _error_+0, 0
  180.         MOVWF      R4+0
  181.         MOVF       _error_+1, 0
  182.         MOVWF      R4+1
  183.         MOVF       _error_+2, 0
  184.         MOVWF      R4+2
  185.         MOVF       _error_+3, 0
  186.         MOVWF      R4+3
  187.         MOVF       _error+0, 0
  188.         MOVWF      R0+0
  189.         MOVF       _error+1, 0
  190.         MOVWF      R0+1
  191.         MOVF       _error+2, 0
  192.         MOVWF      R0+2
  193.         MOVF       _error+3, 0
  194.         MOVWF      R0+3
  195.         CALL       _Sub_32x32_FP+0
  196.         MOVF       R0+0, 0
  197.         MOVWF      _d_error+0
  198.         MOVF       R0+1, 0
  199.         MOVWF      _d_error+1
  200.         MOVF       R0+2, 0
  201.         MOVWF      _d_error+2
  202.         MOVF       R0+3, 0
  203.         MOVWF      _d_error+3
  204. ;ENCODER.c,46 ::                 ud=kd*(d_error)/t_muestreo;
  205.         MOVF       FLOC__pid+0, 0
  206.         MOVWF      R4+0
  207.         MOVF       FLOC__pid+1, 0
  208.         MOVWF      R4+1
  209.         MOVF       FLOC__pid+2, 0
  210.         MOVWF      R4+2
  211.         MOVF       FLOC__pid+3, 0
  212.         MOVWF      R4+3
  213.         CALL       _Mul_32x32_FP+0
  214.         MOVF       R0+0, 0
  215.         MOVWF      FLOC__pid+0
  216.         MOVF       R0+1, 0
  217.         MOVWF      FLOC__pid+1
  218.         MOVF       R0+2, 0
  219.         MOVWF      FLOC__pid+2
  220.         MOVF       R0+3, 0
  221.         MOVWF      FLOC__pid+3
  222.         MOVF       FLOC__pid+0, 0
  223.         MOVWF      _ud+0
  224.         MOVF       FLOC__pid+1, 0
  225.         MOVWF      _ud+1
  226.         MOVF       FLOC__pid+2, 0
  227.         MOVWF      _ud+2
  228.         MOVF       FLOC__pid+3, 0
  229.         MOVWF      _ud+3
  230. ;ENCODER.c,48 ::                 ut=up+ui+ud;
  231.         MOVF       _up+0, 0
  232.         MOVWF      R0+0
  233.         MOVF       _up+1, 0
  234.         MOVWF      R0+1
  235.         MOVF       _up+2, 0
  236.         MOVWF      R0+2
  237.         MOVF       _up+3, 0
  238.         MOVWF      R0+3
  239.         MOVF       FLOC__pid+4, 0
  240.         MOVWF      R4+0
  241.         MOVF       FLOC__pid+5, 0
  242.         MOVWF      R4+1
  243.         MOVF       FLOC__pid+6, 0
  244.         MOVWF      R4+2
  245.         MOVF       FLOC__pid+7, 0
  246.         MOVWF      R4+3
  247.         CALL       _Add_32x32_FP+0
  248.         MOVF       FLOC__pid+0, 0
  249.         MOVWF      R4+0
  250.         MOVF       FLOC__pid+1, 0
  251.         MOVWF      R4+1
  252.         MOVF       FLOC__pid+2, 0
  253.         MOVWF      R4+2
  254.         MOVF       FLOC__pid+3, 0
  255.         MOVWF      R4+3
  256.         CALL       _Add_32x32_FP+0
  257.         MOVF       R0+0, 0
  258.         MOVWF      _ut+0
  259.         MOVF       R0+1, 0
  260.         MOVWF      _ut+1
  261.         MOVF       R0+2, 0
  262.         MOVWF      _ut+2
  263.         MOVF       R0+3, 0
  264.         MOVWF      _ut+3
  265. ;ENCODER.c,50 ::                 if (ut>max_x) ut=max_x;
  266.         MOVF       R0+0, 0
  267.         MOVWF      R4+0
  268.         MOVF       R0+1, 0
  269.         MOVWF      R4+1
  270.         MOVF       R0+2, 0
  271.         MOVWF      R4+2
  272.         MOVF       R0+3, 0
  273.         MOVWF      R4+3
  274.         MOVLW      0
  275.         MOVWF      R0+0
  276.         MOVLW      0
  277.         MOVWF      R0+1
  278.         MOVLW      127
  279.         MOVWF      R0+2
  280.         MOVLW      134
  281.         MOVWF      R0+3
  282.         CALL       _Compare_Double+0
  283.         MOVLW      1
  284.         BTFSC      STATUS+0, 0
  285.         MOVLW      0
  286.         MOVWF      R0+0
  287.         MOVF       R0+0, 0
  288.         BTFSC      STATUS+0, 2
  289.         GOTO       L_pid2
  290.         MOVLW      0
  291.         MOVWF      _ut+0
  292.         MOVLW      0
  293.         MOVWF      _ut+1
  294.         MOVLW      127
  295.         MOVWF      _ut+2
  296.         MOVLW      134
  297.         MOVWF      _ut+3
  298. L_pid2:
  299. ;ENCODER.c,51 ::                 if (ut<min_x) ut=min_x;
  300.         MOVLW      0
  301.         MOVWF      R4+0
  302.         MOVLW      0
  303.         MOVWF      R4+1
  304.         MOVLW      255
  305.         MOVWF      R4+2
  306.         MOVLW      134
  307.         MOVWF      R4+3
  308.         MOVF       _ut+0, 0
  309.         MOVWF      R0+0
  310.         MOVF       _ut+1, 0
  311.         MOVWF      R0+1
  312.         MOVF       _ut+2, 0
  313.         MOVWF      R0+2
  314.         MOVF       _ut+3, 0
  315.         MOVWF      R0+3
  316.         CALL       _Compare_Double+0
  317.         MOVLW      1
  318.         BTFSC      STATUS+0, 0
  319.         MOVLW      0
  320.         MOVWF      R0+0
  321.         MOVF       R0+0, 0
  322.         BTFSC      STATUS+0, 2
  323.         GOTO       L_pid3
  324.         MOVLW      0
  325.         MOVWF      _ut+0
  326.         MOVLW      0
  327.         MOVWF      _ut+1
  328.         MOVLW      255
  329.         MOVWF      _ut+2
  330.         MOVLW      134
  331.         MOVWF      _ut+3
  332. L_pid3:
  333. ;ENCODER.c,53 ::                 ui_=ui;
  334.         MOVF       _ui+0, 0
  335.         MOVWF      _ui_+0
  336.         MOVF       _ui+1, 0
  337.         MOVWF      _ui_+1
  338.         MOVF       _ui+2, 0
  339.         MOVWF      _ui_+2
  340.         MOVF       _ui+3, 0
  341.         MOVWF      _ui_+3
  342. ;ENCODER.c,54 ::                 error_=error;
  343.         MOVF       _error+0, 0
  344.         MOVWF      _error_+0
  345.         MOVF       _error+1, 0
  346.         MOVWF      _error_+1
  347.         MOVF       _error+2, 0
  348.         MOVWF      _error_+2
  349.         MOVF       _error+3, 0
  350.         MOVWF      _error_+3
  351. ;ENCODER.c,56 ::                 }
  352. L_end_pid:
  353.         RETURN
  354. ; end of _pid

  355. _Interrpciones:
  356.         MOVWF      R15+0
  357.         SWAPF      STATUS+0, 0
  358.         CLRF       STATUS+0
  359.         MOVWF      ___saveSTATUS+0
  360.         MOVF       PCLATH+0, 0
  361.         MOVWF      ___savePCLATH+0
  362.         CLRF       PCLATH+0

  363. ;ENCODER.c,64 ::                 void Interrpciones() iv 0x0004 ics ICS_AUTO
  364. ;ENCODER.c,66 ::                 if (INTF_bit==1)
  365.         BTFSS      INTF_bit+0, BitPos(INTF_bit+0)
  366.         GOTO       L_Interrpciones4
  367. ;ENCODER.c,68 ::                 if (PORTB.RB1==PORTB.RB0) pulsos++; else pulsos--;
  368.         BTFSC      PORTB+0, 1
  369.         GOTO       L__Interrpciones17
  370.         BTFSS      PORTB+0, 0
  371.         GOTO       L__Interrpciones18
  372.         GOTO       L_Interrpciones5
  373. L__Interrpciones17:
  374.         BTFSS      PORTB+0, 0
  375.         GOTO       L_Interrpciones5
  376. L__Interrpciones18:
  377.         INCF       _pulsos+0, 1
  378.         BTFSC      STATUS+0, 2
  379.         INCF       _pulsos+1, 1
  380.         GOTO       L_Interrpciones6
  381. L_Interrpciones5:
  382.         MOVLW      1
  383.         SUBWF      _pulsos+0, 1
  384.         BTFSS      STATUS+0, 0
  385.         DECF       _pulsos+1, 1
  386. L_Interrpciones6:
  387. ;ENCODER.c,69 ::                 if (pulsos>50) PULSOS=50;
  388.         MOVLW      128
  389.         MOVWF      R0+0
  390.         MOVLW      128
  391.         XORWF      _pulsos+1, 0
  392.         SUBWF      R0+0, 0
  393.         BTFSS      STATUS+0, 2
  394.         GOTO       L__Interrpciones19
  395.         MOVF       _pulsos+0, 0
  396.         SUBLW      50
  397. L__Interrpciones19:
  398.         BTFSC      STATUS+0, 0
  399.         GOTO       L_Interrpciones7
  400.         MOVLW      50
  401.         MOVWF      _pulsos+0
  402.         MOVLW      0
  403.         MOVWF      _pulsos+1
  404.         GOTO       L_Interrpciones8
  405. L_Interrpciones7:
  406. ;ENCODER.c,70 ::                 else if  (pulsos<-50) PULSOS=-50;
  407.         MOVLW      128
  408.         XORWF      _pulsos+1, 0
  409.         MOVWF      R0+0
  410.         MOVLW      127
  411.         SUBWF      R0+0, 0
  412.         BTFSS      STATUS+0, 2
  413.         GOTO       L__Interrpciones20
  414.         MOVLW      206
  415.         SUBWF      _pulsos+0, 0
  416. L__Interrpciones20:
  417.         BTFSC      STATUS+0, 0
  418.         GOTO       L_Interrpciones9
  419.         MOVLW      206
  420.         MOVWF      _pulsos+0
  421.         MOVLW      255
  422.         MOVWF      _pulsos+1
  423. L_Interrpciones9:
  424. L_Interrpciones8:
  425. ;ENCODER.c,71 ::                 INTEDG_bit=~INTEDG_bit; //cambia el flanco a detectar modo 2x
  426.         MOVLW
  427.         XORWF      INTEDG_bit+0, 1
  428. ;ENCODER.c,72 ::                 INTF_bit=0; //limpia bandera de interrupcion
  429.         BCF        INTF_bit+0, BitPos(INTF_bit+0)
  430. ;ENCODER.c,73 ::                 }
  431. L_Interrpciones4:
  432. ;ENCODER.c,75 ::                 }
  433. L_end_Interrpciones:
  434. L__Interrpciones16:
  435.         MOVF       ___savePCLATH+0, 0
  436.         MOVWF      PCLATH+0
  437.         SWAPF      ___saveSTATUS+0, 0
  438.         MOVWF      STATUS+0
  439.         SWAPF      R15+0, 1
  440.         SWAPF      R15+0, 0
  441.         RETFIE
  442. ; end of _Interrpciones

  443. _main:

  444. ;ENCODER.c,77 ::                 void main()
  445. ;ENCODER.c,79 ::                 TRISB=255;  //TODO ENTRADAS
  446.         MOVLW      255
  447.         MOVWF      TRISB+0
  448. ;ENCODER.c,80 ::                 TRISC=0;    //TODOS SALIDAS
  449.         CLRF       TRISC+0
  450. ;ENCODER.c,81 ::                 trisa=255; //todo entradas
  451.         MOVLW      255
  452.         MOVWF      TRISA+0
  453. ;ENCODER.c,83 ::                 trisb.b3=0;   //salida control de giro
  454.         BCF        TRISB+0, 3
  455. ;ENCODER.c,84 ::                 trisb.b4=0;  //Salida Contro de giro
  456.         BCF        TRISB+0, 4
  457. ;ENCODER.c,87 ::                 adcon0.b0=0;
  458.         BCF        ADCON0+0, 0
  459. ;ENCODER.c,88 ::                 adcon1=0;
  460.         CLRF       ADCON1+0
  461. ;ENCODER.c,89 ::                 Lcd_Init();                        // Initialize LCD
  462.         CALL       _Lcd_Init+0
  463. ;ENCODER.c,91 ::                 Lcd_Cmd(_LCD_CLEAR);               // Clear display
  464.         MOVLW      1
  465.         MOVWF      FARG_Lcd_Cmd_out_char+0
  466.         CALL       _Lcd_Cmd+0
  467. ;ENCODER.c,92 ::                 Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off
  468.         MOVLW      12
  469.         MOVWF      FARG_Lcd_Cmd_out_char+0
  470.         CALL       _Lcd_Cmd+0
  471. ;ENCODER.c,93 ::                 Lcd_Out(1,1,"    CONTROL ARZ");
  472.         MOVLW      1
  473.         MOVWF      FARG_Lcd_Out_row+0
  474.         MOVLW      1
  475.         MOVWF      FARG_Lcd_Out_column+0
  476.         MOVLW      ?lstr1_ENCODER+0
  477.         MOVWF      FARG_Lcd_Out_text+0
  478.         CALL       _Lcd_Out+0
  479. ;ENCODER.c,94 ::                 Lcd_Out(2,1,"SET_POINT=");
  480.         MOVLW      2
  481.         MOVWF      FARG_Lcd_Out_row+0
  482.         MOVLW      1
  483.         MOVWF      FARG_Lcd_Out_column+0
  484.         MOVLW      ?lstr2_ENCODER+0
  485.         MOVWF      FARG_Lcd_Out_text+0
  486.         CALL       _Lcd_Out+0
  487. ;ENCODER.c,95 ::                 Lcd_Out(4,1,"PULSOS=");
  488.         MOVLW      4
  489.         MOVWF      FARG_Lcd_Out_row+0
  490.         MOVLW      1
  491.         MOVWF      FARG_Lcd_Out_column+0
  492.         MOVLW      ?lstr3_ENCODER+0
  493.         MOVWF      FARG_Lcd_Out_text+0
  494.         CALL       _Lcd_Out+0
  495. ;ENCODER.c,97 ::                 ADC_Init();
  496.         CALL       _ADC_Init+0
  497. ;ENCODER.c,98 ::                 PWM1_Init(400);
  498.         BSF        T2CON+0, 0
  499.         BSF        T2CON+0, 1
  500.         MOVLW      156
  501.         MOVWF      PR2+0
  502.         CALL       _PWM1_Init+0
  503. ;ENCODER.c,99 ::                 PWM1_Set_Duty(0);
  504.         CLRF       FARG_PWM1_Set_Duty_new_duty+0
  505.         CALL       _PWM1_Set_Duty+0
  506. ;ENCODER.c,100 ::                 PWM1_Start();
  507.         CALL       _PWM1_Start+0
  508. ;ENCODER.c,105 ::                 INTCON=0B01000000;
  509.         MOVLW      64
  510.         MOVWF      INTCON+0
  511. ;ENCODER.c,107 ::                 INTF_bit=0; //limpia la bansera e interrupcion
  512.         BCF        INTF_bit+0, BitPos(INTF_bit+0)
  513. ;ENCODER.c,108 ::                 INTEDG_bit=0; //por flanco de bajada
  514.         BCF        INTEDG_bit+0, BitPos(INTEDG_bit+0)
  515. ;ENCODER.c,109 ::                 INTE_bit=1; //habilita interrpcion por flanco
  516.         BSF        INTE_bit+0, BitPos(INTE_bit+0)
  517. ;ENCODER.c,110 ::                 GIE_bit=1; //Autoriza interrupciones
  518.         BSF        GIE_bit+0, BitPos(GIE_bit+0)
  519. ;ENCODER.c,116 ::                 while (1)
  520. L_main10:
  521. ;ENCODER.c,118 ::                 codigo=ADC_Get_Sample(0);
  522.         CLRF       FARG_ADC_Get_Sample_channel+0
  523.         CALL       _ADC_Get_Sample+0
  524.         MOVF       R0+0, 0
  525.         MOVWF      _codigo+0
  526.         MOVF       R0+1, 0
  527.         MOVWF      _codigo+1
  528. ;ENCODER.c,121 ::                 setpoint=  0.0978*codigo-50.0;
  529.         CALL       _word2double+0
  530.         MOVLW      94
  531.         MOVWF      R4+0
  532.         MOVLW      75
  533.         MOVWF      R4+1
  534.         MOVLW      72
  535.         MOVWF      R4+2
  536.         MOVLW      123
  537.         MOVWF      R4+3
  538.         CALL       _Mul_32x32_FP+0
  539.         MOVLW      0
  540.         MOVWF      R4+0
  541.         MOVLW      0
  542.         MOVWF      R4+1
  543.         MOVLW      72
  544.         MOVWF      R4+2
  545.         MOVLW      132
  546.         MOVWF      R4+3
  547.         CALL       _Sub_32x32_FP+0
  548.         MOVF       R0+0, 0
  549.         MOVWF      _setpoint+0
  550.         MOVF       R0+1, 0
  551.         MOVWF      _setpoint+1
  552.         MOVF       R0+2, 0
  553.         MOVWF      _setpoint+2
  554.         MOVF       R0+3, 0
  555.         MOVWF      _setpoint+3
  556. ;ENCODER.c,123 ::                 pid(pulsos);
  557.         MOVF       _pulsos+0, 0
  558.         MOVWF      R0+0
  559.         MOVF       _pulsos+1, 0
  560.         MOVWF      R0+1
  561.         CALL       _int2double+0
  562.         MOVF       R0+0, 0
  563.         MOVWF      FARG_pid_pid_in+0
  564.         MOVF       R0+1, 0
  565.         MOVWF      FARG_pid_pid_in+1
  566.         MOVF       R0+2, 0
  567.         MOVWF      FARG_pid_pid_in+2
  568.         MOVF       R0+3, 0
  569.         MOVWF      FARG_pid_pid_in+3
  570.         CALL       _pid+0
  571. ;ENCODER.c,125 ::                 if (ut<0)    //gira a la derecha     analiza la salida para determinar giro
  572.         CLRF       R4+0
  573.         CLRF       R4+1
  574.         CLRF       R4+2
  575.         CLRF       R4+3
  576.         MOVF       _ut+0, 0
  577.         MOVWF      R0+0
  578.         MOVF       _ut+1, 0
  579.         MOVWF      R0+1
  580.         MOVF       _ut+2, 0
  581.         MOVWF      R0+2
  582.         MOVF       _ut+3, 0
  583.         MOVWF      R0+3
  584.         CALL       _Compare_Double+0
  585.         MOVLW      1
  586.         BTFSC      STATUS+0, 0
  587.         MOVLW      0
  588.         MOVWF      R0+0
  589.         MOVF       R0+0, 0
  590.         BTFSC      STATUS+0, 2
  591.         GOTO       L_main12
  592. ;ENCODER.c,127 ::                 ut=-ut;   // el valor del pwm en cada sentido debe ser solo positivo
  593.         MOVLW      0
  594.         XORWF      _ut+0, 1
  595.         MOVLW      0
  596.         XORWF      _ut+1, 1
  597.         MOVLW      128
  598.         XORWF      _ut+2, 1
  599.         MOVLW      0
  600.         XORWF      _ut+3, 1
  601. ;ENCODER.c,128 ::                 m11=1;
  602.         BSF        PORTB+0, 3
  603. ;ENCODER.c,129 ::                 m12=0;
  604.         BCF        PORTB+0, 4
  605. ;ENCODER.c,130 ::                 }
  606.         GOTO       L_main13
  607. L_main12:
  608. ;ENCODER.c,133 ::                 m11=0;
  609.         BCF        PORTB+0, 3
  610. ;ENCODER.c,134 ::                 m12=1;
  611.         BSF        PORTB+0, 4
  612. ;ENCODER.c,136 ::                 }
  613. L_main13:
  614. ;ENCODER.c,140 ::                 PWM1_Set_Duty(ut); //salida pid   po PWM
  615.         MOVF       _ut+0, 0
  616.         MOVWF      R0+0
  617.         MOVF       _ut+1, 0
  618.         MOVWF      R0+1
  619.         MOVF       _ut+2, 0
  620.         MOVWF      R0+2
  621.         MOVF       _ut+3, 0
  622.         MOVWF      R0+3
  623.         CALL       _double2byte+0
  624.         MOVF       R0+0, 0
  625.         MOVWF      FARG_PWM1_Set_Duty_new_duty+0
  626.         CALL       _PWM1_Set_Duty+0
  627. ;ENCODER.c,142 ::                 inttostr(setpoint,texto);
  628.         MOVF       _setpoint+0, 0
  629.         MOVWF      R0+0
  630.         MOVF       _setpoint+1, 0
  631.         MOVWF      R0+1
  632.         MOVF       _setpoint+2, 0
  633.         MOVWF      R0+2
  634.         MOVF       _setpoint+3, 0
  635.         MOVWF      R0+3
  636.         CALL       _double2int+0
  637.         MOVF       R0+0, 0
  638.         MOVWF      FARG_IntToStr_input+0
  639.         MOVF       R0+1, 0
  640.         MOVWF      FARG_IntToStr_input+1
  641.         MOVLW      _texto+0
  642.         MOVWF      FARG_IntToStr_output+0
  643.         CALL       _IntToStr+0
  644. ;ENCODER.c,144 ::                 lcd_Out(2,11,"       ");
  645.         MOVLW      2
  646.         MOVWF      FARG_Lcd_Out_row+0
  647.         MOVLW      11
  648.         MOVWF      FARG_Lcd_Out_column+0
  649.         MOVLW      ?lstr4_ENCODER+0
  650.         MOVWF      FARG_Lcd_Out_text+0
  651.         CALL       _Lcd_Out+0
  652. ;ENCODER.c,145 ::                 Lcd_Out(2,11,texto);
  653.         MOVLW      2
  654.         MOVWF      FARG_Lcd_Out_row+0
  655.         MOVLW      11
  656.         MOVWF      FARG_Lcd_Out_column+0
  657.         MOVLW      _texto+0
  658.         MOVWF      FARG_Lcd_Out_text+0
  659.         CALL       _Lcd_Out+0
  660. ;ENCODER.c,147 ::                 inttostr(pulsos,texto);
  661.         MOVF       _pulsos+0, 0
  662.         MOVWF      FARG_IntToStr_input+0
  663.         MOVF       _pulsos+1, 0
  664.         MOVWF      FARG_IntToStr_input+1
  665.         MOVLW      _texto+0
  666.         MOVWF      FARG_IntToStr_output+0
  667.         CALL       _IntToStr+0
  668. ;ENCODER.c,148 ::                 lcd_Out(4,8,"      ");
  669.         MOVLW      4
  670.         MOVWF      FARG_Lcd_Out_row+0
  671.         MOVLW      8
  672.         MOVWF      FARG_Lcd_Out_column+0
  673.         MOVLW      ?lstr5_ENCODER+0
  674.         MOVWF      FARG_Lcd_Out_text+0
  675.         CALL       _Lcd_Out+0
  676. ;ENCODER.c,149 ::                 lcd_Out(4,8,texto);
  677.         MOVLW      4
  678.         MOVWF      FARG_Lcd_Out_row+0
  679.         MOVLW      8
  680.         MOVWF      FARG_Lcd_Out_column+0
  681.         MOVLW      _texto+0
  682.         MOVWF      FARG_Lcd_Out_text+0
  683.         CALL       _Lcd_Out+0
  684. ;ENCODER.c,154 ::                 }
  685.         GOTO       L_main10
  686. ;ENCODER.c,158 ::                 }
  687. L_end_main:
  688.         GOTO       $+0
  689. ; end of _main
复制代码

所有资料51hei提供下载:
Encoder control de posicion motor.rar (90.61 KB, 下载次数: 10)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表