fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

16f / 12f vibracion de servos

10 Respuestas
4 Usuarios
0 Reactions
2,939 Visitas
proyectista
Respuestas: 4
Topic starter
(@proyectista)
New Member
Registrado: hace 17 años

Hola, tengo un problemilla con un servo. Utilizo un pic (12f683 o 16f84a) conectado a un servo. Con ambos pics obtengo la misma respuesta. El programa intenta realizar un movimiento del servo de 0 a 180 y que vuelva seguidamente, pero el resultado esque el servo vibra como si quisiese ir para ambos lados a la vez. Por más que leo por numerosos foros no encuentro solución al problema ya que parece ser a a nadie le a surgido.
Incluso poniendo un delay (5s) entre ambos movimientos para que diese tiempo a moverse sigue sin solucionarse.

¿a alguien le ha surgido este problema?
¿alguna solucion?

Dejo el codigo.

Gracias.

list p=12F683 ; list directive to define processor
#include <p12F683> ; processor specific variable definitions
errorlevel -302 ; suppress message 302 from list file

__CONFIG _FCMEN_ON & _IESO_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT

ORG 0X00
BANCO1
MOVLW b'01100001' ; Carga el acumulador, Ponemos el oscilador a 4Mhz
MOVWF OSCCON ; Copia de acumulador a OSCCON
GOTO INICIO

;-------------------------------- programa principal------------------------------------------

INICIO:

START BANCO0
MOVLW 07H

MOVWF CMCON0
CLRF GPIO ; Inicializamos GPIO (el registro gp3 es solo de entrada)
BANCO1
BCF TRISIO,5 ;Ponemos GP5 como salida
BANCO0
BCF GPIO,5
BANCO0

BANCO1
MOVLW B'01110000' ;Ponemos AN3, AN2, AN1 Y AN0 como salida digital
MOVWF ANSEL

BANCO0

LeerEntrada CALL Servo_pos_1
CALL Servo_pos_2
GOTO Fin

;--------------------------------------------------------------------
Servo_pos_1 BSF GPIO,5
movlw .248 ; 1 set number of repetitions
movwf PDel0 ; 1 |
PLoop01 clrwdt ; 1 clear watchdog
decfsz PDel0, 1 ; 1 + (1) is the time over?
goto PLoop01 ; 2 no, loop
PDelL11 goto PDelL21 ; 2 cycles delay
PDelL21 clrwdt ; 1 cycle delay

BCF GPIO,5

PDelay19 movlw .29 ; 1 set number of repetitions (B)
movwf PDel0 ; 1 |
PLoop119 movlw .93 ; 1 set number of repetitions (A)
movwf PDel1 ; 1 |
PLoop219 clrwdt ; 1 clear watchdog
PDelL119 goto PDelL219 ; 2 cycles delay
PDelL219 clrwdt ; 1 cycle delay
decfsz PDel1, 1 ; 1 + (1) is the time over? (A)
goto PLoop219 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (B)
goto PLoop119 ; 2 no, loop
return
;------------------------------------------------------------------

;------------------------------------------------------------------
Servo_pos_2 BSF GPIO,5
movlw .249 ; 1 set number of repetitions
movwf PDel0 ; 1 |
PLoop02 clrwdt ; 1 clear watchdog
PDelL12 goto PDelL22 ; 2 cycles delay
PDelL22 goto PDelL32 ; 2 cycles delay
PDelL32
decfsz PDel0, 1 ; 1 + (1) is the time over?
goto PLoop02 ; 2 no, loop
PDelL42 goto PDelL52 ; 2 cycles delay
PDelL52 clrwdt ; 1 cycle delay

BCF GPIO,5

PDelay18 movlw .26 ; 1 set number of repetitions (B)
movwf PDel0 ; 1 |
PLoop118 movlw .172 ; 1 set number of repetitions (A)
movwf PDel1 ; 1 |
PLoop218 clrwdt ; 1 clear watchdog
decfsz PDel1, 1 ; 1 + (1) is the time over? (A);
goto PLoop218 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (B)
goto PLoop118 ; 2 no, loop
PDelL118 goto PDelL218 ; 2 cycles delay
PDelL218 clrwdt ; 1 cycle delay
return
;------------------------------------------------------------------

