TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: peyutron1 en 28 de Septiembre de 2009, 09:43:52

Título: mi servo no se esta quieto o si...
Publicado por: peyutron1 en 28 de Septiembre de 2009, 09:43:52
Buenas!!
llevo todo el dia probando para poder parar un servo en una posicion y no hay manera estoy utilizando este codigo
Código: [Seleccionar]

' servo que se mueve de izquierda a derecha

ser var portb.0    'servo en el B0
pw var byte
pw = 150

derecha:
    pulsout ser,pw
    pause 18
    pw = pw + 1
    if pw > 220 then izquierda
    goto derecha
izquierda:
    pulsout ser,pw
    pause 18
    pw = pw - 1
    if pw < 80 then derecha
    goto izquierda
 end
pero no hay manera he intercalado "pauses" por todos los sitios y no hay manera de que se este quieto en un lado,va dando saltitos sin ton ni son. Mi intencion esque haga un barrido y se detenga en la posicion mas a la izquierda durante 5seg y luego valla otra vez a la derecha hasta el final y se detenga otros 5 seg. una ayudita?? Gracias de antemano
Título: Re: mi servo no se esta quieto!!
Publicado por: Slalen en 28 de Septiembre de 2009, 12:51:57
Para conseguir que se estabilice, tienes que mandar CONTÍNUAMENTE una señal PWM con un tiempo en alto determinado.

Mira:
http://slalen.ifastnet.com/index.php/servomotores.html
http://slalen.ifastnet.com/index.php/futaba-y-los-pics.html

Si haces un pause, dejas de mandar la señal con lo que el servo se posiciona en su origen.
Título: Re: mi servo no se esta quieto!!
Publicado por: Burrillo en 02 de Octubre de 2009, 21:32:34
mmmm, para empezar no inicializas el puerto b con un pulso en 0, tendria que ser algo así:

Código: [Seleccionar]
derecha:
   
    PORTB = 0         
    pulsout ser,pw
    pause 18

Esta medio raro como estas variando el "pw", igual y podria ser algo así:

Código: [Seleccionar]
derecha:
PORTB = 0
for pw = 80 to 221
     
     pw = pw + 1
     pulsout ser,pw
   
if pw > 220 then izquierda

NEXT pw


Y tal vez para hacer lo que dices del retardo podrias hacer un for anidado el la subrutina "izquierda".
Es lo que se me ocurre, espero te sirva.
Título: Re: mi servo no se esta quieto!!
Publicado por: peyutron1 en 11 de Octubre de 2009, 10:48:28
buenas! he estado un poco liado y no he podido responder antes, he hecho esto :
Código: [Seleccionar]
' servo que se mueve de izquierda a derecha

ser var portb.0    'servo en el B0
pw var byte
pw = 150
ser = 0
derecha:
    ser = 0
    for pw = 80 to 220
    pulsout ser,pw
    pause 18
    pw = pw + 1
    if pw > 220 then izquierda
    next pw
    goto derecha
izquierda:
    ser = 0
    for pw = 220 to 80
    pulsout ser,pw
    pause 18
    pw = pw - 1
    if pw < 80 then derecha
    next pw
    goto izquierda
 end
pero solo va hacia un lado y ahi se keda... bueno en fin probando mas cosas probe esto otro,
Código: [Seleccionar]
ser var portb.0     ;servo en el B0
forw var portb.1   ;motor en el B1>
back var portb.2  ;motor en el B2> este motor es controlado por un puente H
p1 var porta.0      ;pulsador en el puerto A0
p2 var porta.1      ;pulsador en el puerto A1
b1 var byte
frec var byte

b1 = 150 ; variable  para poner el servo en posicion central
frec = 18

start:
low back                            ;pone en nivel bajo el puerto B2
pulsout ser, b1                   ; pone el servo en posicion central
pwm forw,frec,30                ;el motoro se mueve hacia adelante
    if p1 = 0 then izquierda   ; si se pulsa p1 ir a etiqueta izquierda
    if p2 = 0 then derecha    ;si se pulsa p2 ir a etiqueta derecha
goto start                          ; repite start

izquierda:
    high back                       ;pone marcha atras el motor
    pulsout ser, b1                ;gira hacia la izquierda hasta llegar al tope 
    pause 18
    b1 = b1 + 1
    if b1 > 210 then start      ; cuando llega al tope pasa a la etiqueta start
    goto izquierda                 ; repite la etiqueta hasta que if -- then sea cierto
   

derecha:
    high back
    pulsout ser, b1
    pause 18
    b1 = b1 - 1
    if b1 < 80 then start
    goto derecha
end

vale pues funciona todo menos que vuelva a su posicion central, he intentado hacer una etiqueta llamada start y otra forward
Código: [Seleccionar]
start:
pulsout ser, b1
pause 18
b1 = b1
if b1 = b1 then forward
goto start


forward:   
    low bck
    pwm forw,frec,30
    if p1 = 0 then izquierda
    if p2 = 0 then derecha
goto forward
pero me sigue pasando lo mismo, cuando llega a la izquierda o a la derecha ahi se queda... vuelve a ir hacia delante pero el servo no recupera su posicion central, he provado con for x = 1 to 10 para este ultimo "start" pero nada o peor...
se que esto se supone que es lo mas sencillo del mundo... pero no hay manera...alguna sugerencia?? que estoy haciendo mal?