Autor Tema: Problema con un Programa de control de giro de servo motor  (Leído 2708 veces)

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

Desconectado spire233

  • PIC10
  • *
  • Mensajes: 8
Problema con un Programa de control de giro de servo motor
« en: 23 de Febrero de 2015, 00:13:06 »
Hola gente, tengo un proyecto de de hacer girar un servomotor, lo cual ya lo logre, pero quiero reducir la velocidad del servomotor, me dijeron que agrege retardos en una parte, sin embargo los agrege y me modifico los giros, no giraba exactamente como antes, el programa sirve como esta por si alguien lo necesita.
 
Citar
ENTRD
------EN ESTA PARTE ME DIJERON QUE AGREGARA UN RETARDO EN CADA CASO DE GIRO-----
MOVLW B'00000001'
MOVWF PORTB
CALL DELAY_SUBIDA ;;2MS
MOVLW 0X00
MOVWF PORTB
CALL DELAY_SUBIDA_MS ;18MS
DECFSZ Q0,F
GOTO ENTRD
CALL BAJADA_1
GOTO COMIENZA
los agrege donde indique pero no resulto o no lo supe agregar... no se si alguien me pueda ayudar o decirme como disminuir la velocidad, adjunto el archivo asm para los que les sirva el programa

Desconectado Pinolillo16

  • PIC18
  • ****
  • Mensajes: 324
Re: Problema con un Programa de control de giro de servo motor
« Respuesta #1 en: 23 de Febrero de 2015, 04:14:34 »
Que tal Spire, mira no entendi muy bien tu código solo te recuerdo que los servos funcionan a una frecuencia de 50Hz, para la cual cada 20ms tienes que estar actualizando la posición, la mayoria de los servos te piden un pulso mínimo de 0.5ms y de ahi la mayoria sirve hasta 2.5ms lo cual te da un area de trabajo de 2ms que es donde determinas la posición. De acuerdo a lo que yo he realizado es que si quieres moverlo mas despacio, no tienes que cambiar por ejemplo de la posición 0° a 90° ya que lo hace en "un solo movimiento" considera que muchos servos son lentos aprox de 17°/s. Bien para que sea mas lento tus movimientos pordrian ser: 0° a 30° y luego a 60° y despues a 90°. Lo cual hace ver el movimiento mas suave, desde luego que si lo haces de grado en grado mucho mejor. Bien por otra parte ue observe en tu código te puedo recomendar esto:
Código: [Seleccionar]
MOVLW  B'00000001'
MOVWF PORTB
; LO PUEDES CAMBIAR POR
BSF  PORTB,0; UNA SOLA INSTRUCCION
; Y EL OTRO EJEMPLO ES
MOVLW 0X00
MOVWF PORTB
; CAMBIALO POR
BCF PORTB,0
; O BIEN  POR
CLRF PORTB
; AMBAS TE AYUDAN A REDUCIR EL TIEMPO DE DURACION DE TU PROGRAMA

Saludos y espero que te haya servido.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Problema con un Programa de control de giro de servo motor
« Respuesta #2 en: 23 de Febrero de 2015, 04:35:13 »
EDIT: Pino me gano de mano pero la respuesta va a spire

es que tenes una mala idea de como funciona el servo.. el servo gira dependiendo del duty que tengas.

Al servo lo controlas por PWM,



donde tenes una frecuencia fija.. es decir la suma del tiempo que esta en alto ( Ton ) y bajo (Toff) es siempre igual, 20ms
ahora si vos a Ton lo tenes en 1ms estarias en 0º (Toff=19ms) y 2 ms en 90º(Toff=18ms) como para darte una idea.. observa que el periodo ( Ton+Toff ) es siempre el mismo.

Si agregas un retardo ahi donde pusiste terminarias modificando el periodo/frecuencia de la señal de PWM. (quedando Ton+Toff+retardo_agregado). Por lo cual no deberias de hacerlo asi.

Volvamos al tema principal como dije vos tenes 2 escalones uno que llamas "entrada" lo pone a 90º y el otro "bajada" que lo vuelve a 0º, si quisieras que fuera mas lento deberias de hacer distintos escalones.. por ejemplo suponete que quiero que haga 5 pasos entre 0 y 90º entonces deberia mandar:

Ton = 1ms y Toff=19ms
Ton = 1.2ms Toff=18.8ms
Ton = 1.4ms Toff=18.6ms
...
Ton = 2ms Toff=18ms

Esto va a producir una especie de escalon en la rotacion del servo ( por que son 5 ) pero si se pudiera hacer algo con muchos mas pasos entonces se veria mas continuo. Esto realizado con delays va a ser complejo, ya que tenes que seguir teniendo la proporcion para que la suma de ambos delays te den 20ms ( cuando lo tenes en 0 y en 1 ).

Tal ves lo mejor seria usar un timer para la generacion del PWM y que cada varios envios de la señal se modifique el duty ( Ton ) poco a poco.



EDIT:

Lo vi pero no lo iba a decir... Pino tiene razon, para cabiar un solo bit podrias usar tranquilamente BSF o BCF, y de ultima CLRF s pones todo a 0.

Tambien esta parte, el CALL y el GOTO  no tiene sentido:

Código: [Seleccionar]
DECFSZ Q0,F
GOTO ENTRD
CALL BAJADA_1
GOTO COMIENZA

BAJADA_1
BTFSS PORTA,1

Pudiendolo reemplazar por:

Código: [Seleccionar]
DECFSZ Q0,F
GOTO ENTRD

BAJADA_1
BTFSS PORTA,1

Ademas estas usando un CALL que luego no tiene un RETURN, por lo tanto estas metiendo una direccion a la pila que luego no sacas y hay varios micros que entran en una interrupcion al haber un desborde de pila ( ya que estarias llenando y nunca lo vacias )

Y tu programa queda esperando si o si por la tecla especifica esa sino no hace nada.
« Última modificación: 23 de Febrero de 2015, 04:49:16 por KILLERJC »


 

anything