Autor Tema: pwm y motor encoder. en asm  (Leído 9060 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
pwm y motor encoder. en asm
« en: 21 de Diciembre de 2009, 13:12:45 »
por mi reciente interes por las cosas que se mueven decidi empezar de cero a manejar un motor. me he podido imaginar mas menos como funciona un puente en H y como seria manejarlo con dos señales. una seria el clock y otra de direccion, ya iremos añadiendo mas cosillas como el enable. estas son las que usare por que son las que envia la controladora de mi maquina, teneis el esbozo del circuito en el foro tecnico (sigo buscando info para aprender a montarlo adecuadamente) de momento estoy haciendo el prog y verificando en el isis. ya ni me acordaba que existia. hasta que me dejen hacer ruido en casa y pueda hacer los circuitos.
os dejo el codigo y la simulacion para el que quiera echarle un ojo. es bastante simple, solo usa interrupciones.
 el programa lo que hace es cuando llega un clock por portb,0 lee la entrada de direccion y segun eso tira un pwm por unas u otras salidas hasta que le llega el siguiente paso del encoder, momento en el que intercala un frenado con aceleraciones hasta que termina el pulso del encoder y mantiene bloqueado el bobinado esperando el siguiente clock desde la controladora. esto es el caso ideal de que no llegue otro pulso antes de que termine este lo que seria que le estamos pidiendo demasiado al motor o aumentar el ciclo positivo cambiando el valor de ccpr1H/L

pero, siempre hay un pero. tengo una duda el tmr1 lo he configurado como temporizador y el cristal que usa el pic es de 20Mhz lo que me da Fosc/4=5Mhz. con el preescaler a 1:8; 5Mhz/8=625Khz es asi?? con estas cosas me lio, solo esta en alto durante el tiempo que tarda en igualarse con ccp1H/L y en bajo hasta que desborda. a que frecuencia mas menos se suele hacer el pwm para un motor, creo haber leido que a unos 20Khz, lo estoy buscando pero ahoramismo no se ande lo vi. haciendo 45 bucles antes de cambiar se queda en 625Khz/45=13,88 pues no se si esto se hace asip?? o puedo limitarme a probar a ojo de buen cubero a ver con cual va mejor

esta sin hacer el puente simulado en proteus, me esta dando guerra, en cuanto pongo los irfz44n el prog se bloquea, sera que va a explotar cuando lo monte. asi que bueno con el oscilografo voy probando que sucede a la salida de la puertas, con los pulsadores y el switch simulan los pulsos del encoder y la controladora. para poder apreciar en isis los cambios en el oscilografo se debe configurar el preescaler a 1:1 y un bucle. no useis los 45 que os podeis hacer viejos

os dejo el programa para que le echeis un ojo

Código: ASM
  1. #include        <P16F877A.INC
  2.                         __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC&_BODEN_ON&_LVP_OFF
  3.                         #include        <config_dvr_uni.inc>
  4.                         #include        <rutinas.inc>
  5.                         #include        <definiciones.inc>
  6.  
  7. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  8. ;####################################################################################################################
  9.                         org             0x0000 
  10.         PAGESEL CONFIG_DRV_16F877
  11.         GOTO    CONFIG_DRV_16F877
  12. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  13. ;####################################################################################################################
  14.                         ORG             0X0004
  15.         RUTINA_DE_INTERRUPCION
  16. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  17. ;####################################################################################################################
  18. PROGRAMA
  19. ;       SLEEP
  20.         GOTO    PROGRAMA
  21. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  22. ;####################################################################################################################
  23.                         ORG     0X0800
  24.  
  25.         CONFIGURACION
  26.  
  27.  
  28.                         end

Código: ASM
  1. CBLOCK  0X20
  2.                         PUNTEROS
  3.                         PDel0
  4.                         PDel1
  5.                         PDel2
  6.                         BOBINAS
  7.                         BUCLES_PWM
  8.                         ENDC
  9.  
  10.                         CBLOCK  0X70
  11.                         W_TEMP
  12.                         STATUS_TEMP    
  13.                         PCLATH_TEMP
  14.                         FSR_TEMP
  15.                         FSR_TEMP2                      
  16.                         ENDC
  17.  
  18. ;PINES DESDE LA CONTRLADORA
  19. #DEFINE ENABLE                  PORTB,2
  20. #DEFINE CLOCK                   PORTB,0
  21. #DEFINE PIN_DIRECCION   PORTB,1
  22.  
  23. ;BITS DEL CONTROL PUNTEROS
  24. #DEFINE PUNTEROS_DIRECCION      PUNTEROS,0
  25. #DEFINE PUNTEROS_PULSO          PUNTEROS,1
  26.  
  27. ;SALIDAS PARA LAS BOBINAS
  28. #DEFINE BOBINA_1                BOBINAS,0
  29. #DEFINE BOBINA_2                BOBINAS,1
  30. #DEFINE BOBINA_3                BOBINAS,2
  31. #DEFINE BOBINA_4                BOBINAS,3
  32.  
  33. ;PINES DEL ENCODER DEL MOTOR
  34. #DEFINE         CLK_ENCODER             PORTB,3
  35. #DEFINE         DIR_ENCODER             PORTB,6
  36. #DEFINE         VUELTA_ENCODER  PORTB,7
  37.  
  38. ;DATOS DE CONFIGURACION
  39. #DEFINE         TIEMPO_EN_ALTO  .75
  40.  
  41. #DEFINE         DIVISOR_FREC    .1              ;20MHZ TMR1=Fosc/4=5Mhz; 5Mhz/8=625Khz; 625Khz/45=13.88
  42. ;PRUEBAS ESTOY INTENTANDO QUE LO CALCULE AL COMPILAR
  43. #DEFINE         Fosc                    .20000000
  44. #DEFINE         Pre_Divisor_TMR1        B'11'   ;ESTO HABRIA QUE CAMBIARLO EN LA CONF DEL TIMER1 Y EN LA RUTINA DE ACTIVADO
  45. #DEFINE         FRECUENCIA              .12000          ;12 Khz MAS MENOS PA PROBAR

Código: ASM
  1. CONFIGURACION   MACRO
  2. CONFIG_DRV_16F877
  3. CONFIG_TMR2
  4.                 BANKSEL T2CON
  5.                 MOVLW   B'00000000'
  6.                 MOVWF   T2CON          
  7.         ;------------------------------
  8.                 banksel TRISA
  9. CONFIG_TRISA                   
  10.                 MOVLW   B'00000'
  11.                 MOVWF   TRISA
  12. CONFIG_TRISB                   
  13.                 MOVLW   B'11001111'             ;0-CLOCK 1-DIRECCION 2-ENABLE 6-CLOCK_encoder 7-DIR_encoder
  14.                 MOVWF   TRISB  
  15. CONFIG_TRISC           
  16.                 MOVLW   B'00000000'
  17.                 MOVWF   TRISC  
  18. CONFIG_TRISD           
  19.                 MOVLW   B'00000000'             ;0,1,2,3 SON LAS SALIDAS PARA MANEJAR LOS BOBINADOS
  20.                 MOVWF   TRISD  
  21. CONFIG_TRISE
  22.                 MOVLW   B'000'
  23.                 MOVWF   TRISE
  24.         ;-----------------------------
  25. CONFIG_ADCON1                                   ;
  26.                 BANKSEL ADCON1         
  27.                 MOVLW   B'00000000'
  28.                 MOVWF   ADCON1
  29.         ;-----------------------------
  30. CONFIG_OPTION_REG
  31.                 BANKSEL OPTION_REG
  32.                 MOVLW   B'11000000'
  33.                 MOVWF   OPTION_REG
  34.         ;-----------------------------
  35. CONFIG_CCP1_COMP
  36.                 BANKSEL CCPR1L
  37.                 MOVLW   TIEMPO_EN_ALTO
  38.                 MOVWF   CCPR1L
  39.                 MOVWF   CCPR1H
  40.                 MOVLW   B'00001010'             ;BITS 3-0=1010 MODO COMPARACION ACTIVA CCP1IF SIN EFECTO EN LA PATILLA CCPx
  41.                 MOVWF   CCP1CON
  42. CONFIG_TMR1    
  43.                 BANKSEL T1CON                   ;00000111
  44.                 BSF             T1CON,T1CKPS1   ;SELECCION DEL PREESCALER DEL TMR0
  45.                 BSF             T1CON,T1CKPS0   ;SELECCION DEL PREESCALER DEL TMR0
  46.                 BCF             T1CON,T1OSCEN   ;ACTIVACION OSCILADOR POR CRISTAL  
  47.                 BCF             T1CON,T1SYNC    ;CONTROL ASINC EXTERNO
  48.                 BCF             T1CON,TMR1CS    ;SELECCION DE RELOJ  0=INT 1=EXT
  49.                 BCF             T1CON,TMR1ON    ;1-ACTIVADO 0-DESACT. TIMER0
  50.  
  51. CONFIG_INTERRUPTS
  52.                 BANKSEL PIE1
  53.                 CLRF    PIE1
  54.                 BSF             PIE1,CCP1IE             ;INT DEL MODULO COMPARADOR
  55.                 BSF             PIE1,TMR1IE             ;INT DEL TIMER1
  56.  
  57.                 CLRF    PIE2
  58.                 movlw   b'11011000'             ;activation of the interrupts
  59.                 movwf   INTCON 
  60.         ;------------------------------
  61.                         BANKSEL BUCLES_PWM     
  62.                         MOVLW   .1
  63.                         MOVWF   BUCLES_PWM
  64.                         CLRF    PUNTEROS
  65.  
  66.         PAGESEL PROGRAMA
  67.         GOTO    PROGRAMA
  68. ENDM[/quote]
  69.  
  70. [code=asm]                      #include        <P16F877A.INC
  71.                         __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC&_BODEN_ON&_LVP_OFF
  72.                         #include        <config_dvr_uni.inc>
  73.                         #include        <rutinas.inc>
  74.                         #include        <definiciones.inc>
  75.  
  76. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  77. ;####################################################################################################################
  78.                         org             0x0000 
  79.         PAGESEL CONFIG_DRV_16F877
  80.         GOTO    CONFIG_DRV_16F877
  81. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  82. ;####################################################################################################################
  83.                         ORG             0X0004
  84.         RUTINA_DE_INTERRUPCION
  85. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  86. ;####################################################################################################################
  87. PROGRAMA
  88. ;       SLEEP
  89.         GOTO    PROGRAMA
  90. ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  91. ;####################################################################################################################
  92.                         ORG     0X0800
  93.  
  94.         CONFIGURACION
  95.  
  96.  
  97.                         end

Código: ASM
  1. RUTINA_DE_INTERRUPCION  MACRO
  2.                 ;------------------------------------------------------------------------------
  3.                 ;------------------GUARDA LOS VALORES DE LOS REGISTROS PRINCIPALES-------------
  4.                         MOVWF   W_TEMP                  ;guardamos W,..
  5.                         SWAPF   STATUS,W                ;le damos la vuelta a STATUS en w
  6.                         MOVWF   STATUS_TEMP             ;y lo guardamos en STATUS_TEMP
  7.                         SWAPF   PCLATH,W                ;PCLATH a W
  8.                         MOVWF   PCLATH_TEMP             ;y de W a PCLATH_TEMP
  9.                         banksel FSR                             ;banco de FSR
  10.                         MOVF    FSR,W                   ;FSR a W
  11.                         MOVWF   FSR_TEMP                ;y de W a FSR_TEMP
  12.                 ;------------------------------------------------------------------------------
  13.                 ;------------------CLASIFICACION DE CUAL INTERRUPCION HA SALTADO---------------
  14.                         BTFSC   INTCON,INTF             ;test si ha sido RB0
  15.                         CALL    INT_RB0                 ;va a la rutina de RB0
  16.                         BTFSC   INTCON,RBIF
  17.                         CALL    INT_RB
  18.                         BANKSEL PIR1
  19.                         BTFSC   PIR1,CCP1IF             ;SALTA CUANDO COINCIDE CON EL TMR1
  20.                         CALL    GEN_FREC_PWM
  21.                         BANKSEL PIR1
  22.                         BTFSC   PIR1,TMR1IF             ;NO SE SI SE PONE A CERO EL TMR1 CUANDO COINCIDEN
  23.                         CALL    GEN_FREC_PWM_TMR1
  24.                 ;------------------------------------------------------------------------------
  25.                 ;-----------------RECARGA LOS VALORES QUE HABIA ANTES DE LA INTERRUPCION-------
  26. FIN_INT                
  27.                         BANKSEL FSR
  28.                         MOVF    FSR_TEMP,W
  29.                         MOVWF   FSR                                                                    
  30.                         SWAPF   PCLATH_TEMP,W
  31.                         MOVWF   PCLATH
  32.                         swapf   STATUS_TEMP,W
  33.                         movwf   STATUS 
  34.                 MOVF    W_TEMP,W                               
  35.                         RETFIE
  36.                 ;-------------------------------------------------------------------------------
  37.  
  38.                 ;//////////////////////////////////////////////////////////////////////////////////////////////
  39.                 ;--------------------SERVICIO DE INTERRUPCIONES---------------------------------
  40.                 ;//////////////////////////////////////////////////////////////////////////////////////////////
  41. INT_RB0                
  42.                         BANKSEL PORTB                                          
  43.                         BCF             INTCON,INTF                     ;resetea la bandera
  44.                         BTFSS   PIN_DIRECCION           ;test de direccion
  45.                         GOTO    ATRAS
  46. ADELANTE
  47.                         BSF             PUNTEROS_DIRECCION      ;SEÑALA EN QUE DIRECCION HA LLEGADO EL PULSO
  48.                         GOTO    ARRANCA
  49. ATRAS          
  50.                         BCF             PUNTEROS_DIRECCION      ;IDEM
  51. ARRANCA                                                                 ;UN SISTEMA PARA SABER SI SE LE ESTA PIDIENDO DEMASIADO AL MOTOR PUEDE SER VERIFICAR SI ESTA
  52.                                                                                 ;- A UNO EL BIT TMR1ON, ESTO QUERRIA DECIR QUE AUN NO ALCANZO EL SIGUIENTE PASO DEL ENCODER,
  53.                                                                                 ;- POR LO QUE SE PUDO QUEDAR FRENADO O SIMPLEMENTE SE LE ESTA PIDIENDO DEMASIADA VELOCIDAD DESDE
  54.                                                                                 ;- LA CONTROLADORA
  55.                         BANKSEL T1CON
  56.                         BTFSC   T1CON,TMR1ON
  57.                         RETURN
  58.                         CLRF    TMR1L                           ;RESETEA EL TMR1
  59.                         CLRF    TMR1H
  60.                         BSF             T1CON,T1CKPS1
  61.                         BSF             T1CON,T1CKPS0
  62.                         BSF             T1CON,TMR1ON            ;ENCIENDE EL TMR1 PARA GENERAR LA FRECUENCIA, CUANDO COINCIDE CON EL MODULO CCP1
  63.                                                                                 ;- O POR DESBORDE DEL TMR1  
  64.                         RETURN
  65.         ;----------------------------------------------------------------------------------------------
  66. GEN_FREC_PWM_TMR1
  67.                         BCF             PIR1,TMR1IF             ;LIMPIA EL FLAG
  68.                         GOTO    GEN_FREC_PWM_TMR1_1
  69.         ;----------------------------------------------------------------------------------------------
  70. GEN_FREC_PWM
  71.                         BCF             PIR1,CCP1IF             ;LIMPIA EL FLAG
  72. GEN_FREC_PWM_TMR1_1                                    
  73.                         ;-----------------------
  74.                 BANKSEL PORTB
  75.  
  76.                         DECFSZ  BUCLES_PWM
  77.                         RETURN
  78.                         MOVLW   DIVISOR_FREC
  79.                         MOVWF   BUCLES_PWM
  80.                                                                 ;CUALQUIERA DE LOS DESBORDES HACE CAMBIAR EL PWM, CUANTO MAS LARGO UNO MAS CORTO EL OTRO
  81.         ;               MOVF    PORTD,W
  82.         ;               ANDLW   B'11110000'             ;RESPETA LOS BITS 7-4 Y 3-0 LOS PONE A CERO
  83.         ;               MOVWF   PORTD                   ;Y SACA AL PUERTO
  84.                         BTFSS   PUNTEROS_DIRECCION      ;TESTEA EN QUE DIRECCION TIENE QUE GIRAR
  85.                         GOTO    PWM_ADELANTE            ;SEGUN EL PULSO DE DIR QUE HAYA LLEGADO POR EL PUERTO DE LA CONTROLADORA. EN LA INTERRUPCION DE
  86.                                                                                 ;RB0 CADA VEZ QUE LLEGA UN PULSO, GUARDA EN ESTE BIT EL ESTADO DE PORTB1=PIN_DIRRECCION
  87. PWM_ATRAS
  88.                         BTFSS   PUNTEROS_PULSO          ;Y TESTEA SI EL ULTIMO PULSO FUE ALTO O BAJO, PARA HACER LO CONTRARIO
  89.                         GOTO    A_CERO
  90.                         MOVF    PORTD,W
  91.                         ANDLW   B'11110000'             ;RESPETA LOS BITS 7-4 Y 3-0 LOS PONE A CERO
  92.                         MOVWF   BOBINAS                 ;LO GUARDA EN BOBINAS
  93.                         BSF             BOBINA_2               
  94.                         BSF             BOBINA_4
  95.                         MOVF    BOBINAS,W               ;CARGA EN W
  96.                         MOVWF   PORTD                   ;Y SACA AL PUERTO
  97.                         BCF             PUNTEROS_PULSO          ;PONE A UNO EL INDICADOR PARA EN EL SIGUIENTE PONERLO A CERO
  98.                         RETURN
  99.  
  100. PWM_ADELANTE
  101.                         BTFSS   PUNTEROS_PULSO 
  102.                         GOTO    A_CERO
  103.                         MOVF    PORTD,W
  104.                         ANDLW   B'11110000'             ;RESPETA LOS BITS 7-4 Y 3-0 LOS PONE A CERO
  105.                         MOVWF   BOBINAS                 ;LO GUARDA EN BOBINAS
  106.                         BSF             BOBINA_1               
  107.                         BSF             BOBINA_3
  108.                         MOVF    BOBINAS,W               ;CARGA EN W
  109.                         MOVWF   PORTD                   ;Y SACA AL PUERTO
  110.                         BCF             PUNTEROS_PULSO 
  111.                         RETURN
  112.  
  113. A_CERO
  114.                         MOVF    PORTD,W
  115.                         ANDLW   B'11110000'             ;RESPETA LOS BITS 7-4 Y 3-0 LOS PONE A CERO
  116.                         MOVWF   PORTD                   ;Y SACA AL PUERTO
  117.                         BSF             PUNTEROS_PULSO  ;;PONE A CERO EL INDICADOR PARA EN EL SIGUIENTE PONERLO A UNO
  118.                         RETURN
  119.  
  120.         ;----------------------------------------------------------------------------------------------
  121. INT_RB
  122.                         BCF             INTCON,RBIF             ;SI EL TIMER ESTA ENCENDIDO ES POR QUE LLEGO ALGUN PULSO POR EL CLOCK
  123.                         BANKSEL T1CON
  124.                         BTFSS   T1CON,TMR1ON
  125.                         RETURN
  126.                         BCF             T1CON,TMR1ON    ;UNA VEZ SE APAGA EL TIMER, EL MODULO DE COMPARACION SE QUEDA ESTATICO, A LA ESPERA.
  127.         ;UN MOTOR DC SE FRENA?¿? HE LEIDO QUE SE PONE A UNO UNO DE LOS CUATRO MOSFET,  
  128. REPITE_FRENO                   
  129.                         banksel PDel0
  130.                         CALL    FRENO                   ;FRENA EL MOTOR
  131.  
  132.                         CALL    DEMORA                  ;ESPERA UNOS MS
  133.  
  134.                         BTFSS   PUNTEROS_DIRECCION      ;VERIFICA EN QUE SENTIDO ESTABA ANDANDO EL MOTOR
  135.                         GOTO    FRENO_ATRAS
  136. FRENO_ADELANTE                                                  ;PARA ADELANTAR
  137.                         CALL    PWM_ADELANTE
  138.                         GOTO    SALE_FRENO
  139. FRENO_ATRAS                    
  140.                         CALL    PWM_ATRAS                       ;U ATRASAR
  141.                         GOTO    SALE_FRENO
  142.  
  143. SALE_FRENO
  144.                         CALL    DEMORA                          ;ESPERA UNOS MS CON EL PULSO ALTO, PARA QUE SE MUEVA EL MOTOR
  145.                         CALL    FRENO                           ;LO VUELVE A DEJAR FRENADO
  146.                         BTFSC   PORTB,6                         ;TESTEA SI EL MOTOR HA TERMINADO EL PASO HASTA EL FINAL  
  147.                         GOTO    REPITE_FRENO            ;SI NO ESTA NUEVAMENTE A CERO, VUELVE A EMPEZAR PARA MOVERLO HASTA QUE TERMINE Y SE QUEDE FRENADO
  148.                         BCF             PUNTEROS_PULSO
  149.                         RETURN
  150.  
  151.  
  152.  
  153. DEMORA  movlw     .6        ; 1 set numero de repeticion  (B)
  154.         movwf     PDel0     ; 1 |
  155. PLoop1  movlw     .207      ; 1 set numero de repeticion  (A)
  156.         movwf     PDel1     ; 1 |
  157. PLoop2  clrwdt              ; 1 clear watchdog
  158.         decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
  159.         goto      PLoop2    ; 2 no, loop
  160.         decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
  161.         goto      PLoop1    ; 2 no, loop
  162. PDelL1  goto PDelL2         ; 2 ciclos delay
  163. PDelL2  clrwdt              ; 1 ciclo delay
  164.         return              ; 2+2 Fin.
  165.         ;-------------------------------
  166.  
  167. FRENO
  168.                         MOVF    PORTD,W
  169.                         ANDLW   B'11110000'             ;RESPETA LOS BITS 7-4 Y 3-0 LOS PONE A CERO
  170.                         MOVWF   BOBINAS                 ;LO GUARDA EN BOBINAS
  171.                         BSF             BOBINA_1                ;PONE A UNO LA SALIDA PARA FRENAR EN UN SENTIDO
  172.                         MOVF    BOBINAS,W               ;CARGA EN W
  173.                         MOVWF   PORTD                   ;Y SACA AL PUERTO
  174.                         RETURN
  175. ;-------------------------------------------------------------
  176.  
  177.  
  178.         ENDM
[/code]

un saludo
« Última modificación: 07 de Febrero de 2010, 18:16:53 por Suky »

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: pwm y motor encoder. en asm
« Respuesta #1 en: 22 de Diciembre de 2009, 16:31:19 »
http://www.secyt.frba.utn.edu.ar/gia/SDC16.pdf


Echale un ojo a esto creo que te sera util

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: pwm y motor encoder. en asm
« Respuesta #2 en: 22 de Diciembre de 2009, 19:05:09 »
joé munchas gracias, esta frase en concreto es la que me ha abierto los ojillos de topo
Citar
variando el ciclo de actividad de los
pulsos, se varía el valor medio de la tensión resultante
en el tiempo, con lo que se modifica la cantidad de
corriente circulante por las espiras de los bobinados.
vamos que usando diferentes pwm varia la tension media de cada bobinado. y no andaba tan desencaminado con los comparadores, usea que podria manejar la excitacion de los bobinados variando la tension de referencia en los comparadores¡¡
y a hacer pruebas, os seguire dejando rutinitas por aqui :mrgreen:

un saludo

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: pwm y motor encoder. en asm
« Respuesta #3 en: 28 de Diciembre de 2009, 13:51:31 »
http://perso.wanadoo.es/luis_ju/ebasica2/mpp_03.html

Esta pagina creo que es la que mejor explica los movimientos basicos de los PAP, esto seguro que ya lo sabes pero a lo mejor a alguien le sirve.
El PWM en los PAP se usa para dos cosas, hasta donde yo se, para darles mayor velocidad, esto esta en el foro tecnico creo y lo hace si no me equivoco esteca55 metiendoles unas "hostias" a las bobinas de entre 10 y 20 veces su tension para que alcancen antes la intensidad maxima y quitarles tension antes para no quemarlos.
Para lo otro que se emplea el PWM es para darles mayor precision, ya que se trata de darles varios micropasos entre bobinas, y es dandole distintos tiempos de tension a cada bobina. Yo creo que la manera de hacerlo es la siguiente, solo lo creo no me hagas mucho caso:
Supon que le vas a dar 50 pasos por segundo, entonces le tendras que dar un paso cada 20ms, en principio esta en A, por tanto 20ms A en alto y B en bajo, en el segundo paso A 18ms en alto y B 2ms en alto, de esta forma estara cerca de A pero un poco desviada hacia B, 3º PASO 16ms A en alto y B 4ms en alto un poco mas alejado de A, 4º a=14ms B=6ms y asi sucesivamente hasta que llegue a A=0ms y B20ms que estara en B, y empiezas a hacer lo mismo con B y C. Creo que la mejor manera de hacerlo, sigue sin hacerme mucho caso, es haciendo un desborde de TIMER cada 2ms, para estes tiempos que estoy poniendo aqui, y mediante un contador ir haciendo la secuencia, cada 10 desbordes es un paso y cada 10 pasos cambia de bobinas. En un motor PAP de 1.8º y 200 pasos creo que es el de mayor precision le darias 2000 pasos, 360/2000=0.18º algo menos de la quinta parte de un grado, con un programa bien hecho creo que seria posible saber en cada momento donde esta el rotor y las vueltas que dio.
Los tiempos son totalmente imaginarios, asi que si en el retso te aconsejo que no me hagas mucho caso, en los tiempos no me hagas caso ninguno  :lol:



saludos tapi8

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: pwm y motor encoder. en asm
« Respuesta #4 en: 28 de Diciembre de 2009, 18:33:59 »
mmmmm gracias por la informacion, sigo dandole. estos enlaces me los esconde el google, gracias.
de momento en el simulador, pero ya va siendo hora de que lo haga sobre el circuito a ver que pasa :D.
para cambiar el tiempo que dura cada pulso positivo estoy haciendolo con un DAC0800 conectado a un reg desplazamiento 74hc595 para cambiar la tension de referencia y que el comparador se encargue de recortar el lado positivo del pwm. tambien intentare ajustar un poco por soft. precisamente para hacer eso que mencionas, chopping creo que se llama.
pero me esta dando guerra la lectura de tablas de 256 posiciones. pierde el salto aun estando a principio de pagina 0x800 :?  hacia tiempo que no ponia tablas tan largas y lo tengo oxidao, pero en un par de dias daré con ello, de todas formas la intencion es como mucho 10 u 12 saltos, y de momento estoy usando una sola bobina, usea un motor de escobillas normá y corriente, pero con encoder.
 el frenado lo hace a capon, con rutinas de retardo y adelantos hasta que busca el final del pulso del encoder, momento en el que deja clavada la salida sin pwm ni na, que tengo que cambiarlo, pero ahí teneis el programa y la simulacion, solo del micro y el 74595 el dac0800 tampoco le da la gana en isis y el motor ya si que no. mi pobre orldenadorl dice que hasta ahí :x pero se ve como van cambiando las salidas del registro con cada pulso para recrear una señal mas triangular que senoidal, tengo que rehacer la tabla. por cierto para hacer caracteres hay programas, para esto habra alguno. cuasi me vuelvo pajaro carpintero picateclando con la tablita. ademas me vendria de perlas para otra cosilla que estoy haciendo. una diente de sierra incrementa o decrementa un registro de forma ciclica, cuadrada mas que visto, pero senoidal y triangular mejor por tablas pero escribirlas...

bueno mientras que escribia esto se me ocurrio como era lo de la tabla, no estaba contando con las lineas de addwf pcl,f que sumada daba mas de 256 posiciones y se iba, lo he solucionado poniendo las instrucciones antes de la pagina, y cambiando la pagina antes del salto.

org 0x07fc
TABLA_DAC
   PAGESEL   PRIN_TABLA
   MOVF   CDA_OUT,W   
   ADDWF   PCL,F
PRIN_TABLA   DT   .0, .2, .4, .6, .8

un saludo
« Última modificación: 07 de Febrero de 2010, 18:17:59 por Suky »

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: pwm y motor encoder. en asm
« Respuesta #5 en: 29 de Diciembre de 2009, 08:37:33 »
bueno he cambiado el freno para que lo haga con el pwm por hard. no para cada 30 segundos ni na de eso, lo deja clavao y que aguante. pero se podria jugar con pulsos mas cortos
os cuento un poco por encima, el programa espera que le llegue un pulso alto por potb0 int externa, lee el estado de portb1 que indica la direccion en la que tiene que girar, enciende el timer y saca el pwm a los gates, esperando que llegue el pulso bajo del encoder. momento en el que activa el freno.
 se supone que es para andar de paso en paso usando un motor dc con encoder. bueno muy resumido 8) de momento es el comparador y el dac los quiero que por hard, recorte los pulsos positivos que se le envian a los gates. aunque se podria hacer utilizando la tabla y con esos valores ir recargando los registros ccprH/L eso seguro que me toca ponerlo para regular e igualar por soft pues si se queda frenado el motor consumira mas y el comparador saltara antes. supongo que habra que encontrar el equilibrio a oido :D

