Autor Tema: Motor PaP bipolar 16F628a assembler  (Leído 10307 veces)

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

Desconectado ezeguada

  • PIC10
  • *
  • Mensajes: 3
Motor PaP bipolar 16F628a assembler
« en: 08 de Mayo de 2011, 07:32:43 »
Hola a todos, soy nuevo en el tema de pic's y en el tema del assembler... Y porq no decir tambien que en la electrónica en general! jaja

Primero q nada contarles q hace bastante sigo la comunidad y arranque como la mayoria, costruyendo mi programador, comprando un 16f628a y haciendo titilar leds de todas las formas q se me ocurrieron. Pero desarme una disquetera y quiero hacer andar el motor paso a paso que mueve el lente de la disquetera, es un motor de 4 cables, ya medi las resistencias de los pares para saber cual eran los pares de cada una de las dos bobinas, me compre un L293b para el circuito del puente H y 8 diodos 1n4007 para la proteccion del circuito, hice el programa en assembler para que el motor se mueva en sentido horario solamente, a modo de prueba, lo cargo en el pic, monto todo sobre el protoboard y el motor hace un especie de zumbido tenue, por miedo de hacerlo bosta lo desconecte enseguida,  el codigo en assembler es este:


;****Encabezado****
list      P=16F628A
#include   <P16F628A.inc>
__CONFIG    _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON


;****Definicion de variables****
Contador1   equ 0x20   ;selecciono posicion en la memoria RAM para guardar el registro utilizado para la demora
Contador2   equ 0x21   ;registro utilizado para la demora
Pulsador    equ 0      ;defino pulsador como el bit 0, en este caso sera PORTA

;****Vector reset****
Reset   org 0x00   ;aca comienza el micro
                goto Inicio   ;salto al inicio del programa
      org 0x05   ;origen del codigo de programa

;************************
;paso   A   B   C   D   *
;1      1   0   1   0   *
;2      1   0   0   1   *
;3      0   1   0   1   *
;4      0   1   1   0   *
;************************

;****Programa principal****
Inicio
;****Configuracion de puertos****
      movlw b'00000111'   ;Configuro PORTA como i/o digital
      movwf CMCON         ;muevo 111 a W, y W a CMCON
      bsf   STATUS,RP0      ;paso del banco 0 a banco 1
                     ;TRISA por default esta en 11111111
      movlw b'11110000'   ;muevo 11110000 a W
      movwf TRISB         ;muevo W a TRISB
      bcf STATUS,RP0      ;paso del banco 1 al banco 0

;****Control del led****
Bucle    btfsc PORTA,Pulsador ;pregunto si esta en 0 logico
      movlw b'00001010'    ;realizo el primer paso del motor
      movwf PORTB
      call Demora_150ms
    ;espero 150ms
      movlw b'00001001'    ;realizo el segundo paso del motor
      movwf PORTB
      call Demora_150ms
    ;espero 150ms
      movlw b'00000101'    ;realizo el tercer paso del motor
      movwf PORTB
      call Demora_150ms
    ;espero 150ms
      movlw b'00000110'    ;realizo el cuarto paso del motor
      movwf PORTB
      call Demora_150ms
    ;espero 150ms
      goto Bucle          ;testeo otra vez la condicion del pulsador

;****Demora****
Demora_150ms
      movlw 0xFF
         ;
      movwf Contador1      ;icinio contador1
Repeticion1
      movlw 0xC3
         ;
      movwf Contador2      ;inicio contador2
Repeticion2
      decfsz Contador2, 1
   ;decrementa contador2 y si es 0 sale
      goto Repeticion2   ;si no es 0 repito el ciclo
      decfsz Contador1, 1   ;decrementa contador1
      goto Repeticion1   ;si no es 0 repito el ciclo
      return            ;regreso de la subrutina

      end               ;fin del codigo


