PIC16F628A y control de servo

soy nuevo en esto de la electronica y tengo un problema que para mi es importante y complicado de resolver.

Tengo un problema a la hora de programar este pic (16f628a), ya que no se como usar el oscilador interno a 4mhz, hasta ahora lo he venido haciendo con el propio programador (WinPic), pero para mi nuevo programa nada funciona, eso si en proteus funciona perfectamente.

Codigo en PicBasicPro

Código:
n var byte
portb=0

inicio:
for n=50 to 250 step 1
pulsout portb.0,100
pause 100
next

for n=50 to 250 step 1
pulsout portb.0,150
pause 100
next
goto inicio

end

Este codigo en proteus funciona perfectamente, pero luego en la placa de prototipado no funciona.

El esquema que monto es el siguiente (va en paint porque ahora no tengo eagle)

http://img88.imageshack.us/img88/4061/1servo.png


espero que puedan ayudarme, gracias
 
Última edición:
Hola a todos, primero felicitarlos por el foro, la verdad muy completo, y si bien no suelo escribir, lo leo a menudo.
Como la mayoria de los que escribimos , acudo a uds para solucionar un problema que me esta eliminando los pocos pelos que me quedan, es el siguiente

quiero hacer algo tan sencillo como automatizar un servomotor (corona cs-928bb) con un pic (16f628a) ultilizando su oscilador interno de 4mhz, y a travez de PWM que, segun tengo entendido, es el modo de hacerlo, cabe aclarar que lo intento hacer en PIC BASIC.

a continuacion el modesto programa:

led3 var portb.3
pul var portb.0
n var byte



inicio:
for n= 30 to 240 step 10
pwm pul,n,n
next

for n= 240 to 30 step -10
pwm pul,n,n
next

high led3
pause 1000
low led3

goto inicio
end



la configuracion del oscilador interno la hago con el pickit2, donde, en los bits de configuracion pongo "3D1C ", (asi al menos creo habilitar los 4mhz, desabilitar el WD y hacer el MSCL interno)

pero....me sucede lo siguiente...cuando pruebo el programa con leds, todo barbaro, su intencidad varia de acuerdo a lo pensado, pero cuando conecto el motor ZAZ!, se va del todo hacia un lado, y queda haciendo fuerza...ni ganas de volver, o parar por ahi, no importa las variaciones que le haga, siempre gira su totalidad en sentido horario y ahi queda empujando, no se que hacer, la verdad, me tiene mal.

espero haber sido explicito en los detalles, desde ya muchas gracias por vuestra colaboracion
 
¿Y el esquema? No solo de código vivimos.
De hecho tiene todos los puntos de ser un problema de hardware.
 
Última edición:
bueno, como te digo, alimento el pic con un 7805, del mismo modo que al servo... luego conecto el cable naranja (el de señal según creo) al puerto b0 del pic y un led (con una resistencia de 330 ohms a tierra) en el puerto b3. con el led todo bien, incluso, si pongo leds en vez de el motor, la intensidad varía, pero todo se complica al poner el servo (sus cables son: rojo, marron y naranja)

en cuanto al esquema, supongo que es a esto a lo que te referias, lo hice en proteus (en ese simulador tampoco funciona) a modo de ver las conecciones hechas....
gracias
 

Adjuntos

  • diagrama.jpg
    diagrama.jpg
    85.7 KB · Visitas: 78
la verdad no estoy familiarizado con Basic pero creo que el archivo agjunto te puede ayudar en tu proyecto. Es un ejemplo muy sencillo en JAL del control de un servo usando el PIC12F683. En especial te recomiendo que compares las señales PWM del osciloscopio con las de tu proyecto. Tambien ten en cuenta que cada servo es diferente, en este ejermplo uso: pulsos de 1ms minimo para -90 hasta 2.5ms maximo para 90. Los pulsos estan separados 20ms entre ellos. Tambien no te olvides en la implementacion fisica considerar la corriente que el servo requiere para operar y lo que el micro puede abastecer.

saludos
 

Adjuntos

  • servo.zip
    14.9 KB · Visitas: 104
Bueno, lo primero que debes hacer es separar la alimentacion del pic y el servo , alimentas el pic con 5v de un 7805 y otro 7805 exclusivo para el servo , dos alimentaciones distintas con el GND comun
podrias usar dos baterias de 9v comun y corrientes.
luego el osc 4mhz esta bien
debes tener claro el servo que usaras y su respectivo datasheet para leer los datos tecnicos referentes
necesitas el standar para el oscilador y su reset
pic2.jpg
luego ya que tienes esto montado y con un pin seleccionado para el servo digamos
portb.5 sale

te dejo un codigo ejemplo
Código:
@ DEVICE PIC16F84A
@ DEVICE PROTECT_OFF,WDT_OFF,PWRT_On,xt_osc
define osc 4     ; especifica que se va a utilizar uno de 4 Mhz
i var byte
servo     var portb.5;control de servo
PORTB.5=0

inicio

for i=150 to 250 step 1
pulsout servo,i
pause 10
next i
go inicio

end

donde pause 10(valor muy importante) es el tiempo en ms necesario para un servo convencional
este es para un futaba s3004
servo toma el valor de i
por lo tanto cada 10 ms avanza , si quieres aumentar su velocidad solo cambias el paso (step) a 2 o otro valor mas alto en ves de ir de 1 en 1 va de 2 en 2 y asi
150 es el punto centro
si quieres centrar el servo y mantenerlo ahi te dejo un ejemplo
Código:
@ DEVICE PIC16F84A
@ DEVICE PROTECT_OFF,WDT_OFF,PWRT_On,xt_osc
define osc 4     ; especifica que se va a utilizar uno de 4 Mhz
i var byte
servo     var portb.5;control de servo
PORTB.5=0

inicio

pulsout servo,150
pause 10
goto inicio

end
donde 150 es el valor de la mitad, si quieres cambiar la posicion cambia el 150 por un valor entre (1-250)

otro ejemplo para retroceder

Código:
@ DEVICE PIC16F84A
@ DEVICE PROTECT_OFF,WDT_OFF,PWRT_On,xt_osc
define osc 4     ; especifica que se va a utilizar uno de 4 Mhz
i var byte
servo     var portb.5;control de servo
PORTB.5=0

inicio

for i=250 to 150 step 1
pulsout servo,i
pause 10
next i
go inicio

Saludos
espero que te sirva
PDD perdon por la escritura jeje cualquier cosa me avisas
 
Última edición:
gracias por las respuestas, la datasheet del servo me fue imposible de encontrar (ni siquiera en su pagina http://www.servodatabase.com/servo/corona/cs-929mg) lo mas parecido es este modelo, el mio es cs-928bb

yo estaba empecinado en hacerlo con la orden PWM, pero bueno, probare con la orden PULSOUT, y les cuento, otra cosa, no tengo pensado usar reset en MASTERCLEAR, ya que mi idea es que funcione indefinidamente, por eso lo configure de modo interno con los BITS DE CONFIGURACION, al igual que el OSCILADOR (interno de 4Mhz) con el bit 4 en 1 y los bits 1 y 0 en 0
 
te recomiendo esa configuracion ;) si no quieres fallos ademas tienes el control del programa y el corre indefinidamente dependiendo de tu programacion solo mantienes un bucle infinito
 
Atrás
Arriba