un saludo  
« Última modificación: 07 de Febrero de 2010, 18:19:19 por Suky »

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: pwm y motor encoder. en asm
« Respuesta #6 en: 05 de Enero de 2010, 07:42:06 »
y asi quedaria  modulando el ancho de pulsos del pwm. int rb0 adelanta buscando el paso alto del encoder, en la direccion indicada por portb1. hasta el pulso en alto. comienza a adelantar/frenar hasta el pulso bajo gradualmente. a mas frena, menos adelanta en una u otra direccion, hasta encontrar el pulso bajo. momento en el que mantiene el freno. a un duty constante. a la espera del siguiente pulso de la contrladora
para manejar el motor dc he intentado dibujar la senoidal para que envie un pulso diferente a otro, para un motor paso a paso creo, digo creo por que me tengo que buscar la vida para hacerlo con dos puentes H. seria que a cada pulso de la controladora cambie el duty del pwm segun unos valores precargados en una tabla. asi que ale ya tengo curro pa rato  :mrgreen:
un moscardon ronda mi cabeza, ¿se podran usar los dos modulos comparadores con el mismo timer1? :rolleyes: proximo capitulo generar dos pwm distintos con el mismo timer, a ver que sale. me voy a revisar el datasheet

un saludo
 

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: pwm y motor encoder. en asm
« Respuesta #7 en: 04 de Febrero de 2010, 18:08:47 »
bueno pues seguimos con estos juguetes, esta vez he cogido el l298 y algunas otras cosillas y he sacado otro circuito. del pwm se encarga un oscilador + resistencia con un 74hc75 para sincronizar los comparadores, conectados a las salidas sensA y B para actualizar los enable y corregir los niveles. como en el diseño anterior un dac0800 para cambiar la tension de referencia de los comparadores lm311 para cada bobina.