Fin END

Responder
9 respuestas
ranganok
Respuestas: 3875
(@ranganok)
Ardero
Registrado: hace 19 años

Proyectista, no me he mirado mucho el programa (estoy muy espeso ahora) pero se me ocurren varias cosas que le pueden pasar, compruebalas:

- ¿Tienes las conexiones bien? (es un fallo bastante común)
- ¿Cuál es la frecuencia a la que le estás enviando los pulsos?
- ¿Tienes suficiente potencia para alimentar el servo?
- ¿Has probado que la salida que le estés dando sea correcta (punta lógica, osciloscopio o analizador de redes)?
- ¿Estas trabajando con lógica negada?

S2

Ranganok Schahzaman

Responder
chris
Respuestas: 564
(@chris)
Ardero
Registrado: hace 18 años

si después de comprobar la parte electrónica el problema persiste, no estaría mal que nos muestres un diagrama de estados y flujo para poder ver los detalles de cómo se está resolviendo el comportamiento esperado del servo y compararlo con el código.

Casi siempre es un error de un dígito, la letra de una variable mal escrita o sintaxis o error de bucles.

hace tiempo que no veo lenguaje ensamblador, pero recuerdo este tipo de fallos clásicos.

¿el código es resultado de una programación en un lenguaje de más alto nivel? o ¿es programación directa en ensamblador? Es una buena práctica pasar al primero, así se evitan muchos fallos sintácticos o lógicos.

así como cuentas el comportamiento del servo, parece ser que el tiempo de espera se pierde o es demasiado breve entre 0 y 180º. Se debe estar activando el retorno antes de completar la ida.

ya nos dirás algo.

salu2.

Responder
TumBos
Respuestas: 158
(@tumbos)
Estimable Member
Registrado: hace 19 años

Por lo que veo no dejas tiempo entre posiciones.
Si no lo he entendido mal, lo que hace el programa es:
--------posicion 1--------
Activo salida servo
Retardo
Desactivo salida servo
Retardo
----posicion 2--------
Activo salida servo 2
Retardo
Desactivo salida servo
Retardo

Fin

¿donde está el retardo de 5 s. ?

Creo que la estructura deberia quedar así

bucle:
BSF salida servo;
Call retardo1 ; (0.5ms-2.5ms; pos 1 retardo servo estandar)
BCF salida servo;
Call retardo2 ; (20ms-retardo1)
call retardo_5 sg. ; no lo veo en el pograma
BSF salida servo ;
Call retardo3 ; (0.5ms-2.5ms; pos2 retardo servo estandar)
BCF salida servo
Call retardo4 ; (20ms-retardo3)
goto bucle

no me gusta esta estructura de programa pero la he seguido para que tuvieras una referencia. Hay otras formas de hacerlo (p.ej. temporizadores)

Saludos

Responder
proyectista
Respuestas: 4
Topic starter
(@proyectista)
New Member
Registrado: hace 17 años

Hola, antes de nada, gracias por contestar.
Voy por partes.
Las conexiones están correctas, alimentaciones, etc. Oscilador externo de 4 Mhz. No trabajo con lógica negada.

Está programado directamente en ensamblador, modificado de un programa que funciona correctamente con interruptores y yo lo he modificado para realizar movimientos seguidos.

En cuanto al tiempo de 5segundos lo he quitado para probarlo, pero vamos que con delay de 5seg y sin delay realiza el mismo proceso pero con el delay la vibración la realiza cada 5 segundos y sin el delay lo realiza cada continuo.

Me han comentado que se puede solucionar con temporizadores como dice Tumbos.
¿Debería utilizar el timer para testear cuando debo realizar el movimiento?
¿Debería utilizar el timer también para realizar el posicionamiento del motor?, es decir, por ejemplo poner un pulso alto de 1,5ms con el timer y despues hasta 20msg otra vez con el timer.

Un saludo.

Responder
Página 1 / 2
Compartir: