Autor Tema: Como mover 4 servos automáticamente con pic 16F628A en pic basic pro?  (Leído 3404 veces)

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

Desconectado Dareblix005

  • PIC10
  • *
  • Mensajes: 18
Hola, estoy trabajando con un brazo robotico que posee 4 servos y bien tengo este programa para mover un servo de 0 a 90 a 180 y a 0 respectivamente, este programa funciona perfecto para un servo pero lo que necesito que el primer servo se mueva tal y como esta este programa y los demás de 0 a 90 y de 90 a 0 respectivamente uno después de el otro sin necesidad de pushbuttons,intente poniendo mas variables de servos, copiando la secuencia debajo de esta y agregarlo la variable del otro servo como servo2 en portb.1 y nada por favor espero una respuesta este es el programa que utilice para un servo. Muchas gracias por leer! :mrgreen:
R VAR BYTE
SERVO VAR PORTB.0

INICIO:
FOR R=1 TO 100
 HIGH SERVO
 PAUSEUS 500
 LOW SERVO
 PAUSEUS 20000
NEXT
PAUSE 3000
FOR R=1
 HIGH SERVO
 PAUSEUS 1500
 LOW SERVO
 PAUSEUS 2000
NEXT
 PAUSE 3000
FOR R=1 TO 100
 HIGH SERVO
 PAUSEUS 2500
 LOW SERVO
 PAUSEUS 20000
NEXT
PAUSE 3000
GOTO INICIO

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Como mover 4 servos automáticamente con pic 16F628A en pic basic pro?
« Respuesta #1 en: 18 de Marzo de 2016, 17:21:43 »
No uso Basic, pero el problema esta en tus PAUSExx , a no ser que quieras que todos los servos se muevan identicamente.

Si queres control individual o grupal, Usa un timer, y su interrupcion, el timer deberia entrar a la interrupcion la cantidad de veces que necesites de precision. Ejemplo Si queres tener 64 pasos desde 0 a 180º entonces tu timer deberia interrumpir cada: 1ms/64 = 15.65us aprox. Luego en la interrupcion tenes un contador que va de 0 a 63 que vas a comprar con variables y si es mayor o menor poner a 1 o 0 la salida del servo correspondiente.

Como tu programa solo quiere ir de 0 a 90 y luego a 180, podrias hacer hacer una interrupcion cada 0.5ms, Cuando se cumplan 40 interrupciones ( 20ms / 0.5ms ) tenes que poner la salida a 1, Y cuando se cumpla el tiempo necesario, como en tu ejemplo 3 segundos, es decir cuando se reinicie 150 veces (3s/20ms) el PWM pasas de activarlo en la segunda interrupcion ( 1ms - 0º ) a la tercera (1.5 ms - 90º) luego lo mismo pero con  la cuarta (2ms - 180º ). LLegado al punto en que estas usando la cuarta interrupcion y esperando esos 3s y volves a usar la 2da interrupcion.

Te daras cuenta que lo unico que tenes que hacer es:

Tener una interrupcion de un timer a 0.5ms, lo mejor es el CCP + Timer1
Una variable que tenga la cantidad de veces que entra en la interrupcion - Var1
Una variable que tenga la cantidad de veces que se reinicia - Var 2 , al comparar Var1 con 40, aumentar Var2 en 1 y poner todas las salidas a 1

Una variable para cada servo a comparar con las entrante a las interrupciones ( que define el angulo ), esta comparada con Var1 va a indicar el programa cuando se pone a 0 la salida, es decir la 2da interrupcion tendria un 2 aca.
Una variable a comparar con la cantidad de veces que se reinicia por si queres cambiar el tiempo.

En fin si no me entendiste busca por el foro o por internet sobre servos manejados por timer, debe haber ejemplos. Aunque me manejo con C, creo que te debe dar una idea de como hacerlo.

Desconectado Dareblix005

  • PIC10
  • *
  • Mensajes: 18
Re:Como mover 4 servos automáticamente con pic 16F628A en pic basic pro?
« Respuesta #2 en: 18 de Marzo de 2016, 18:46:08 »
 Hola, antes gracias por responder y creo entender. Podría ser así como asigne r en este programa en la variable del servo asignaría otra variable x entonces cuando r sea =100 then... Y lo mandó a otra etiqueta con la misma rutina y con otra variable de servo2 y x en el conteo y así sucesivamente para que se mueva un servo y después el siguiente? Lo de los retardos no lo entiendo  :shock:

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Como mover 4 servos automáticamente con pic 16F628A en pic basic pro?
« Respuesta #3 en: 18 de Marzo de 2016, 19:29:21 »
Parecido pero eso en una interrupcion de un timer. Seria algo asi,,, espero que me entiendas por que no uso basic


Rutina de interrupcion del CCP:

Citar
CantidadInterrupciones = CantidadInterrupciones + 1

if CantidadInterrupciones igual a 40 Then:
         CantidadDeReinicios = CantidadDeReinicios + 1
         CantidadInterrupciones = 0
         Subo Servo1
         Subo Servo2
         Subo Servo3

if CantidadInterrupciones igual a InterrupcionesServo1 Then:
         Bajo Servo1
if CantidadInterrupciones igual a InterrupcionesServo2 Then:
         Bajo Servo2
if CantidadInterrupciones igual a InterrupcionesServo3 Then:
         Bajo Servo3

Limpio Flag si se debe realizar


Programa Principal:

Citar
if CantidadDeReinicio igual a 140 Then:
     CantidadDeReinicio = 0
     Servo1 = Servo1 + 1
     if Servo1 igual a 5 Then:
                Servo1 = 2                              'Cantidad de interrupciones, 2 serian 2 * 0.5ms = 1ms, 4 serian 2ms, 5 se pasaria entonces lo volvemos a 1ms
     Servo2 = Servo2 + 1
     if Servo2 igual a 5 Then:
                Servo2 = 2
     Servo3 = Servo3 + 1
     if Servo3 igual a 5 Then:
                Servo3 = 2

Como te decia no programo en basic pero espero que ahora le entiendas mejor, tenes que configurar tu timer a 0.5ms cada interrupcion, Lo mejor que lo hagas con el uso del modulo CCP en compare. Cada ves que ocurre la interrupcion del modulo CCP se ejecuta el primer codigo ( es decir se ejecuta cada 0.5ms ), Lo de abajo deberia estar en el programa principal o en la rutina de interrupcion tambien
« Última modificación: 18 de Marzo de 2016, 20:52:18 por KILLERJC »


 

anything