la secuencia para in 1,2,3,4 del l298 me ha parecido entender en el datasheet del l297 que seria asi, la teneis mejor explicada en la pagina 5 del l297
0101
1001
1010
0110
el programa lo que hace es rotar estas, intercalando los valores de los dac0800 para generar diferentes frecuencias, por ej cada 8 cambios de dac hace el siguiente paso, pensado para que haga divisiones entre los pasos usea micropasos. en el erchivo de definiciones se puede modificar N_MICROPASOS para que haga desde paso completo hasta 256 micropasos aunque no termine de escribir las tablas, solo hice de 8 y 16 que creo mas que suficientes, sobre todo para probar la simulacion que mas pasos aburren :g), por cierto solo es para ver que hace el pic, los dac lm311 el l298... etc no tienen modelo de simulacion asi que faltan muchas chispas por saber si esto funcionaria. ademas tengo que calcular bien las divisiones de las tablas, solo he puesto valores para poder diferenciarlos a las salidas de los registros, decidme que os parece o que tan equivocado estoy, abajo os dejo el programilla con la simulacion, para el que quiera echarle un vistazo.


un saludo


« Última modificación: 07 de Febrero de 2010, 18:19:44 por Suky »

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: pwm y motor encoder. en asm
« Respuesta #8 en: 07 de Febrero de 2010, 08:26:06 »
no conseguia cuadrar todo esto de la tabla y los pasos con el programa, asi que me puse a escribir otro extenso post :ni) para explicaros cual era el problema y acabe explicandome a mi mismo y resolviendo  ;-) na como detallar un post para aclarar dudas. bueno por lo menos las de hoy :oops:
la tabla segun este pdf, para dar 8 micropasos es esta
Citar
0- 100% 0%      Paso
1- 98,1% 19,5% 1/8 de Paso
2- 92,4% 38,2% 1/4 de Paso
3- 83,1% 55,5% 3/8 de Paso
4- 70,7% 70,7% Medio Paso ¿¿50%?? supongo que al ser dos iguales se repelen u atraen por igual
5- 55,5% 83,1% 5/8 de Paso
6- 38,2% 92,4% 3/4 de Paso
7- 19,5% 98,1% 7/8 de Paso
8- 0% 100%            Paso
estos valores aprox. son para sacar datos a los dac0800 y cambiar la tension de referencia en los comparadores, para que el chopping haga los micropasos
;0   .255-.0
;1   .250-.50
;2   .236-.97
;3   .212-.141
;4   .180-.180
;5   .141-.212
;6   .97 -.236
;7   .50 -.250
y la secuencia de pasos como decia esta
0101
1001
1010
0110
entonces arrejuntandolo to para dar las secuencias de los pasos
Citar
   ;----------------------------------------------------------------------------------------------
