CONTROL DE LA POSICIÓN DE UN MOTOR SERVO HS-311

Como se conoce, la posición de un servo motor está determinada por el ancho del pulso que se aplica a su pin de control (para el caso de los motores HS-311 el cable amarillo). En el caso del motor HS-311, la posición de 0º se consigue con un pulso de 0.5 ms, la posición central de 90º con un pulso de 1.5 ms y el extremo de 180º con un pulso de 2.5 ms.

Para controlar la posición del motor usaré la función pulsout, cuya sintaxis es:

Pulsout pin, ancho_pulso

La cual genera un ancho de pulso determinado por su segundo parámetro de entrada en el pin determinado. Por ejemplo:

Pulsout portb.0, 150

Generará un pulso de ancho 1.5 ms en el pin 0 de puerto B.

Ahora bien, la frecuencia de envío de este pulso será generada por un ciclo for-next y la función pause.

El ejemplo siguiente posicionará el motor en 90º:

n var byte
trisb=0
portb=0
for n=1 to 25 step 1
pulsout portb.0,150
pause 10
next

Es importante inicializar a 0 el pin por el cual se sacará el pulso, debido a que la función pulsout invierte el estado del pin.

Vamos a ver este programa de inicio en Proteus:

servo1

Para el caso del motor HS-311 es necesario cambiar la configuración del motor para la simulación como muestra la siguiente figura:

limites

Vamos a programar una secuencia que mantenga al motor en continuo movimiento de un extremo al otro. Aquí entra el ciclo for-next.

m var byte
n var byte
trisb=0
portb=0
for m=50 to 250 step 1
pulsout portb.0,m
pause 10
next
for m=250 to 50 step -1
pulsout portb.0,m
pause 10
next

Vamos a ir un poco más adelante, y controlaremos la posición del motor con dos pulsadores: uno para girar el motor a una posición y el otro para llevarlo a la posición contraria.

;Only Hardware
cmcon=7
control var portb.1
incrementar var porta.0 'Pin de pulsador para incremento
disminuir var porta.1 'Pin de pulsador para decremento
x var byte 'x de tamaño 256
r var byte 'y de tamaño 256
trisb=0
portb=0
x=150 ; 'Posición inicial del servo motor
inicio:
pulsout control,x 'Envía x por el pin portb.1 (control)
gosub timer 'Subrutina de chequeo del pulsador
goto inicio
timer:
if incrementar=0 then gosub mas 'Si el p esta a tierra, ir a subr "mas"
if disminuir=0 then gosub menos 'Si el p esta a tierra, ir a subr "menos"
return
mas: 'Subrutina de aumento de posición
pause 10
x=x+1 ; 'Aumento del pulso de salida
if x>200 then x=200 'Determina un valor máximo de 200
return
menos: 'Subrutina de disminución de posición
pause 10
x=x-1 'Disminución del pulso de salida
if x<100 x="100">

El esquema de este programa se muestra en la siguiente figura:

servo2

El mismo programa modificado para el PIC12F629:

cmcon=7
control var gpio.0 'Pin para el servo motor
incrementar var gpio.1 'Pin de pulsador para incremento
disminuir var gpio.2 'Pin de pulsador para decremento
x var byte 'x de tamaño 256
r var byte 'y de tamaño 256
trisio=000110
gpio=0
x=150 ; 'Posición inicial del servo motor
inicio:
pulsout control,x 'Envía x por el pin portb.1 (control)
gosub timer 'Subrutina de chequeo del pulsador
goto inicio
timer:
if incrementar=0 then gosub mas 'Si el p esta a tierra, ir a subr "mas"
if disminuir=0 then gosub menos 'Si el p esta a tierra, ir a subr "menos"
return
mas: 'Subrutina de aumento de posición
pause 10
x=x+1 ; 'Aumento del pulso de salida
if x>200 then x=200 'Determina un valor máximo de 200
return
menos: 'Subrutina de disminución de posición
pause 10
x=x-1 'Disminución del pulso de salida
if x<100 x="100">

Diagrama en Proteus:

servo

http://www.4shared.com/file/81611316/85d31591/PIC_12F629_Servo_Motor_Control.html

No response to “CONTROL DE LA POSICIÓN DE UN MOTOR SERVO HS-311”