es una remodelacion del primer programa q dan el la revista 5 de Ucontrol donde te enceñan a hacer el 1º programa en assembler para controlar un led, de ahi "robe" la sintaxis del delay, la definicion de puertos (en la cual hay muchas cosas q todavia no tengo en claro porq me falta leer mucho mas del tema). en proteus conecto rb0 a A del motor, rb1 a B del motor, rb2 a C y rb3 a D, con los 1n4007 puestos como proteccion, podria poner el L293d y ahorrarme los diodos (el L293b no esta en proteus), pero es este programa no estoy usando el puente en H, el motor solo va para un lado asiq no lo crei necesario. cuando le doy al play en proteus el motor gira unos pocos grados en sentido anti horario, nose exactamente cuanto, pero aproximadamente 1/5 de vuelta y despues arranca a girar en sentido horario, segun tengo entendido en el codigo, cuando presiono el boton el motor tendria q detener su giro, pero en vez de eso se queda haciendo algo asi como un pendulo...
Para sacarme la duda de si al menos giraba el motor lo probe en el protoboard y paso lo q conte mas arriba del zumbido del motor. alimente todo con una fuente de 5V y 200mA (cargador de un celular), en el protoboard al circuito lo hice con el l293b, para que ya me quede armado en el momento q tenga el programa completo y funcional, las patas en1, en2, vss y vs del l293b las puse a los 5V de la fuente (no se si esta mal q el voltaje de alimentacion sea igual que el voltaje de la parte logica, en el datasheet decia que mientras vss<=vs<=36V, la alimentacion del pic tambien la tome de los 5V del cargador de celu

Mi teoria es q tuve suerte de que no se me quemo nada todavia, pero les pido a ustedes q son los q saben q me tiren la justa ya que tengo ganas de que ese motorcito pedorro ande a mi antojo :)

desde ya muchas gracias (perdon la ortografia, 7.32am y no por madrugar sino por aun no acostarme jajaja)

PD: deje adjunta la foto donde esta el circuito que use del integrado con los diodos porq tal vez les servia, el archivo de proteus si lo necesitan lo subo

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Motor PaP bipolar 16F628a assembler
« Respuesta #1 en: 08 de Mayo de 2011, 15:37:29 »
Mirate esta pagina creo que te sacara de algunas dudas.

http://r-luis.xbot.es/ebasica2/mpap_01.html

Citar
Bucle    btfsc PORTA,Pulsador ;pregunto si esta en 0 logico
      movlw b'00001010'    ;realizo el primer paso del motor
      movwf PORTB

Esto asi a primera vista esta mal, si es 1 ejecuta  "movlw b'00001010'" y si es 0 ejecuta " movwf PORTB" eso no es lo que quieres, verdad?.
La tabla creo que tampoco esta bien, miralo en esa pagina, y si tienes dudas pregunta.

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re: Motor PaP bipolar 16F628a assembler
« Respuesta #2 en: 08 de Mayo de 2011, 19:35:56 »
Bucle    btfsc PORTA,Pulsador ;pregunto si esta en 0 logico
      
Hola, esa secuencia no tiene el efecto que tu quieres que es, creo el de activar el motor segun el estado del pulsador.
Por otro lado la secuencia de manejo del motor esta mal, empieza por lo mas simple. No pongas el pulsador para activar el motor, y utiliza la secuencia mas simple que es la de desplazar un 1 a traves de las bobinas.

    ABCD
1   1000
2   0100
3   0010
4   0001

Esa secuencia se llama "wave drive" y es la mas simple. Aqui te paso mi programa para control de motor PAP unipolar, que tiene implementada varios modos, porejemplo al hacer :

Código: [Seleccionar]
call wavedriveHEl motor girara en sentido horario en modo "wave drive".

Código: [Seleccionar]
;__________________________________________________
;Control de motor paso a paso de disquetera unipolar
;con PIC 16f628a
;Las salidas estan invertivas porque uso el uln 2003
;Conexion a RB4-RB7 del PIC
;---------------------------------------------------

list p=16f628a
R_E_T_1 equ 20h
R_E_T_2 equ 21h
org 00h
goto programa

#include p16f628a.inc
#include Retardos_MotorPAP.inc
NormalstepAH
movlw b'11000000'
movwf PORTB
call retardo5ms
movlw b'01100000'
movwf PORTB
call retardo5ms
movlw b'00110000'
movwf PORTB
call retardo5ms
movlw b'10010000'
movwf PORTB
call retardo5ms
return
waveDriveAH
movlw b'10000000'
movwf PORTB
call retardo5ms
movlw b'01000000'
movwf PORTB
call retardo5ms
movlw b'00100000'
movwf PORTB
call retardo5ms
movlw b'00010000'
movwf PORTB
call retardo5ms
return

