TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: PEDROPIN 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
-
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.
-
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 ...
-
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
-
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