;0 100%       0%            Paso         ;   10 00  <-<-<-<-<-       00      
;1 98,1%    19,5%    1/8 de Paso         ;10 10                |
;2 92,4%    38,2%    1/4 de Paso         ;10 10                |         
;3 83,1%    55,5%    3/8 de Paso         ;10 10                |
;                                                |                  
;4 70,7%    70,7%    Medio Paso           ;10 10                |
;5 55,5%    83,1%    5/8 de Paso         ;10 10                |
;6 38,2%    92,4%    3/4 de Paso         ;10 10                |
;7 19,5%    98,1%    7/8 de Paso         ;10 10                |  
;                                                |   
;0    0%      100%           Paso         ;   00 10          |      01
;1 19,5%    98,1%    1/8 de Paso         ;01 10                |
;2 38,2%    92,4%    1/4 de Paso         ;01 10                |
;3 55,5%    83,1%   3/8 de Paso         ;01 10                |
;                                                |   
;4 70,7%   70,7%    Medio Paso          ;01 10                |    
;5 83,1%    55,5%    5/8 de Paso         ;01 10                |
;6 92,4%    38,2%    3/4 de Paso         ;01 10                |
;7 98,1%   19,5%    7/8 de Paso         ;01 10                |  
;                                                |   
;0 100%       0%            Paso            ;01 00          |      10
;1 98,1%    19,5%    1/8 de Paso         ;01 01                |
;2 92,4%    38,2%    1/4 de Paso         ;01 01                |
;3 83,1%    55,5%    3/8 de Paso         ;01 01                |
;                                                |   
;4 70,7%    70,7%    Medio Paso          ;01 01                |  
;5 55,5%    83,1%    5/8 de Paso         ;01 01                |
;6 38,2%    92,4%    3/4 de Paso         ;01 01                |                
;7 19,5%    98,1%    7/8 de Paso         ;01 01                |  
;                                                |   
;0 0%        100%           Paso              ;00 01           |      11
;1 19,5%    98,1%    1/8 de Paso         ;10 01                |
;2 38,2%    92,4%    1/4 de Paso         ;10 01               |
;3 55,5%    83,1%   3/8 de Paso         ;10 01                |
;                                                |   
;4 70,7%   70,7%    Medio Paso          ;10 01                |    
;5 83,1%    55,5%    5/8 de Paso         ;10 01                |
;6 92,4%    38,2%    3/4 de Paso         ;10 01                |
;7 98,1%   19,5%    7/8 de Paso         ;10 01        >->->->->-|           
en la simulacion notese que aunque estan incluidos los pasos completos, momento en el que se energiza solo una de las bobinas, es con el dac que pone a cero una de ellas y en la salida del micro la mantiene en alto, solo cambia cada 8 y no cada 4