HalfSpepAH
movlw b'10000000';1
movwf PORTB
call retardo5ms
movlw b'11000000';2
movwf PORTB
call retardo5ms
movlw b'01000000';3
movwf PORTB
call retardo5ms
movlw b'01100000';4
movwf PORTB
call retardo5ms
movlw b'00100000';5
movwf PORTB
call retardo5ms
movlw b'00110000';6
movwf PORTB
call retardo5ms
movlw b'00010000';7
movwf PORTB
call retardo5ms
movlw b'10010000';8
movwf PORTB
call retardo5ms
return

waveDriveH
movlw b'00010000'
movwf PORTB
call retardo5ms

movlw b'00100000'
movwf PORTB
call retardo5ms

movlw b'01000000'
movwf PORTB
call retardo5ms

movlw b'10000000'
movwf PORTB
call retardo5ms


return


programa    bsf STATUS,5;BANCO 1
clrf TRISB
bsf  PCON,3; oscilador 4Mhz
            bcf STATUS,5;BANCO 0
movlw 00000111
movwf CMCON
repetir call NormalstepAH
goto repetir
end

Esta es la libreria de retardos:
Código: [Seleccionar]
;------------------------------------------------
; RETARDO DE 50 MILISEGUNDOS.

retardo50ms
MOVLW D'55'
MOVWF R_E_T_1
MOVLW D'181'
MOVWF R_E_T_2
CLRWDT
CLRWDT
DECFSZ R_E_T_2,F
GOTO $-3
DECFSZ R_E_T_1,F
GOTO $-7
RETURN

;------------------------------------------------
; RETARDO DE 2 MILISEGUNDOS.

retardo2ms
MOVLW D'249'
MOVWF R_E_T_1
CLRWDT
GOTO $+1
GOTO $+1
DECFSZ R_E_T_1,F
GOTO $-4
GOTO $+1
CLRWDT
RETURN

;------------------------------------------------
; RETARDO DE 45 MICROSEGUNDOS.

retardo45us
MOVLW D'10'
MOVWF R_E_T_1
CLRWDT
DECFSZ R_E_T_1,F
GOTO $-2
RETURN
; RETARDO DE 25 MILISEGUNDOS.
;------------------------------------------------
; RETARDO DE 25 MILISEGUNDOS.
retardo25ms
MOVLW D'25'
MOVWF R_E_T_1
MOVLW D'181'
MOVWF R_E_T_2
CLRWDT
CLRWDT
DECFSZ R_E_T_2,F
GOTO $-3
DECFSZ R_E_T_1,F
GOTO $-7
RETURN

;------------------------------------------------
; RETARDO DE 250 MILISEGUNDOS.

retardo250ms
MOVLW D'254'
MOVWF R_E_T_1
MOVLW D'181'
MOVWF R_E_T_2
CLRWDT
CLRWDT
DECFSZ R_E_T_2,F
GOTO $-3
DECFSZ R_E_T_1,F
GOTO $-7
RETURN
;------------------------------------------------
; RETARDO DE 5 MILISEGUNDOS.

retardo5ms
MOVLW D'5'
MOVWF R_E_T_1
MOVLW D'181'
MOVWF R_E_T_2
CLRWDT
CLRWDT
DECFSZ R_E_T_2,F
GOTO $-3
DECFSZ R_E_T_1,F
GOTO $-7
RETURN
El motor esta conectado a RB7-RB4.Aqui tienes el proyecto completo:

Desconectado ezeguada

  • PIC10
  • *
  • Mensajes: 3
Re: Motor PaP bipolar 16F628a assembler
« Respuesta #3 en: 09 de Mayo de 2011, 05:43:18 »
Mirate esta pagina creo que te sacara de algunas dudas.

http://r-luis.xbot.es/ebasica2/mpap_01.html

Citar
Bucle    btfsc PORTA,Pulsador ;pregunto si esta en 0 logico
      movlw b'00001010'    ;realizo el primer paso del motor
      movwf PORTB

Esto asi a primera vista esta mal, si es 1 ejecuta  "movlw b'00001010'" y si es 0 ejecuta " movwf PORTB" eso no es lo que quieres, verdad?.
La tabla creo que tampoco esta bien, miralo en esa pagina, y si tienes dudas pregunta.

