hola y gracias
Exactamente , solo para que el micro tenga forma de saber si por algún motivo el motor se atascó.
Ah... entiendo hay que pensar en una buena estructura de código para no tener cosas repetidas y que sea entendible.
Deberías tener una estructura conteniendo la info necesaria de cada motor, y las funciones para hacer funcionar el motor deberían usar esa información para manejar las entradas/salidas de la forma que corresponda.
Y cual es el problema con la velocidad?, así como esta trabaja muy lento?.
La velocidad la cambias con el delay de activación/desactivación de las salidas.
En tus rutinas estas utilizando _delay_us(2750); por ejemplo en la rutina xplus4.
Son 4 pasos con 8 delays -> 2750 us/delay * 8 delay / 4 pasos = 5500 us / paso = 5.5 ms/paso
Si tenes un motor de 400 pasos por revolución: 400 pasos / rev * 5.5 ms / paso * 1 s / 1000 ms = 2.2s /rev
1 rev/2.2s = 0.45 rev/s * 60 s/min = 27 rpm aprox
En fin, de esa forma aproximas la velocidad del motor de acuerdo al tiempo entre pasos, y claro, depende de los datos del motor (pasos por revolución).
Es decir, si con 2750 us tienes 27 rpm, con 2750/2 = 1375 us tendras 54 rpm aprox.
En cuanto a trabajar con timer, sí, podrías correr el código de secuencia de pasos (quizás usando una función similar a la que propuse ) en la rutina de interrupción del temporizador, y que el valor de comparación del comparador salga de la velocidad de rotación deseada del motor. Y con eso tu programa en el main solo tiene que setear cuando iniciar el movimiento (habilitando la interrupción y estableciendo la cuenta de pasos) y después el programa principal no se entera.
Pero quizás para hacer esto es difícil de hacer en este punto y para no complicarte seguí con los retardos, que no son para nada lo ideal pero bueno, no se muere nadie.
Ajá... a ver... entonces a través de los potenciómetros UART se fija la posición del móvil en la cuadrilla XY.
Después si querés que aumente la velocidad cuando más lejos esté la posición actual de la deseada, podrías hacer algo como:
Bueno, ya te dí bastante en que pensar, conclusión: velocidad depende del tiempo de retardo; ahora en este momento esta bien que pienses la estructura general del programa y decidas que parámetros de entrada y salida vas a manejar (tanto en el UART como en las funciones para mover los motores, etc).
gracias amigo muy pero muy educativo ., y sobre todo una enseñanza espectacular
esto es algo que estamos armando con otro integrante del foro ., mi amigaso "" raulalberto1955 "" ., fui al taller a buscar los motores para probar
tambien te muestro llos motores que tengo (son algunos ., no entran todos en la foto
y seguidamente te muestro los tres motores del proyecto., el que tiene la cinta ., es el de los amgulos ., los otros son para el movimiento de mesa ., todos son 1,8° ., 200 pasos y 12v
esas bridas ., son para el movimiento de las guias ., que seria como el movimiento de un motor de limpiaparabrisas de un auto
pero no giran (van y vienen) o sea que giran nada mas que unos 45° o 50° nada mas ., y tambien ., te muestro los driver que arme para estos
tambien estube viendo con raul ., lo del desplazamiento delas guias ., que son guias de cajoneras de cocinas
esas guias viene con unos gujes de plastico ., eso nos da un "juego o olgura" como que al cruzarce nos frena la guia
la idea que dio raul es que remplacemos esos plasticos ., por rodamientos ., el asunro que al averiguar su precio ., es alto y mas si son 16 los voy a comprar ., pero por ahora no ., en todo caso quedamos con raul ., probarlas como estan., si hace falta mas torque cambiare los motores por otros mas grandes
en cuanto al movimiento es si ., me estuve fijando en todo lo ultimo comentado ., viendo las librerias que poseo funcionado corectamente ., me parecio que esas funciones se puede agaptar cambiando algunas lineas
hay una parte del codigo que no la publique ., que es la de na divicion de angulos en 360°
te pongo un dibujo de como funciona eso
Ver el archivo adjunto 144897 esto como mas o menos te explique antes ., hace un giro de 360° (casi 350° ) para luego volver a 0 ., y digo casi por lo siguiente
es la definicion de la libreria figua asi
PHP:
// Cuántos pasos para Giro de 360 grados
#define MOT_STEPS 192 // original 200
se supone que alli ., va la cantidad de pasos que nesesita para dar una vuelta
se supone que alli tendria que figurar 200 pasos ., porque el motor es de 1,8° y 200 pasos por vuelta
si te fijas dice o se declara el valor de 192., esto es porqu al principio ell dico soporte se podia des plazar con libertad hasta los 360°
pero luego al hacer adaptaciones al uncillo ., nos topaba en el soporte ., y cuando giraba muy rapido al llegar lo golpeba
entonses baje la cuenta de pasos a 192 y no como tendria que ser de 200 pasos
esta cuenta de pasos se almacena en esta sentecia MOT_STEP
PHP:
for(i=0; i<=MOT_STEPS; i++)//Ahora busca la posición cero de nuevo!
{
MakeStep(0);
MakeStep(0);
_delay_ms(4);
if(!(PR_SENSOR & (1<<PIN_SENSOR))) break;
}
for(i=0; i<=CORR_VAL; i++)//posición correcta con valor fijo si es necesario
{
MakeStep(CORR_DIR);
}
}
si le prestas atencion te daras cuenta que girao puede girar hacia la izquierda o la derecha ., y lleva la cuenta de los pasos (los decuenta o cuenta segun el caso
y a mi se me ocurrio ., que podriamos reformr esta misma libreria y en concreto esta parte
PHP:
//Seleccione la posición del angulo
extern void SetAngle( uint8_t Angle )
{
Soll1 = Angle*ANGLE_HALFSTEPS;
}
/*
// Esto hace girar sólo en una dirección
void Check( void )
{
if(Ist!=Soll)
{
MakeStep(0);
Ist++;
if(Ist>=MOT_STEPS) Ist=0;
}
}
*/
// Comprueba si la rueda/Angulo tiene que ser girada
extern void CheckAngle( void )
{
if(Ist1<Soll1)
{
if((Soll1-Ist1)<=(MOT_STEPS/2)) //Asumimos la dirección correcta, porque
{ // que es menos o igual a un medio de rotación
MakeStep(0); //Girar a la derecha un paso =)
Ist1++;
if(Ist1>=MOT_STEPS) Ist1=0;
} else { // Rotación derecha llevaría demasiado tiempo ., si no
MakeStep(1); //girar la dirección de la rueda a la izquierda
if(Ist1==0) Ist1=MOT_STEPS;
Ist1--;
}
}
if(Ist1>Soll1)
{
if((Ist1-Soll1)<=(MOT_STEPS/2))
{
MakeStep(1);
if(Ist1==0) Ist1=MOT_STEPS;
Ist1--;
} else {
MakeStep(0);
Ist1++;
if(Ist1>=MOT_STEPS) Ist1=0;
}
}
}
//Paso el motor en dirección definida
void MakeStep( uint8_t direction )
{
if(direction==0)
{
Step1++;
if(Step1>=8) Step1=0;
} else {
if(Step1==0) Step1=8;
Step1--;
}
SetPort(Step1);
_delay_ms(4);
}
y por ejemplo podriamos definir la cantidad de pasos ala derecha (right) y a la izquierda (left) y quedaria declarado algo asi
PHP:
// Cuántos pasos para giro de right
#define MOT_STEPS_right 25 // original 200
// Cuántos pasos para giro de left
#define MOT_STEPS_left 25 // original 200
de esa manera con mas o menos 25 pasos por direccion nos da los 90° (mas o menos eso no es problema) aca te pongo un dibujo de como sria en este caso
en cuanto ala velocidad ., conviene que este separada del recorrido o distancia ., perque como em hizo ver raul habar piezas que si nesesitan velocidad y otras el mecanizado es muy lento ., pero puede ser como el ejemplo que pusiste vos mas atras que estaria perfecto
la cuestion es que habria que hacer una sola libreria ., porque las dos son iguales ., luego solo habria que cambiar la definicion de X por Y y listo
te adjunto la libreria de eje Z ., tal cual la estamos usando( sin complicarte con la usart
yo creo., que ahora si esta mas claro el asunto ., y muchas gracias de nuevo amigoAdjuntos
Última edición: