Autor Tema: Control Motor PAP  (Leído 8811 veces)

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

Desconectado Moyin

  • PIC16
  • ***
  • Mensajes: 102
Control Motor PAP
« en: 19 de Octubre de 2006, 02:12:02 »
Hola buenos amigos del foro, estoy tratando de realizar el control de un PAP pero revisando ejemplos con PIC'S encuentro que para invertir la secuencia o giro del motor todos los programas terminan el ciclo antes de invertir el giro, esto hasta cierto punto no es tan grave ya que 4 pasos no son nada para ciertas aplicaciones y es tolerable este pequeño avance, yo he realizado con PLD(Gal) secuencias para steeper y como los manejo por estados puedo invertir el giro en cualquier momento y no tengo qu esperar a que se cunplan todos los estado para que cambie la secuencia, mi duda es como puedo hacer esto con un PIC, imagino que tengo que cargar el paso en alguna memoria para después leerla y ver hacia donde avanzo atrás o adelante, supongo esto, no tengo idea de como llevarlo con PIC, estoy manejando todo con MKB y es como pretendo hacerlo, si me dan una idea de como hacerlo se los agradeceré....Gracias :mrgreen:
Sonrie Cristo te ama

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Control Motor PAP
« Respuesta #1 en: 19 de Octubre de 2006, 02:28:25 »
Hola MOYIN, pues podiras usar un driver, aunque no he usado nunca uno, no se si te sirva el L293D, en BASIC  para usar motores paso a paso podrias usar las recomendaciones de amigos del foro como son los vectores, yo alguna vez en PBP use LOW y HIGH aunque si es un desperdicio. Lord me comento esto de los vectores

Hola:

pues efectivamente no puedes hacer eso... pero puedes sustituirlo por un vector y asignar cada secuencia a un indece y luego asignar al puerto el valor coreespondiente del subindice del vector:

Algo asi:

vec var byte [10]
i      var byte

vec[0]=%00000001
vec[1]=%00000010
-
-
-
-

loop:
        for i=0 to 10
             -
             -
             -
             portc=vec[ i ]
             -
             -
             -
        next i 
    goto loop
    end

Algo como eso... o tambien utilizando la funcion LOOKUP....

Suerte....!

O este otro

Hola:

Pues para comandar motores de pasos....

Tambien podrias hacerlo asi

loop:
        PORTC=%01010101
        pause 50
        PORTC=%01010110
        pause 50
        goto loop

Con las secuencias correspondientes y el numero de veces que sea necesario para mover el motor.... yo lo he hecho con vectores como en el ejemplo de arriba para comandar motores PAP....

Lo hacia dentro de un bucle repeat - until... hasta una condicion deseada....

Espero te sirva de algo o que te de una idea



« Última modificación: 19 de Octubre de 2006, 02:31:16 por navaismo »
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado manupri

  • PIC10
  • *
  • Mensajes: 21
Control Motor PAP
« Respuesta #2 en: 23 de Mayo de 2008, 10:43:50 »
Hola a todos , soy nuevo en el foro, pero lo mejor es que me encanta el mundo de los pic, y me gustaría hacer una pregunta a navaismo si no tiene inconveniente en responderme.
Navaismo estoy haciendo un pequeño esperimento con un motor PaP bipolar, usando un Driver L293B y in PIC 16f84A, y estoy aprendiendo como puedo, entre lo que veo en el foro y algunos manuales de internet a programar con protón, de momento todo me funciona, pero mi problema es que necesito hacer andar dicho motor hacia delante y cuando pulse un Button que el motor gire al contrario pero solo el tiempo que yo le asigne, no se si me explico.
En realidad  mi código lo que hace es poner en funcionamiento el motor haciadelante y cuando pulso el Button lo hace hacia atras, pero no lo puedo parar  aún pulsando de nuevo el Button ,tengo que interrumpir  la animación en proteus.
Te muestro el código a ver que piensas

Es éste:


DEVICE  16F84a   'PIC que voy a usar
XTAL 4                'frecuencia del crystal

  clear ' si no hay variables despues de esta instrucción aclaro la RAM del PIC

 TRISB=%00000000 ' dirección de datos donde configuro los pin del Puerto B como salida

       inicio:  ' etiqueta donde volvere con goto
 
              if porta.0=0 then 'compruebo si el pin 0 del puerto A es pulsado

                        portb=%00000110 : delayms 25  ____
                        portb=%00000100 : delayms 25        '
                        portb=%00001000 : delayms 25        ----- asignación de pasos y pausas a los pin del port b (salida hacia el motor)
                        portb=%00001010 : delayms 25  ____'
 
             else  ' si no es pulsado ocurre lo siguiente

                       portb=%00001010 : delayms 25  ____
                       portb=%00001001 : delayms 25        '
                       portb=%00000101 : delayms 25        ----- asignación de pasos y pausas a los pin del port b (salida hacia el motor)
                       portb=%00000011 : delayms 25  ____'


            endif ' fin de la instrucción if then
 
  goto inicio ' nos vamos de nuevo ala etiqueta inicio

end. ' y terminamos


 navaismo corrije este desastre porfa, como te dije lo que quiero hacer es que cuando se pulse el button el motor gire al contrario el tiempo que yo determine y luego vuelva  a girar hacia delante hasta una nueva pulsación  y asi sucesivamente.


gracias y un Saludo
 

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Control Motor PAP
« Respuesta #3 en: 23 de Mayo de 2008, 14:32:36 »
Hola segun veo el codigo solo usas un boton, Y supongo que cuando esta en alto quieres que vaya hacia atras, entonces creo que lo que te falta declarar es es TRISA.0=1 asi le dices que ese pin sera entrada y te evaluara sus estados.


Si lo que quieres hacer es usar un solo boton y cada que lo presiones gire en un sentido haz que el boton incremente una variable y despues evalua esta variabla algo como

c=0
If c>=3 then
 c=0
endif

if porta.0 = 1 then
pause 150 'antirebote
if porta.0 = 1 then
c=c+1
endif
endif

select case c
case 1 gosub adelante
case 2 gosub atras
end select


y tus rutinas....


Espero me explique cualquier cosa nos avisas



"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado manupri

  • PIC10
  • *
  • Mensajes: 21
Re: Control Motor PAP
« Respuesta #4 en: 23 de Mayo de 2008, 15:28:13 »
Hola de nuevo, no sabes la alegria que me da poder entrar en el foro y ver que me responden, de esa manera  me siento participe, aunque  carezco de esperiencia y soy un profano en la programación pero intentare compartir todo lo que este en mis manos ,gracias
Ante todo decirte que tengo declarado el TRISA=%11111 , solo que en el ejemplo anterior no lo inclui, aún no he probado el código que tu expones, lo de incrementar la variable , primero, por que como te he dicho no tengo muy claro lo de la programación y no entra en mis principios hacer algo que no entiendo, de todas formas voy a probar ese trozo de código, y luego te comento.
Ahora comprueba  aver si he comprendido tu código

C=0     ' declaramos c  con el valor de 0
IF C>=3 THEN ' si C es igual o mayor a 3 entonces
C=0     'C sigue teniendo el valor de 0
ENDIF  ' terminamos la comparación

 (no comprendo por que si porta.0=1  que se haga una pausa, sigo)

IF PORTA.0=1 THEN    ' si el pin 0 del PuertoA es igual a entrada( pulsado) entonces
DELAYMS 150  ' pausamos 150 milisegundos, ( nose que quieres decir con antirebote, he leido algo pero no recuerdo)
IF PORTA.0=1 THEN  ' si el pin 0 del PuertoA es igual a entrada(pulsado) entonces
C=C+1  ' el valor de C se incrementa a 1
ENDIF   ' fin del 1º IF  THEN
ENDIF   'fin del 2º IF   THEN


SELEC CASE C  ' no tengo ni idea de su significado

CASE 1 GOSUB ADELANTE '  creo que quiere decir que en caso de que el valor de C sea 1 vaya ha la etiqueta ADELANTE y                   

                                        'ejecute lo que encierre la misma ,en este caso  los PORTB=%XXXXXXXX   de mi código no?


CASE 2 GOSUB ADELANTE '  creo que quiere decir que en caso de que el valor de C sea 2 vaya ha la etiqueta ATRAS y                   

                                        'ejecute lo que encierre la misma ,en este caso  los PORTB=%XXXXXXXX   tambien



END SELECT   ' ni idea me lo tienes que explicar



Vueno  aver  que te parece, no se si  lo he interpretado bien o no me he enterao de na
ya me cuentas luego, quisiera decirte que  lo que necesito es un codigo el cual me haga andar el motor  hacia la derecha y que cuando se presione  un pulsador botón haga que el motor gire hacia la izquierda un intervalo de tiempo por ejemplo (250ms) y transcurrido ese intervalo de tiempo vuelva automaticamente de nuevo a girar hacia la derecha otra vez.

Que cada vez que se pulse gire ala izquierda esos 250ml.
Espero haberme esplicado, no quiero agobiar con tantas preguntas, ahora voy a probar con tu código, en cuestión de minutos te contesto con el resurtado.

Gracias y saludos
« Última modificación: 23 de Mayo de 2008, 15:39:21 por manupri »

Desconectado manupri

  • PIC10
  • *
  • Mensajes: 21
Re: Control Motor PAP
« Respuesta #5 en: 23 de Mayo de 2008, 16:03:58 »
hola  , estoy aqui de nuevo hace nada he probado el codigo, asi es como lo interprete,

device 16f84A ' PIC a usar
xtal 4 'frecuencia a usar


 'TRISA.0=1
 TRISB=%00000000
'PORTB=0
dim c as Byte


 c=0
 if c>=3 then
 c=0
 endif


   if porta.0=1 then
   delayms 150
   if porta.0=1 then           
      
      c=c+1
      endif
      endif
   
 select Case c
 
 case 1
 gosub adelante
 case 2
 gosub atras
 end select
      
      adelante:
      portb=%00000110:delayms 25
      portb=%00000101:delayms 25
      portb=%00001001:delayms 25
      portb=%00001010:delayms 25
   return
   
   
    atras:
     portb=%00001010:delayms 25
     portb=%00001001:delayms 25
     portb=%00000101:delayms 25
     portb=%00000110:delayms 25
   
     return 



no se si lo he correcto, el caso es que el motor en la simulación de proteus  solo funciona durante unos segundos y luego se queda completamente parado, e lpulsador queda bloqueado osea no hace nada, cambie el pulsador por un SWITCH (interruptor) pero tampoco responde, que piensas que puede ser  navaismo??

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Control Motor PAP
« Respuesta #6 en: 23 de Mayo de 2008, 16:12:04 »
Bien el antirrebote es para que el pic solo detecte un solo 1 cuando aprietas el switch; los switchs al ser de contactos mecanicos tardan algunos Milisegundos en acloparse lo cual genera rebotes entre los estados 1 y 0 logicos, los PICs son capaces de detectar estos saltos por eso ponemos esas pausas para que efectivamente lea ese estado y no se confunda con ruido.

La instruccion SELECT CASE lo que hace es evaluar la variable o puerto depende lo que quiera que este delante de la instruccion esta se basa en casos los casos como puedes ver pueden tener un valor el que tu quieras incluso una letra ya que tomaria su valor ascii. Puede tener tantos casos quieras -solo no abusar- en cada caso puedes meter las instrucciones que desees, en este caso lo enviamos a esas etiquetas. Y su sintaxis es:

Select case variable
casos...
....
end select

Mas informacion en la ayuda.


Sobre tu programa yo lo que haria seria algo como esto:


Main:

Gosub Adelante

if porta=0 then atras

goto Main:

Adelante:
tus rutinas de manejo de motor
Return 'regresa a la ultima linea despues del gosub

Atras
 for i=0 to 25
 rutina de atras
 pause 100
 next i
goto main ' aqui no usa return ya que no fue un gosub


Algo asi mas o menos seria para mi lo mas practico.
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado manupri

  • PIC10
  • *
  • Mensajes: 21
Re: Control Motor PAP
« Respuesta #7 en: 23 de Mayo de 2008, 18:27:07 »
Hola navaismo, ante todo muchas gracias por tu ayuda y ofrecimiento, decirte que he compilado el codigo pero sigue sin responder  a lo que yo realmente deseo con esto me refiero a proteus en la simulación, puesto que la primera reacción del motor ante el código compilado que propusiste es: Un par de vueltas hacia la derecha y luego  vueltas pausadas hacia la izquierda, en las cuales hay en cada ciclo de no se exactamente cuantas vueltas, una nueva vuelta ala derecha y de nuevo otra vez hacia la izquierda, vueltas como ya te digo alternas entre vuelta y pausa.
Luego cuando pulso el botón tarda unos segundos en reaccionar y entonces comienza a girar hacia la derecha, estos si son giros e progresivos y sin pausa alguna, pero vuelvo a pulsar el botón y no ocurre nada, te dejo una imagen del circuito a ver si notas algo  contrario a lo correcto..
Decirte en un momento dado es casi lo que necesito, eso si, que no durara tanto tiempo el giro hacia la izquierda.
saludos de nuevo y gracias.

este es el código por si ves algo anormal:



   device 16f84A
   xtal 4

 TRISA.0=1
 TRISB=&00000000

DIM I AS BYTE

        main:
   
        Gosub adelante

          if porta=0 then atras

        goto main


adelante:
           portb=%00000110 : delayms 25
           portb=%00000100 : delayms 25
           portb=%00001001 : delayms 25
           portb=%00001010 : delayms 25



  return


atras:
          for I=0 to 25


           portb=%00001010 : delayms 25
           portb=%00001001 : delayms 25
           portb=%00000101 : delayms 25
           portb=%00000110 : delayms 25

Delayms 25

Next i


Goto main




     

Desconectado manupri

  • PIC10
  • *
  • Mensajes: 21
