Microcontroladores PIC > Lenguaje Basic para microcontroladores PIC
Control servos con pic simulador
fco1306:
Tengo este programa que mueve servos y recuerda su posición cuando se enciende la alimentación.
Un botón sirve para posicionarlo en el centro y otro para moverlo a derecha e izquierda.Además controla un par de leds y un relé.
La cuestión es que cuando enciendo y apago la alimentación el servo se mueve, aunque no se hayan pulsado los botones.
Cuando pulso el boton para moverlo al centro, tengo que pulsarlo varias veces para que se posicione en el centro,cuando en teoría con una pulsación debería ir.
Cuando lo simulo con proteus no tengo problemas.No sé donde puede estar el problema.¿Cómo debo configurar los bits en el iceprog para programar el pic?
Muchas gracias
dogflu66:
Declaraste los fuses en el código de tu programa, así que, tu programador no debe, no puede modificarlos. Debería de configurarse de forma automática con la misma configuración de los fuses de tu código.
No sé porque el servo hace cosas raras en el arranque, lo que puedes hacer es configurar la salida del servo a controlar lo antes posible al estado bajo, o arranca la rutina de control del servo lo antes posible.
Con respecto a por que los servos no van a su posición, pues lo más probable sea porque no le das tiempo a que llegue. El servo tarda un tiempo en realizar el desplazamiento mínimo, la suma de estos tiempos mínimos ayudado por la velocidad, será el tiempo que tarde en llegar el servo a su lugar. Por lo tanto deberías mantener la señal de control hasta que llegue al destino.
While hasta llegar a posicion
ServoOut servo, 160
Wend
Repetir ServoOut servo, 160 hasta llegar a la posicion.
Puedes ver los ejemplos del indice de este hilo:
http://www.todopic.com.ar/foros/index.php?topic=14917.0
Y como puedes ver en este ejemplo no se puede dejar de refrescar la posicion del servo
http://www.todopic.com.ar/foros/index.php?topic=14917.msg113728#msg113728
fco1306:
He modificado un poco el código ,le he puesto una pausa de 200ms después de mover el servo y ha mejorado.
Lo que no consigo es hacerme con el control del servo al inicio.Cuando conecto la alimentación se mueve hacia cualquier sitio.
Le tengo puesto que vaya a la posición 160 pero no hace caso.
Sólo cuando pulso el botón el servo va a su sitio.Después conserva la posición y se mueve a dch o izq según voy pulsando el botón.
No sé que puede pasar
AllDigital 'todos los pines digitales
Symbol rele = GPIO.0 'define los pines entradas/salidas
Symbol rojo = GPIO.1
Symbol verde = GPIO.2
Symbol progr = GPIO.3
Symbol boton = GPIO.4
Symbol servo = GPIO.5
TRISIO = %011000
'define variables
Dim velocidad As Byte
Dim n As Byte
Dim posicion As Byte
Dim angulo As Byte
Dim angulo1 As Byte
'posiciona el servo en su sitio cuando se conecta la alimentación
'conecta los leds según la posición y el relè
rojo = 0
verde = 0
rele = 0
servo = 0
For n = 1 To 200 Step 1
ServoOut servo, 160
Next n
WaitMs 500
Read 01, posicion
If posicion = 0xff Then
Write 01, 01
For n = 1 To 200 Step 1
ServoOut servo, 160
Next n
WaitMs 200
rojo = 1
verde = 1
rele = 0
Endif
If posicion = 01 Then
Write 01, 01
For n = 1 To 200 Step 1
ServoOut servo, 160
WaitMs 200
Next n
rojo = 1
verde = 1
rele = 0
Endif
If posicion = 02 Then
For n = 1 To 200 Step 1
ServoOut servo, 190
Next n
WaitMs 200
rojo = 1
verde = 0
rele = 0
Endif
If posicion = 03 Then
For n = 1 To 200 Step 1
ServoOut servo, 130
Next n
WaitMs 200
rojo = 0
verde = 1
rele = 1
Endif
'inicio programa
inicio:
Read 01, posicion
If progr = 1 Then
WaitMs 200
Gosub pulso
Endif
If boton = 1 Then
WaitMs 200
Gosub mover_servo
Endif
Goto inicio
End
pulso:
For n = 1 To 200 Step 1
ServoOut servo, 160
Next n
WaitMs 200
rojo = 1
verde = 1
Write 01, 01
Return
'mueve el servo
mover_servo:
Read 01, posicion
If posicion = 01 Then
'el servo està en centro y tiene que pasar a dch
For n = 160 To 190 Step 1
ServoOut servo, n
WaitMs 100
Next n
WaitMs 200
rojo = 0
verde = 0
WaitMs 200
rojo = 1
verde = 0
rele = 1
Write 01, 02
Endif
If posicion = 02 Then
'el servo està en dch y tiene que pasar a izq
For n = 190 To 130 Step -1
ServoOut servo, n
WaitMs 100
Next n
WaitMs 200
rojo = 0
verde = 0
WaitMs 200
rojo = 0
verde = 1
rele = 0
Write 01, 03
Endif
If posicion = 03 Then
'el servo está en izq y tiene que pasar a dch
For n = 130 To 190 Step 1
ServoOut servo, n
WaitMs 100
Next n
WaitMs 200
rojo = 0
verde = 0
WaitMs 200
rojo = 1
verde = 0
rele = 1
Write 01, 02
Endif
Return
dogflu66:
Una vez que funciona puedes bajar el valor de "periodo" hasta el minimo que siga funcionando el servo.
--- Código: vb.net ---'Trabajando con servos, PIC12F675Define CONF_WORD = 0x3184Define CLOCK_FREQUENCY = 4AllDigital 'todos los pines digitalesSymbol rele = GPIO.0 'define los pines entradas/salidasSymbol rojo = GPIO.1Symbol verde = GPIO.2Symbol progr = GPIO.3Symbol boton = GPIO.4Symbol servo = GPIO.5TRISIO = %011000'define variablesDim velocidad As ByteDim n As ByteDim posicion As ByteDim angulo As ByteDim angulo1 As ByteDim outon As Byte 'Tiempo de la señal de control del servo a On (duty cycle)Dim outoff As Word 'Tiempo de la señal de control del servo a OffDim periodo As Word 'Periodo de la frecuencia de trabajo de la señal de control del servo 'posiciona el servo en su sitio cuando se conecta la alimentación'conecta los leds según la posición y el relèrojo = 0verde = 0rele = 0servo = 0periodo = 2000 '20mSeg., para servos de 50Hz, señal a On mas señal a Off = 20mSeg. outon = 160 '1.6mSeg.outoff = (periodo - outon) * 10 'Calculo tiempo de la señal a Off en uSeg.For n = 0 To 74 'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse ServoOut servo, outon '1.6mSeg. (señal a On) WaitUs outoff 'Tiempo de la señal a OffNext nWaitMs 500 Read 01, posicionIf posicion = 0xff Then Write 01, 01 For n = 1 To 200 Step 1 ServoOut servo, 160 Next n WaitMs 200 rojo = 1 verde = 1 rele = 0Endif If posicion = 01 Then Write 01, 01 For n = 1 To 200 Step 1 ServoOut servo, 160 WaitMs 200 Next n rojo = 1 verde = 1 rele = 0Endif If posicion = 02 Then For n = 1 To 200 Step 1 ServoOut servo, 190 Next n WaitMs 200 rojo = 1 verde = 0 rele = 0Endif If posicion = 03 Then For n = 1 To 200 Step 1 ServoOut servo, 130 Next n WaitMs 200 rojo = 0 verde = 1 rele = 1Endif 'inicio programamain: Read 01, posicion If progr = 1 Then WaitMs 200 Gosub pulso Endif If boton = 1 Then WaitMs 200 Gosub mover_servo Endif Goto mainEnd pulso: For n = 1 To 200 Step 1 ServoOut servo, 160 Next n WaitMs 200 rojo = 1 verde = 1 Write 01, 01Return 'mueve el servomover_servo: Read 01, posicion If posicion = 01 Then 'el servo està en centro y tiene que pasar a dch For n = 160 To 190 Step 1 ServoOut servo, n WaitMs 100 Next n WaitMs 200 rojo = 0 verde = 0 WaitMs 200 rojo = 1 verde = 0 rele = 1 Write 01, 02 Endif If posicion = 02 Then 'el servo està en dch y tiene que pasar a izq For n = 190 To 130 Step -1 ServoOut servo, n WaitMs 100 Next n WaitMs 200 rojo = 0 verde = 0 WaitMs 200 rojo = 0 verde = 1 rele = 0 Write 01, 03 Endif If posicion = 03 Then 'el servo está en izq y tiene que pasar a dch For n = 130 To 190 Step 1 ServoOut servo, n WaitMs 100 Next n WaitMs 200 rojo = 0 verde = 0 WaitMs 200 rojo = 1 verde = 0 rele = 1 Write 01, 02 EndifReturn
fco1306:
:) :)Muchas,muchas gracias, funciona perfectamente.El servo se va al centro y se mantiene hasta que se pulsa el botón.Además el movimiento es muy suave.
He modificado un poco el código para que se posicione en la dch o izq según quedó anteriormente.
Una última cosa.Para que se mueva por ejemplo de 160 a 190 y a poca velocidad ¿se puede mejorar el código que tengo?
For n = 160 To 190 Step 1
ServoOut servo, n
WaitMs 100
Next n
--- Código: ---'
Trabajando con servos, PIC12F629
Define CONF_WORD = 0x3184
Define CLOCK_FREQUENCY = 4
AllDigital 'todos los pines digitales
Symbol rele = GPIO.0 'define los pines entradas/salidas
Symbol rojo = GPIO.1
Symbol verde = GPIO.2
Symbol progr = GPIO.3
Symbol boton = GPIO.4
Symbol servo = GPIO.5
TRISIO = %011000
'define variables
Dim velocidad As Byte
Dim n As Byte
Dim posicion As Byte
Dim angulo As Byte
Dim angulo1 As Byte
Dim outon As Byte 'Tiempo de la señal de control del servo a On (duty cycle)
Dim outoff As Word 'Tiempo de la señal de control del servo a Off
Dim periodo As Word 'Periodo de la frecuencia de trabajo de la señal de control del servo
'posiciona el servo en su sitio cuando se conecta la alimentación
'conecta los leds según la posición y el relè
rojo = 0
verde = 0
rele = 0
servo = 0
periodo = 2000 '20mSeg., para servos de 50Hz, señal a On mas señal a Off = 20mSeg.
'outon = 160 '1.6mSeg.
'outoff = (periodo - outon) * 10 'Calculo tiempo de la señal a Off en uSeg.
'For n = 0 To 75 'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
'ServoOut servo, outon '1.6mSeg. (señal a On)
'WaitUs outoff 'Tiempo de la señal a Off
'Next n
Read 01, posicion
If posicion = 0xff Or posicion = 01 Then
Write 01, 01
outon = 160 '1.6mSeg.
outoff = (periodo - outon) * 10 'Calculo tiempo de la señal a Off en uSeg.
For n = 0 To 75 'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
ServoOut servo, outon '1.6mSeg. (señal a On)
WaitUs outoff 'Tiempo de la señal a Off
Next n
WaitMs 200
rojo = 1
verde = 1
rele = 0
Endif
If posicion = 02 Then
outon = 190 '1.9mSeg.
outoff = (periodo - outon) * 10 'Calculo tiempo de la señal a Off en uSeg.
For n = 0 To 75 'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
ServoOut servo, outon '1.9mSeg. (señal a On)
WaitUs outoff 'Tiempo de la señal a Off
Next n
WaitMs 200
rojo = 1
verde = 0
rele = 0
Endif
If posicion = 03 Then
outon = 130 '1.3mSeg.
outoff = (periodo - outon) * 10 'Calculo tiempo de la señal a Off en uSeg.
For n = 0 To 75 'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
ServoOut servo, outon '1.3mSeg. (señal a On)
WaitUs outoff 'Tiempo de la señal a Off
Next n
WaitMs 200
rojo = 0
verde = 1
rele = 1
Endif
'inicio programa
main:
Read 01, posicion
If progr = 1 Then
WaitMs 200
Gosub pulso
Endif
If boton = 1 Then
WaitMs 200
Gosub mover_servo
Endif
Goto main
End
pulso:
outon = 160 '1.6mSeg.
outoff = (periodo - outon) * 10 'Calculo tiempo de la señal a Off en uSeg.
For n = 0 To 75 'Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
ServoOut servo, outon '1.6mSeg. (señal a On)
WaitUs outoff 'Tiempo de la señal a Off
Next n
WaitMs 200
rojo = 1
verde = 1
Write 01, 01
Return
'mueve el servo
mover_servo:
Read 01, posicion
If posicion = 01 Then
'el servo està en centro y tiene que pasar a dch
For n = 160 To 190 Step 1
ServoOut servo, n
WaitMs 100
Next n
WaitMs 200
rojo = 0
verde = 0
WaitMs 200
rojo = 1
verde = 0
rele = 1
Write 01, 02
Endif
If posicion = 02 Then
'el servo està en dch y tiene que pasar a izq
For n = 190 To 130 Step -1
ServoOut servo, n
WaitMs 100
Next n
WaitMs 200
rojo = 0
verde = 0
WaitMs 200
rojo = 0
verde = 1
rele = 0
Write 01, 03
Endif
If posicion = 03 Then
'el servo está en izq y tiene que pasar a dch
For n = 130 To 190 Step 1
ServoOut servo, n
WaitMs 100
Next n
WaitMs 200
rojo = 0
verde = 0
WaitMs 200
rojo = 1
verde = 0
rele = 1
Write 01, 02
Endif
Return
--- Fin del código ---
Navegación
[#] Página Siguiente
Ir a la versión completa