Autor Tema: control de motor dc y servo direccion  (Leído 1674 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado aupadeportivo

  • PIC10
  • *
  • Mensajes: 18
control de motor dc y servo direccion
« en: 29 de Marzo de 2005, 06:19:00 »
Hola amigos! Ya llevaba bastante tiempo visitando este foro que me parece excepcional y bueno al fin decidi registrarme. Bueno tengo que hacer un proyecto de robotica y para empezar tengo que controlar un motor dc con velocidad variable y un servo de direccion. Había pensado en usar el pwm del pic para el motor dc, y una rutina parecida al del parpadeo del led que hay po ahi para girar el servo, ya que mi servo trabaja a 50 Hz y como que no llego a esa frecuencia de pwm. Estoy empezando con C ahora y la verdad no tengo mucha idea, asi qe cualquier consejo me vendra bien.
La idea es que el robotito vaya hacia delante, y en cuanto tenga que girar, se detenga, gire, y vuelva a encenderse el motor. No se muy bien si al servo hay que estar continuamente metiendole pulsos para que este en una posicion determinada.... Habia pensado utilizar funciones, por ejemplo el principal, y subprogramas para el momento de giro, pero estoy bastante verde y no se muy bien como empezar. les agradecería vuestra ayuda.

Gracias

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: control de motor dc y servo direccion
« Respuesta #1 en: 29 de Marzo de 2005, 14:57:00 »
Mira el post de tormar referente al paro de un servomotor, allí hay algunas aclaraciones.

Un saludo

Desconectado aupadeportivo

  • PIC10
  • *
  • Mensajes: 18
RE: control de motor dc y servo direccion
« Respuesta #2 en: 31 de Marzo de 2005, 14:55:00 »
Aqui les dejo el codigo del control del movimiento del cacharrito del servo y el motor. Tengo algunas dudas asi que me encantaría que le echarán un ojo y comentaran consejos posibles mejoras, etc....

Les comentos por encima: El portA es de entrada, donde los cuatro primeros bits indican la velocidad que nos servira para calcular el duty necesario para aplicarlo al motor. Los dos ultimos bits del mismo puerto indican la dirección del servo. Mis dudas son (lo tienen indicado en la linea de programa):

1. cada vez que haya un cambio de dirección, quiero que el motor dc se pare, empezar a meter pulsos al servo y despues de un tiempo volver a conectar el motor. Como ven eso ya lo he conseguido, el problema es que se me para siempre que sale del bucle incluso cuando hay un cambio de velocidad, cosa que no quiero.
2. En el instante que el cacharrito debe ir hacia atras, la posicion del servo es recto (la correcta), pero el pwm que le meto al motor, no se.... asi como lo tengo supongo ira hacia delante o dependiendo del duty.... No lo tengo claro.
Un apunte final, los bits de entrada del port a son los que tendra que mandar el otro pic mediante la comunicacion de los mismos.

Ahi va el codigo:



#include <16F876.H>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use Delay(Clock=4000000)
#use fast_io(A)
#use fast_io(B)
#byte port_a = 5 // Identificador asociado al registro de dirección 5
#byte port_b = 6 // Identificador asociado al registro de dirección 6
#byte port_c = 7 // Identificador asociado al registro de dirección 7


void main(void){

set_tris_a(0b111111); //PortA entrada
set_tris_b(0b00100000); //RB5 es entrada de on / off
set_tris_c(0b0000000); //PortC salida

int x, xx, y, dutycalculado, n;

setup_timer_2(T2_DIV__BY_16,249,1) // Div=16 ; PR2=249 ; Postscale=1
setup_CCP1(CCP_PWM) //Configuguro PWM


while (1)

{

while (input(PIN_B5))
{



x=port_a // Leo estado del puerto

xx=0b110000 & x // And lógica para ver estado de los bits que me marcan la direccion

y=0b001111 & x // And logica para ver estado de los bits de velocidad

dutycalculado=y/(16*(1/4000000)) // Calculamos duty


while(x==port_a) // mientras no haya cambios (direccion o velocidad)
{

port_c=0x00 //AQUI TENGO DUDAS!!!!!!!!!!!!!!!!!!!

switch(xx)
{
case 0: //recto

output_high (pin_c1)
delay_us (1200)
output_low (pin_c1)
delay_us (18800)

for (n=0;1;1)
{

delay_ms(2000)
set_pwm1_duty(dutycalculado)
}


break;

case 16: //derecha

output_high (pin_c1)
delay_us (1733.333)
output_low (pin_c1)
delay_us (18266.667)

for (n=0;1;1)
{

delay_ms(2000)
set_pwm1_duty(dutycalculado)
}

break;


case 32: //izquierda

output_high (pin_c1)
delay_us (666.666)
output_low (pin_c1)
delay_us (19333.333)

or (n=0;1;1)
{

delay_ms(2000)
set_pwm1_duty(dutycalculado)
}

break;


case 48: //atras ?????????? Como hago que vaya hacia atras

output_high (pin_c1)
delay_us (1200)
output_low (pin_c1)
delay_us (18800)

for (n=0;1;1)
{

delay_ms(2000)
set_pwm1_duty(dutycalculado)
}


break;
}
}

}
}
}
 

 
 
Gracias Pocher.