Muchas gracias por tu respuesta, ahi entendi la el funcionamiento del comando "BTFSC" y entendi lo que me marcas :) (recomiendo la pagina http://www.circuitoselectronicos.org/2011/02/conjunto-de-instrucciones-para-los.html ya que ahi se explican todos los comandos del 16f628a en assembler)
En cuanto a la secuencia, yo interpreto el cuadro de la pagina que me pasaste como: +Vcc = 1, GND = 0, y con esto me surge una nueva duda, que por cierto es muy basica: me pongo a pensar, cuando le mando un cero logico desde el pic al motor esto quiere decir q lo conecta a maza?



Bucle    btfsc PORTA,Pulsador ;pregunto si esta en 0 logico
      
Hola, esa secuencia no tiene el efecto que tu quieres que es, creo el de activar el motor segun el estado del pulsador.
Por otro lado la secuencia de manejo del motor esta mal, empieza por lo mas simple. No pongas el pulsador para activar el motor, y utiliza la secuencia mas simple que es la de desplazar un 1 a traves de las bobinas.

    ABCD
1   1000
2   0100
3   0010
4   0001

Esa secuencia se llama "wave drive" y es la mas simple. Aqui te paso mi programa para control de motor PAP unipolar, que tiene implementada varios modos, porejemplo al hacer :

Código: [Seleccionar]
call wavedriveHEl motor girara en sentido horario en modo "wave drive".

Código: [Seleccionar]
;__________________________________________________
;Control de motor paso a paso de disquetera unipolar
;con PIC 16f628a
;Las salidas estan invertivas porque uso el uln 2003
;Conexion a RB4-RB7 del PIC
;---------------------------------------------------

list p=16f628a
R_E_T_1 equ 20h
R_E_T_2 equ 21h
org 00h
goto programa

#include p16f628a.inc
#include Retardos_MotorPAP.inc
NormalstepAH
movlw b'11000000'
movwf PORTB
call retardo5ms
movlw b'01100000'
movwf PORTB
call retardo5ms
movlw b'00110000'
movwf PORTB
call retardo5ms
movlw b'10010000'
movwf PORTB
call retardo5ms
return
waveDriveAH
movlw b'10000000'
movwf PORTB
call retardo5ms
movlw b'01000000'
movwf PORTB
call retardo5ms
movlw b'00100000'
movwf PORTB
call retardo5ms
movlw b'00010000'
movwf PORTB
call retardo5ms
return

HalfSpepAH
movlw b'10000000';1
movwf PORTB
call retardo5ms
movlw b'11000000';2
movwf PORTB
call retardo5ms
movlw b'01000000';3
movwf PORTB
call retardo5ms
movlw b'01100000';4
movwf PORTB
call retardo5ms
movlw b'00100000';5
movwf PORTB
call retardo5ms
movlw b'00110000';6
movwf PORTB
call retardo5ms
movlw b'00010000';7
movwf PORTB
call retardo5ms
movlw b'10010000';8
movwf PORTB
call retardo5ms
return

waveDriveH
movlw b'00010000'
movwf PORTB
call retardo5ms

movlw b'00100000'
movwf PORTB
call retardo5ms

movlw b'01000000'
movwf PORTB
call retardo5ms

movlw b'10000000'
movwf PORTB
call retardo5ms


return


programa    bsf STATUS,5;BANCO 1
clrf TRISB
bsf  PCON,3; oscilador 4Mhz
            bcf STATUS,5;BANCO 0
movlw 00000111
movwf CMCON
repetir call NormalstepAH
goto repetir
end

Esta es la libreria de retardos:
Código: [Seleccionar]
;------------------------------------------------
; RETARDO DE 50 MILISEGUNDOS.

retardo50ms
MOVLW D'55'
MOVWF R_E_T_1
MOVLW D'181'
MOVWF R_E_T_2
CLRWDT
CLRWDT
DECFSZ R_E_T_2,F
GOTO $-3
DECFSZ R_E_T_1,F
GOTO $-7
RETURN

;------------------------------------------------
; RETARDO DE 2 MILISEGUNDOS.

retardo2ms
MOVLW D'249'
MOVWF R_E_T_1
CLRWDT
GOTO $+1
GOTO $+1
DECFSZ R_E_T_1,F
GOTO $-4
GOTO $+1
CLRWDT
RETURN

;------------------------------------------------
; RETARDO DE 45 MICROSEGUNDOS.

retardo45us
MOVLW D'10'
MOVWF R_E_T_1
CLRWDT
DECFSZ R_E_T_1,F
GOTO $-2
RETURN
; RETARDO DE 25 MILISEGUNDOS.
;------------------------------------------------
; RETARDO DE 25 MILISEGUNDOS.
retardo25ms
MOVLW D'25'
MOVWF R_E_T_1
MOVLW D'181'
MOVWF R_E_T_2
CLRWDT
CLRWDT
DECFSZ R_E_T_2,F
GOTO $-3
DECFSZ R_E_T_1,F
GOTO $-7
RETURN

;------------------------------------------------
; RETARDO DE 250 MILISEGUNDOS.

retardo250ms
MOVLW D'254'
MOVWF R_E_T_1
MOVLW D'181'
MOVWF R_E_T_2
CLRWDT
CLRWDT
DECFSZ R_E_T_2,F
GOTO $-3
DECFSZ R_E_T_1,F
GOTO $-7
RETURN
;------------------------------------------------
; RETARDO DE 5 MILISEGUNDOS.

retardo5ms
MOVLW D'5'
MOVWF R_E_T_1
MOVLW D'181'
MOVWF R_E_T_2
CLRWDT
CLRWDT
DECFSZ R_E_T_2,F
GOTO $-3
DECFSZ R_E_T_1,F
GOTO $-7
RETURN
El motor esta conectado a RB7-RB4.Aqui tienes el proyecto completo:



Muchas gracias a vos también por tu respuesta! ademas de evacuarme dudas tu post sirvio para aclararme bastante el panorama con el tema de assembler :), voy a probar con esa secuencia de pasos "wave drive". ya saque el pulsador porq me di cuenta de lo que realmente hacia, si era 0 saltaba la instruccion en la que asignaba a portb 00001010, que era el 1º paso del motor, al mantenerlo pulsado salteaba siempre ese primer paso y por eso se producia el efecto q mencione en mi primer post en que el motor hacia un movimiento "pendular" por asi decirlo (giraba un poquito para un lado y luego otro poquito para el otro)