Re: Control Motor PAP
« Respuesta #8 en: 23 de Mayo de 2008, 18:30:50 »
La imagen no la puedo subir, el motivo es que la salve muy pesada y  no se admiten mayor peso de 250k
Estoy intentando adelgasar la imagen en breve la subo.
Saludos

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Control Motor PAP
« Respuesta #9 en: 23 de Mayo de 2008, 18:33:38 »
A es verdad mete esta parte if porta=0 then atras en la subrutina de Adelante para que se corte sin retardos, Sobre las pausas es por el PAUSE dentro del for esto lo puedes quitar el for esra para darte una idea de como crear una rutina de tiempo.

Y no veo el circuito
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Control Motor PAP
« Respuesta #10 en: 23 de Mayo de 2008, 18:39:31 »
Haber intenta asi:

device 16f84A
   xtal 4

 TRISA.0=1
 TRISB=&00000000

DIM I AS BYTE

main:
   
        Gosub adelante

          if porta=0 then atras

goto main


adelante:

if porta=0 then atras

           portb=%00000110 : delayms 25
           portb=%00000100 : delayms 25
           portb=%00001001 : delayms 25
           portb=%00001010 : delayms 25
  return


atras:
    for I=0 to 250
           portb=%00001010 : delayms 25
           portb=%00001001 : delayms 25
           portb=%00000101 : delayms 25
           portb=%00000110 : delayms 25
Next i
Goto main
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado manupri

  • PIC10
  • *
  • Mensajes: 21
Re: Control Motor PAP
« Respuesta #11 en: 23 de Mayo de 2008, 19:15:29 »
Navaismo con estos cambios que efectuo en los IF THEN el motor comienza a girar hacia la derecha y cuando pulso el button lo hace hacia la izquierda, pero no un tiempo determinado como deseo sino que sigue girando sin parar.
Que se puede hacer al respecto.

Este es el código, aver si se logra parar el dichoso motor


device 16f84A
   xtal 4

 TRISA.0=1
 TRISB=&00000000

DIM I AS BYTE

main:
   
        Gosub adelante

          if porta=1 then atras ' en vez de salida 0 un 1 entrada

goto main


adelante:

if porta=1 then atras ' aqui  igual 1 en vez de 0

           portb=%00000110 : delayms 25
           portb=%00000100 : delayms 25
           portb=%00001001 : delayms 25
           portb=%00001010 : delayms 25
  return


atras:
    for I=0 to 3
           portb=%00001010 : delayms 25
           portb=%00001001 : delayms 25
           portb=%00000101 : delayms 25
           portb=%00000110 : delayms 25
Next i
Goto main

Desconectado navaismo

  • Jubilado Todopic
  • PIC24H
  • ****
  • Mensajes: 1973
Re: Control Motor PAP
« Respuesta #12 en: 23 de Mayo de 2008, 19:21:02 »
mira el tiempo depende de los ciclos del for sumados a las pausas que esten dentro de este mismo. Por ejemplo en tu codigo tienes un for que se repite 4 veces y cada ciclo por las pausas dura 100mS por los delay de 25mS por lo que yo deduzco que girara durante 400mS o lo que seria lo mismo 4 pasos. Me captas?
"Mi tercer deseo, que otra cosa podría ser, poner un final a todo el sufrimiento, que sólo con mi propia extinción el planeta podrá ser aliviado. Pobre de mí, Si tuviera tres deseos hoy, la elección no sería dificil para mí, Sólo tres deseos serían suficientes, No tendría uso para más."

"He sido un hombre que busca y aun lo sigo siendo, pero ya no busco en las estrellas y en los libros, sino en las enseñanzas de mi sangre."

Desconectado manupri

  • PIC10
  • *
  • Mensajes: 21
Re: Control Motor PAP
« Respuesta #13 en: 23 de Mayo de 2008, 19:21:52 »
No quiero ser pesaito, pero incluso si lo fuese es algo emocionante descubrir que algo  comienza a funcionar
Siento las molestias que te causo, pero eres mi unica salvación, estoy ilusionado con esta web, mi proyecto y tus conocimiento de manera que te agradezco todo el esfuerzo, a ver si se bate el record  i se consigue parar el motor y que despues de unos instante vuelva a girar en el sentido en que comienza.

Desconectado manupri

  • PIC10
  • *
  • Mensajes: 21
Re: Control Motor PAP
« Respuesta #14 en: 23 de Mayo de 2008, 19:28:54 »
Osea 25 milisegundos del delay por 4 del FOR asi por 4 veces  correcto??
Quieres decir que transcurrido ese tiempo devería de parar???.
¡ha estoy ejecutando paso a paso el codigo en proteus y veo que cuando se termina el ciclo d 4 veces del FOR salta al GOSUB empezar, en vez de pasar por el GOTO main que va despues del NEXT, no lo entiendo,  pienso que si no se fuese al GOSUB y pasara por el GOTO comenzaría a girar basado en la subrutina ADELANTE, no se si me explico?
« Última modificación: 23 de Mayo de 2008, 19:38:31 por manupri »