Autor Tema: Ayuda generar frecuencia variable de pulsos  (Leído 2793 veces)

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

Desconectado PEDROPIN

  • PIC12
  • **
  • Mensajes: 66
Ayuda generar frecuencia variable de pulsos
« en: 08 de Febrero de 2012, 00:31:27 »
Un saludo para todos los miembros del foro.

He fabricado un driver para motores paso a paso bipolar,  con el L297 y L298 que realizan el puente H, para energizar las bobinas del motor.
Con el asm logre generar una frecuencia de pulsos usando el pic16f84a y el motor gira.
Pero mi idea es que al oprimir un pulsador varias veces vaya  incrementando  la velocidad de giro en el motor y con otro pulsador haga lo contrario. (es decir  que aumente o disminuya la frecuencia de pulsos).
Solamente se necesita que estos pulsos salgan por una salida del pic, el driver se encarga de direccionarlos a las bobinas del motor.

He estado buscando la solucion, pero estoy confundido.
Si alguno me puede dar una idea de como hacerlo, o que instrucciones usar se lo agradezco, es solamente una idea que yo creo que puedo hacer el codigo.   tengo el pic16f84a o el pic16f628a

Muchas gracias
Pedropin


Desconectado NoSepComo

  • PIC18
  • ****
  • Mensajes: 305
Re: Ayuda generar frecuencia variable de pulsos
« Respuesta #1 en: 08 de Febrero de 2012, 06:15:53 »
Hola,
tienes que usar ese PIC si o sí, porque si no con un generador de pwm lo solucionas (con uno que tenga al menos uno).
Si no lo que puedes hacer es modificar el tiempo de la rutina del timer, en ese caso, que se modificase el tiempo en el que salta con las pulsaciones como tu decidas, y lo que tienes que hacer es que en cada entrada en la rutina de interrupción, intercambies el nivel de la pata del pic que va al driver (si es 0 a 1 y viceversa). Así debería funcionar, aunque no sea tan exacto como usar un generador de pwm, pero usa cristal externo si lo haces así para tener precisión en la salida.

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Ayuda generar frecuencia variable de pulsos
« Respuesta #2 en: 08 de Febrero de 2012, 12:47:05 »
Hola, te he realizado un diagrama, para que interpretes, como hacer..
La demora, la cargas con un registro, en este caso yo la llamo RETARDO
Retardo es el contador, que se incrementa con un pulsador, y se decrementa con el otro
(tendrás que verificar los limites, es decir, que hacer si llega a cero, y que hacer si llega a 255)
Empleo un par de bits, como banderas o memorias, para que actúen como antirrebotes.. es decir, al pulsar, marca la memoria, y luego si está marcada, espera que suelten el pulsador (btfss  btfsc), e incrementa o decrementa el registro RETARDO
De esta manera, el programa se mantiene ejecutando, generando los pulsos, aún cuando se mantiene pulsado
Te paso un esquema, solo un pulsador, el otro es similar, con otros nombres en las memorias ...
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado PEDROPIN

  • PIC12
  • **
  • Mensajes: 66
Re: Ayuda generar frecuencia variable de pulsos
« Respuesta #3 en: 08 de Febrero de 2012, 15:30:30 »
Gracias por la ayuda Nosepcomo y todopic
ya me quedo mas claro empezare con el codigo a ver como me va

Saludos a todos
pedropoin

Desconectado PEDROPIN

  • PIC12
  • **
  • Mensajes: 66
Re: Ayuda generar frecuencia variable de pulsos
« Respuesta #4 en: 14 de Febrero de 2012, 18:11:34 »
He intentado seguir el diagrama pero no logro incrementar o decrementar los pulsos. la verdad necesito otra ayudita.
con estos retardos el motor anda muy bien pero necesito incrementarlos o decrementarlos por  cada pulsacion cambie la frecuencia al rededor de un 10%

;************************************ Tren de pulsos motor paso a paso ************************************

; Por el pin RB0 saale señal para motor PaP sale un tren de pulsos nivel alto 0.1ms
;nivel bajo 0.3ms se aprecia un buen funcionamiento del motor con un excelente par

;
; ZONA DE DATOS **********************************************************************

   __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
   LIST      P=16F84A
   INCLUDE  <P16F84A.INC>

   CBLOCK  0x0C         ; En esta posición empieza la RAM de usuario.
   Contador
   ENDC



#DEFINE Pulsador   PORTA,4
#DEFINE  Motor      PORTB,0
       PDel0 equ 0x0C
       PDel1 equ 0x0E
       PDel2 equ 0x0D
       PDel3 equ 0x0F   
 
; ZONA DE CÓDIGOS *******************************************************************

   ORG   0
Inicio
      bsf      STATUS,RP0      ; Acceso al Banco 1.
      bcf      Motor         ; Línea del motor configurada como salida.
      bsf      Pulsador      ; Línea del pulsador configurada como entrada.
      bcf      STATUS,RP0      ; Acceso al Banco 0.
      

Principal

      call   Retardo.3ms   
      btfsc   Pulsador         ; Si se presiona salta y llama a incrementa
      goto   Iniciamotor
      call   incrementa


Iniciamotor
      bsf      Motor              ; Enciende el motor
      call   Retardo.1ms            ; llama retardo 0.1 ms
      bcf      Motor            ; apaga motor
      call    Retardo.3ms       ; llama retardo de 0.3 ms
      goto   Principal

incrementa   
      incf   Contador,F         ; Incrementa  contador
      movlw    d'10'         
      
      




; Subrutina "Retardo_.3 ms
;-------------------------------------------------------------
Retardo.3ms   
        movlw     .73       ; 1 set number of repetitions
        movwf     PDel0     ; 1 |
PLoop0  clrwdt              ; 1 clear watchdog
        decfsz    PDel0, 1  ; 1 + (1) is the time over?
        goto      PLoop0    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 cycles delay
PDelL2  clrwdt              ; 1 cycle delay
        return              ; 2+2 Done

; Subrutina "Retardo_.1 ms
;------------------------------------------------------------
Retardo.1ms
          movlw     .23       ; 1 set number of repetitions
           movwf     PDel1     ; 1 |
PLoop1     clrwdt              ; 1 clear watchdog
           decfsz    PDel1, 1  ; 1 + (1) is the time over?
           goto      PLoop1    ; 2 no, loop
PDelL3     goto PDelL4         ; 2 cycles delay
PDelL4     clrwdt              ; 1 cycle delay
           return              ; 2+2 Done



; Subrutina "Retardo_20 ms
;-------------------------------------------------------
Retardo_20ms
      movlw     .21       ; 1 set number of repetitions (B)
        movwf     PDel2     ; 1 |
PLoop2  movlw     .237      ; 1 set number of repetitions (A)
        movwf     PDel3     ; 1 |
PLoop3  clrwdt              ; 1 clear watchdog
        decfsz    PDel3, 1  ; 1 + (1) is the time over? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel2,  1 ; 1 + (1) is the time over? (B)
        goto      PLoop1    ; 2 no, loop
PDelL5  goto PDelL2         ; 2 cycles delay
PDelL6  clrwdt              ; 1 cycle delay
        return              ; 2+2 Done      



 end



Saludos a todos Pedropin
« Última modificación: 15 de Febrero de 2012, 00:21:59 por PEDROPIN »


 

anything