Muchas gracias a ambos por usar su tiempo en contestar mis dudas rapidamente, de ahora en mas van a tener q soportar mis preguntas basicas, tontas y hasta comicas por un largo rato porq con gente asi contestando no da verguenza hacer ese tipo de preguntas, jaja. saludos


PD: en cuanto a la alimentacion de VSS, VS y la alimentacion del pic, que pasa si tomo todo de la misma fuente? que en mi caso es el cargador de un celular :B.
Y otra pregunta mas, un motor de disquetera que tensión y que intensidad necesita para andar bien? el motorcito tiene unas cosas escritas, pero no existe el datasheet o no lo encontre, la incripcion que tiene atras dice "MSAP020A02 4303B S"

muchas gracias de nuevo y exitos

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Motor PaP bipolar 16F628a assembler
« Respuesta #4 en: 09 de Mayo de 2011, 06:59:30 »
Citar
En cuanto a la secuencia, yo interpreto el cuadro de la pagina que me pasaste como: +Vcc = 1, GND = 0, y con esto me surge una nueva duda, que por cierto es muy basica: me pongo a pensar, cuando le mando un cero logico desde el pic al motor esto quiere decir q lo conecta a maza?

Si, al poner un extremo de la bobina a +5V y el otro extremo a 0V haces circular la corriente entre +5V y los 0V, es decir hace de masa. En los unipolares llevan la masa independiente en mitad de la bobina, pero en los bipolares los extremos de las bobinas hacen de masa y de positivo. Los bipolares tienen mas fuerza porque trabaja la bobina entera, en los unipolares trabaja la mitad de la bobina.

En esta secuencia basta con ponerla asi.Si es 1 estara ahi ejecutando en btfsc y el goto, en cuanto sea 0 saltara el goto y empezara a ejecutar el programa (de momento lo dejaremos sin antirrebotes)



Código: [Seleccionar]
[Bucle    btfsc PORTA,Pulsador ;pregunto si esta en 0 logico
      goto     Bucle       ;espera a que sea 0
      movlw b'00001010'    ;realizo el primer paso del motor
      movwf PORTB/code]



Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Motor PaP bipolar 16F628a assembler
« Respuesta #5 en: 09 de Mayo de 2011, 09:16:17 »
Te voy a dejar una pagina muy buena para aprender assembler desde 0, primero con el 16f84 y despues con el 16f628, aprendiendo esto los programas para mover PAP seran pan comido.


http://www.todopic.com.ar/foros/index.php?topic=24720.0

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re: Motor PaP bipolar 16F628a assembler
« Respuesta #6 en: 09 de Mayo de 2011, 11:05:43 »
El motor de disquetera que yo tengo es de una de esas de 51/2" y tiene 5 cables. Yo la alimento a 12v y anda bien, aunque calienta un poco. Tambien puedes conseguir de alguna impresora en desuso.