un saludo
« Última modificación: 07 de Febrero de 2010, 10:26:31 por alogic.on »

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: pwm y motor encoder. en asm
« Respuesta #9 en: 07 de Marzo de 2010, 10:26:26 »
hoy que tenia un ratillo he encontrado la nota de aplicacion del dac0800, AN-1525. cada dia algo nuevo no sabia de esto solo de los datasheets :oops:
Citar
Pin Function
Normal V or I
(or Range)
New V or I
(or Range)
1 Logic Control 0V +5V
2 IO −10V to +18V   (V−) + 5V        to +28V
3 V- −15V to −5V 0V
4 IO −10V to +18V (V−) +5             to +28
5 B1 (MSB)0V to 0.8V(logic low)5.0V to 5.8V(logic low)
6 B2
7 B3
8 B4
9 B5 2.4V to V+(logic high)7.4V        to V+(logic high)
10 B6
11 B7
12 B8 (LSB)
13 V+ +5V to +15V 0V to +20V
14 REF+ 200 μA to 4 mA 200 μA       to 4 mA
15 REF- 0V thru R +5V thru R
16 COMP cap cap

lo que viene a ser segun lo que ven mis ojos, (si me confundo dadme el toque, que me lio.) que se puede alimentar de 5 a 28 volts. pero que al hacer esto, las entradas utilizan un valor diferente en vez de 0 á 5v son, menos de 5 á mas de 7v. por lo que en la nota de aplicacion exponen (figura 3)
Citar
For driving with 5V TTL devices, R1 and R2 of Figure 3 are
2.65k and 3.3k, respectively. For driving with 3.3V TTL devices,
R1 and R2 are 3.48k and 4.75k, respectively. These
resistance values would change for bias voltages other than
the +10V shown in Figure 3. If the bias voltage is +12V, R1
and R2 of are 5.83k and 4.75k, respectively, for 5V TTL
devices and 5.62k and 4.75k, respectively, for driving with
3.3V TTL devices.
Tolerance requirements of both the resistors and of the bias
voltage is 1%, so it is best to use a reference source for the
bias voltage.

asi al final ha quedado alimentado a 0-25v que sera el maximo que aguante el driver, de momento. no se si se podria poner un divisor de tension a la salida de SENSA/B del l298 para alimentar con 40volt el puente y con 10-15v el dac e igualar asi a la entrada del comparador :? os dejo el esquema para el que quiera le eche un ojo

« Última modificación: 07 de Marzo de 2010, 10:29:49 por alogic.on »