Problema con típico servomotor SG90 Tower Pro.

Buenas noches :) , estoy haciendo un proyecto con un pic16f84A para controlar un servo towerpro sg90 , pero lo logro hacer el que el servo se mueva y no_sé donde esta el problema, ya que lo simulo con proteus y funciona perfectamente.... si alguien puede hecharme una mano me sería de gran ayuda...:cry: El programa en BASIC es el siguiente:

Código:
define osc 4 
m var byte
servo var portb.0
portb.0=0
control
if porta.1 =1 then arranque
pulsout servo,150
pause 10
goto control
arranque:
for m=150 to 250 step 1
pulsout servo,m
pause 10
next m
pause 500
for m=250 to 150 step -1
pulsout servo,m
pause 10
next m
pause 500
for m=150 to 70 step -1
pulsout servo,m
pause 10
next m
pause 500
for m=70 to 150 step 1
pulsout servo,m
pause 10
next m
pause 300
goto control
 
Última edición por un moderador:
Aca te dejo un pequeño ejemplo en pbp para un pic16f628A, mueve un servo en sus dos sentidos por el puerto b0. saludosss

Código:
 'configuracion de fuses
@ DEVICE MCLR_OFF, INTRC_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
define osc 4 
CMCON = 7                     ' desactivo el convertidor AD del puerto A
TrisA=%11111111               'todo el port A como entrada
TrisB=%00000000               'todo el port B como salida
PORTA = %11111100             'todo el port A en 1
PORTB = %00000000             'todo el port B en 0

b0 var byte

inicio:
for b0 = 50 to 250 step 1
pulsout portb.0, b0
pause 20
next
for b0 = 250 to 50 step -1
pulsout portb.0, b0
pause 20
next
goto inicio
 
Última edición:
Aca te dejo un pequeño ejemplo en pbp para un pic16f628A, mueve un servo en sus dos sentidos por el puerto b0. saludosss

Código:
 'configuracion de fuses
@ DEVICE MCLR_OFF, INTRC_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
define osc 4 
CMCON = 7                     ' desactivo el convertidor AD del puerto A
TrisA=%11111111               'todo el port A como entrada
TrisB=%00000000               'todo el port B como salida
PORTA = %11111100             'todo el port A en 1
PORTB = %00000000             'todo el port B en 0

b0 var byte

inicio:
for b0 = 50 to 250 step 1
pulsout portb.0, b0
pause 20
next
for b0 = 250 to 50 step -1
pulsout portb.0, b0
pause 20
next
goto inicio


Acabo de probar tu codigo amigo, en proteus funciona perfectamente, pero en la Protoboard no mueve el servo.... he utilizado hasta el mismo pic, el f628A..... :unsure: he probado con dos servos towerpro sg90 nuevos, y ninguno se mueve.. puede que utilizen anchos de impulsos diferentes?? esque no hace absolutamente nada... le he puesto para que encienda un led al final del programa para ver si se ejecuta, y se enciende.. lo que no entiendo es porque no se mueve el servo....
 
Última edición:
Si, lo he mirado,fue lo primero que hice y repasado mil veces, el montaje es correcto.... el servo lo único que hace es calentarse, pero no se mueve....

amigo mio: el programa que te he mostrado funciona correctamente, tanto en el mundo virtual, como en el mundo real, al menos tal cual esta. veo que tu programa es un poco mas complejo, asi que si estas intentando fusionarlo ahi, es probable que sea por eso que no te funciona. talvez estes cometiendo algun error de programacion. este pequeño programa, es parte de un proyecto de hexapodo en el que estoy trabajando, esta probado y funciona correctamente. mas tarde te subo un video si queres, para demostrartelo. saludosss ;)
 
amigo mio: el programa que te he mostrado funciona correctamente, tanto en el mundo virtual, como en el mundo real, al menos tal cual esta. veo que tu programa es un poco mas complejo, asi que si estas intentando fusionarlo ahi, es probable que sea por eso que no te funciona. talvez estes cometiendo algun error de programacion. este pequeño programa, es parte de un proyecto de hexapodo en el que estoy trabajando, esta probado y funciona correctamente. mas tarde te subo un video si queres, para demostrartelo. saludosss ;)

Ya he resuelto el problema, no estaba en protoboard, ni en el programa, curiosamente los 2 servos nuevos tower pro sg90 venían averiados..... he probado con un futaba 3003 y funciona perfectamente... demasiado quebradero de cabeza estaba dando algo tan simple... :rolleyes:
 
estaba a punto de sugerirte eso... casualmente yo compre 3 servos towerpro y de los 3, uno me vino averiado... en fin, eso demuestra que a veces, lo barato sale caro jeje :) saludos y exitos con tu proyecto ;) (y)
 
A mi me pasaba igual y lo probé con un Arduino para ver si era algún desperfecto del servomotor y la verdad funciono bien, para mi que es algún problema del PBP con respecto al pwm que genera para ese tipo de servos.
 
Buenas a todos.

Como el título lo viene enunciando, tengo problemas con el control del servomotor SG90 de marca Tower Pro.
Estoy usando el microcontrolador PIC16F777, utilizo el módulo CCP1 y el reloj interno a 125KHz para alcanzar la frecuencia de 50 Hz que requiere el servomotor.

Estoy probando algo básico, mover el servo de 0º (1ms) a 180º (2ms) variando el ciclo activo de 31 (0º) a 62(180º)

Y la programación quedó así:
PHP:
#include <16F777.h>
#device ADC=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV45                   //Brownout reset at 4.5V
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES NOBORSEN                 //See Datasheet

#use delay(internal=31000)

void main() 
{
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);      //8,4 s overflow
   setup_timer_2(T2_DIV_BY_1,154,1);      //20,0 ms overflow, 20,0 ms interrupt

   setup_ccp1(CCP_PWM);
   

   while(TRUE)
   {
   set_pwm1_duty((int16)62);
   delay_ms(3000); 
   set_pwm1_duty((int16)31);
   delay_ms(3000); 
   }

}


El problema es que el servo no se mueve, o sólo se mueve hacia un lado lentamente hasta llegar al tope.
Y en proteus lo simulé con otro PIC, asegurándome de cambiar la programación y si genera pulso.

Gracias.
 
Última edición:
auto respuesta !!

logre que funcionara pero hice 2 modificaciones:

1º elimine el fuses #FUSES NOBORSEN ( me lo tiraba el pic c compiler cuando creaba el proyecto)
2º modifique los valores que se le cargaban al ccpx. Para controlar el servo entre 0º y 180º los valores son los siguientes: 0º=20;180º=80.

SALUDOS!!!!!!!!!!!!!!
 
Atrás
Arriba