Duda servo motor de rotacion continua

Buenas!!!!

uffff por fin he tenido un rato para retomar esto!!! jejejeje

Bueno, os comento, estoy trabajando en la contruccion de un robot, por ahora muy simple con el micro 16f84a y dos servomotores (futaba S3003 creo) para la traccion del mismo.

A los sevomotores les he eliminado los dos topes fisicos que tienen uno en la rueda dentada y el otro que hay justo en la parte inferior de la misma, este ultimo dejandolo mas o menos en la mitad del recorrido. Los he programado y giran de forma continua correctamente, pero unicamente en un sentido :(

Por lo que tengo entendido, en teoria si le envio una señal de 1500 us este tendria que estar parado o casi parado. Si aumento ese valor entre 1500 y 2000 us tendria que girar en un sentido y si los valores oscilan entre 1000 y 1500 tendrian que girar en sentido contrario, confirmarme si es asi por favor, ya que los mios con un tiempo de 1500 giran en un sentido y cambie o no ese valor a mas o menos no hay variacion en la velocidad ni en el sentido, no se si el problema puede residir en el programa o es por un error fisico del servomotor derivado de la manipulacion del mismo.

El programa los estoy programando con el mlab y el compilador hi-tech. Os dejo el codigo del mini programa que he realizado por si alguien me puede echar una mano o por si alguien esta pensando en hacer lo mismo y le sirve de ayuda.
Código:
#include <htc.h>

#define _XTAL_FREQ 4000000 
#define TIMER_TIC 100 //(us)
#define PERIODO 10000 // (us)
#define DUTY_MIN 1000 // (us)
#define DUTY_MAX 2000 // (us) 

#define SET_MOTOR1_DUTY(X) u_duty[0]=((X)/TIMER_TIC) // X en us
#define SET_MOTOR2_DUTY(X) u_duty[1]=((X)/TIMER_TIC) 

#define MOTOR_1 RA0
#define MOTOR_2 RA1 

#define RECARGA_TMR0() (char)(256-50)
#define RECARGA_PERIODO PERIODO/TIMER_TIC 

__CONFIG(XT & WDTDIS & PWRTEN & UNPROTECT); 
unsigned u_timers[2],u_duty[2]; 

interrupt void isr_general(void)
{
	if(T0IF)
	{
		RECARGA_TMR0(); 
		
		if(u_timers[0]<RECARGA_PERIODO)
			u_timers[0]++;
		else 
			u_timers[0]=0; 

		if(u_timers[0]<u_duty[0]) 
			MOTOR_1=1;
		else 
			MOTOR_1=0;   

		if(u_timers[1]<RECARGA_PERIODO) 
			u_timers[1]++;
		else 
			u_timers[1]=0; 

		if(u_timers[1]<u_duty[1]) 
			MOTOR_2=1;
		else 
			MOTOR_2=0; 
			
		T0IF = 0;
	}
}

 void main(void)
 {
	 OPTION = 0x00; //0000.0000 Ver OPTION register en el PDF. Prescaler: tmr0 @ 1/2 
	 RECARGA_TMR0();
	 T0IE = 1; // habilito ints de timer0 
	 GIE = 1; // habilito procesamiento de las ints. 
	 
	 SET_MOTOR1_DUTY(1500); 
	 SET_MOTOR2_DUTY(1500);  
	 
	 while(1)
	 {  
	 }
 }

Tambien queria comentaros en que consiste el proyecto en el que estoy trabajando. Se trata de un robot aspiradora muy casero, ya que me estoy iniciando en el mundo de la programacion y la robotica y creo que es un buen proyecto para comenzar poco a poco ya que creo que me permite ir incorporando evoluciones y distintos sensores para aprender de forma progresiva su uso.

Si alguien esta interesado o quiere compartir alguna idea o quiera codigo o fotos o lo que sea estare encantado de compartir el desarrollo o ideas. Como veis ahora me estoy peleando con el control de los motores y espero dentro de no mucho poder incorporar el bummper para comenzar con la deteccion de obstaculos.

Un sAludo y muchas gracias a todos!!!!
 
Última edición por un moderador:
Atrás
Arriba