TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: ajkite en 13 de Marzo de 2006, 10:14:00
-
Hola, queria saber si me podeis echar una mano en el control de un motor paso a paso bipolar, el cual lo e cogido de una impresora
Este motor lo quiero controlar mediante un pic 16F876 y un driver L293D
Gracias
-
hola amigo, y el codigo? q lenguaje vas usar? q problema tienes?
Salu2
-
Escrito originalmente por poi5on
hola amigo, y el codigo? q lenguaje vas usar? q problema tienes?
Salu2
Jeje, poi5on al parecer nuestro amigo ajkite no quiere que lo guien sino más bien que le den la solución llave en mano.
-
Perdon x la tardanza
utilizo el MPLAB y el programa esta en el archivo que adjunto, utilizo 3 ldr, uno en un lado, otra en otro lado y otra en medio
Lo que ago es comparar las de los extremos y la que tngo mayor luz se mueve asia esa direcion y despue la comparo con la del medio y cuando tenga la misma luz se para
Mi problema es que el motor solo se me mueve un paso pequeño y se hay se queda cogido, no se si sera xq no le mand suficiente potencia
TB le tengo conectado unos led para q me indique para que posicion se me mueve, pero no se enciende ninguno, solamente se me encendieron la primera vez q los conecte y creo (no estoy seguro)q x error lo conecte el circuito a12v pero el pic funciona correctamente lo e comprobado con otro progama
gracias
-
no puedo adjuntar el archivo, como lo ago????
-
BUENO PUES COMO NO PUEDO ADJUNTAR EL ARCHIVO DEL PROGRAMA AY LO LLEVAIS
LIST P=16f876
include "P16f876.INC"
RADIX HEX
WREG EQU 0x00
Z EQU 0x02
TEMP1 EQU 0x20 ; Registros de propósito general.
TEMP2 EQU 0x21
CONTA0 EQU 0x22
VALORA0 EQU 0x23 ; Valor de la conversion de los sensores
VALORA1 EQU 0x24
VALORA2 EQU 0x25
CONTADE EQU 0x26 ; Contador para limitar el giro
CONTAIZ EQU 0x27
;*****************************************************************
org 0x00
goto inicio
org 0x05
inicio: clrf INTCON ;Se anulan las interrupciones.
movlw 0X04
movwf CONTADE ; Limita el giro a la derecha.
movwf CONTAIZ ; limita el giro a la izquierda.
bcf STATUS,RP1
bsf STATUS,RP0 ; Seleccionamos el banco 1
movlw b"00000000"
movwf TRISB ; Puerto B de salida
movlw b"00000000" ; Puerto C de salida
movwf TRISC
movlw b"00000111" ; RA0,RA1 y RA2 como entradas
movwf TRISA
movlw b"10000000" ; Configuramos entradas analogicas
movwf ADCON1 ; Resultado justificado en ADRESH.
bcf STATUS,RP0 ; Seleccionamos banco1
clrf PORTA ; PORTA <- 0
clrf PORTC
movlw b"00110101" ; Secuencia de inicializacion del motor.
movwf PORTB ; Sincroniza las bobinas con una secuencia inicial
call TEMPO ; para evitar un comportamiento anómalo la
; primera que recibe una secuencia de giro
movlw b"00110101"
movwf PORTB
call TEMPO
movlw b"00110101"
movwf PORTB
call TEMPO
movlw b"00110101"
movwf PORTB
movlw b"00000000"; Se selecciona RA0 para realizar la conversion
movwf ADCON0
bsf ADCON0,0 ; Activa el convertidor A/D
convertir: call espera20u
bsf ADCON0,2 ; Inicia la conversion
espera: btfsc ADCON0,2 ; Espera a que termine la conversion
goto espera
bsf STATUS,RP0
movf ADRESL,0
bcf STATUS,RP0
movwf VALORA0
movf ADRESH,0
sublw b"00000000" ; Si ADRESH es 0x00, VALORA0=ADRESL
btfsc STATUS,Z
goto convertir2
movlw b"11111111" ; Si ADRESH <> 0x00, VALORA0=0xFF
movwf VALORA0
convertir2: bsf ADCON0,3 ; Seleccionamos RA1
call espera20u
bsf ADCON0,2 ; Inicia la conversion
espera2: btfsc ADCON0,2 ; Espera a que termine la conversion
goto espera2
bsf STATUS,RP0;
movf ADRESL,0
bcf STATUS,RP0
movwf VALORA1
movf ADRESH,0
sublw b"00000000" ;Si ADRESH es 0x00, VALORA1=ADRESL
btfsc STATUS,Z
goto convertir3
movlw b"11111111"
movwf VALORA1 ; Si ADRESH <> 0x00, VALORA0=0xFF
convertir3: bcf ADCON0,3 ;
bsf ADCON0,4 ; Seleccionamos RA2
call espera20u
bsf ADCON0,2 ; Inicia la conversion
espera3: btfsc ADCON0,2 ; Espera a que termine la conversion
goto espera3
bsf STATUS,RP0;
movf ADRESL,0
bcf STATUS,RP0
movwf VALORA2
movf ADRESH,0
sublw b"00000000" ;Si ADRESH es 0x00, VALORA1=ADRESL
btfsc STATUS,Z
goto comparar
movlw b"11111111"
movwf VALORA2 ; Si ADRESH <> 0x00, VALORA0=0xFF
comparar: movf VALORA0,0
subwf VALORA2,0 ; Comparamos los extremos
btfsc STATUS,Z
goto configura ;Si los extremos son iguales, vuelve a coger valores
btfss STATUS,0 ; Vemos cual es el que ha detectado mas luz
goto compara2 ; RA2 Detecta mas luz
compara1: movf VALORA0,0 ; RA0 Detecta mas luz
subwf VALORA1,0 ; Restamos RA0 - RA1 (Central y extremo con mayor luz)
btfsc STATUS,0
goto derecha ; RA0 es el sensor que detecta mas luz
goto configura ; RA1 es el central y es el que tiene mas luz
compara2: movf VALORA2,0
subwf VALORA1,0 ; Restamos RA2 - RA1 (Central y extremo con mayor luz)
btfsc STATUS,0;
goto izquierda ; RA2 es el sensor que detecta mas luz
configura: movlw b"00000000" ; Se selecciona RA0 para realizar la conversion
movwf ADCON0
bsf ADCON0,0 ; Activa el convertidor A/D
goto convertir
derecha: decfsz CONTADE,1 ; Comprobamos que no ha llegado al tope
goto derechaok ; Si llega al tope que no gire
incf CONTADE,1 ; y vuelva a tomar valores
movlw 0x04
movwf PORTC
goto configura
derechaok: movlw 0x00
movwf PORTC
incf CONTAIZ,1
movlw b"00110101" ; primer paso
movwf PORTB
call TEMPO ;Temporización antes de realizar el siguiente paso
movlw b"00110110" ;segundo paso.
movwf PORTB
call TEMPO
movlw b"00111010" ;tercer paso.
movwf PORTB
call TEMPO
movlw b"00111001" ;cuarto y último paso
movwf PORTB
call TEMPO
goto configura
izquierda: decfsz CONTAIZ,1 ; Comprobamos que no ha llegado al tope
goto izquierdaok ; Si llega al tope que no gire
incf CONTAIZ,1 ; y vuelva a tomar valores
movlw 0x08
movwf PORTC
goto configura
izquierdaok: movlw 0x00
movwf PORTC
incf CONTADE,1
movlw b"00111001" ; Primer paso para el giro hacia la derecha.
movwf PORTB
call TEMPO ;Temporización antes de realizar el siguiente paso
movlw b"00111010" ;Segundo paso.
movwf PORTB
call TEMPO
movlw b"00110110" ;Tercer paso.
movwf PORTB
call TEMPO
movlw b"00110101" ;Último paso.
movwf PORTB
call TEMPO
goto configura
;******************************************************************************************
;TEMPO Subrutina de temporización para poder enviar otra secuencia al motor.
TEMPO movlw 0xFF ;carga FF en TEMP1
movwf TEMP1
clrf TEMP2 ;Carga 0 en TEMP2
TEMPO_1 decfsz TEMP2,1 ;Decrementa TEMP2 y si es 0 salta
goto TEMPO_1 ;volver a TEMPO_1
decfsz TEMP1,1 ;Decrementa TEMP1 y si es 0 salta
goto TEMPO_1 ;volver a TEMPO_1
RETURN
;**********************************************************************************
; espera20u Subrutina de espera para poder volver a tomar otro valor del conversor
espera20u movlw 0x05
movwf CONTA0
ret1 decfsz CONTA0,1
goto ret1
return
end
-
Escrito originalmente por ajkite
Perdon x la tardanza
utilizo el MPLAB y el programa esta en el archivo que adjunto, utilizo 3 ldr, uno en un lado, otra en otro lado y otra en medio
Lo que ago es comparar las de los extremos y la que tngo mayor luz se mueve asia esa direcion y despue la comparo con la del medio y cuando tenga la misma luz se para
Mi problema es que el motor solo se me mueve un paso pequeño y se hay se queda cogido, no se si sera xq no le mand suficiente potencia
TB le tengo conectado unos led para q me indique para que posicion se me mueve, pero no se enciende ninguno, solamente se me encendieron la primera vez q los conecte y creo (no estoy seguro)q x error lo conecte el circuito a12v pero el pic funciona correctamente lo e comprobado con otro progama
gracias
Antes que nada, si lo expusiste a 12V... puede que el pic siga andando pero que se le haya quemado algo importante dentro y justo este andando las partes que tu testeaste en el otro software.
Ahora bien, suponiendo que anda bien, porque no haces un programa bien simple que solo encienda los leds? y vas verificando si el problema es de la rutina del motor o del pic?
Saludos
-
Hola amigo
Te recomiendo que quites los leds, haz una pequeña rutina que solo mueva el motor. Chequeando tu codigo me parece que esta mala la parte que mueve el motor, ya que utilizas dos veces 110101 y dos veces 1110101 bueno aunque eso depende del motor que usas. Tambien deberias utilizar unos darlintong nte261 para que se la conectes a las bobinas para que haya suficiente corriente, otra cosa que debes chequear es el cableado porque debes energizar las bobinas en forma ordenada, al tenerlo desordenadas el motor puede que avance pero se devuelve o queda en una posicion fija.
Saludos