fbpx

Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Buena resolucion pa...
 
Avisos
Vaciar todo

Buena resolucion para los servos

10 Respuestas
6 Usuarios
0 Reactions
4,128 Visitas
mif
Respuestas: 1095
 Mif
Topic starter
(@mif)
Noble Member
Registrado: hace 19 años

¡Muy buenas compañeros!
Como algunos sabeis estoy rehaciendo el programa de control de TupperBot, y claro, una de las cosas principales que necesito modificar es el tema de la resolucion en los servos, ya que ahora mismo tengo unos 7º de resolucion, y claro, es bastante cutre para mover la camara... ¿no creeis?

Bien, pues aqui viene mi pregunta... Necesito manejar dos servos, Pan & Tilt, que deberian tener una resolucion algo mejor de la que tengo... cuanto mayor sea mejor funcionara, claro...
¿Cómo hago los cálculos para conseguir una buena resolucion? Programo en CCS un 16F876, con un cristal a 20Mhz, y ahora mismo tengo configurado el TIMER con "setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1)" es decir, que hace un OverFlow cada 51.2us... pero claro, asi me va...
Entonces... cuál es el truco para conseguir una buena resolucion?
El código de control de los servos que hice es este:
#int_RTCC
RTCC_isr()
{
//Posicion Minima 17 en decimal = 11 Hex
//Posicion Máxima 45 en decimal = 2D
if (Tim19968us==1)
{
set_timer0(0);
Tim19968us=0;
TimTot=0;
output_bit(Servo1, 1);
output_bit(Servo2, 1);
output_bit(LedR, 1); //LedR
output_bit(LedG, 1); //LedG
output_bit(LedB, 1); //LedB
}

if (TimTot==390) //Ya lleva 19,968ms
{
set_timer0(96);
Tim19968us=1;
}

if (TimTot == PosServo1) output_bit(Servo1, 0);
if (TimTot == PosServo2) output_bit(Servo2, 0);

if (TimTot == DutyRed) output_bit(LedR, 0);
if (TimTot == DutyGreen) output_bit(LedG, 0);
if (TimTot == DutyBlue) output_bit(LedB, 0);

++TimTot;

}

Se que es muy malo mi sistema de control deservos, pero hasta ahora me ha funcionado... je je je...

Bueno, ya por ultimo, os hago otra pregunta...
Ahora mismo uso un micro para controlar todo el robot, que en total tiene:
-2 Servos
- Comunicacion RS 232
- 3 PWM (Estos ahora mismo van como si fuesen servos, pero es para controlar leds, de modo que no me hace falta mas resolucion de la que tengo ahora)
- 2 Entradas analogicas

Creeis que estoy sobre cargando mucho el micro?

Mil gracias por la atencion.
Mif

Responder
9 respuestas
eagleman
Respuestas: 25
(@eagleman)
Eminent Member
Registrado: hace 19 años

Hola Mif,

Si únicamente tienes dos servos utilizados como tal, ¿por qué no usas las dos salidas pwm del micro? Así tendrías la precisión que desees.
En el caso que no puedas porque necesites los comparadores en la web de Iearobotics Andrés ha publicado el código en C para menejar 8 servos con una precisión de 1,17 grados.
Te pongo el link:
http://www.iearobotics.com/proyectos/st ... rvos8.html
Espero qeu te sirva.

Responder
mosvack
Respuestas: 126
(@mosvack)
Estimable Member
Registrado: hace 19 años

Hola Mif

Una solución menos elegante es emplear una reductora. Dividirá el paso mínimo que tengas por el valor de reducción. Al mismo tiempo aumentarás la fuerza. El problema es que son caras...

Respecto a la sobrecarga, ¿todo se ejecuta a la vez?. Para comprobar cuestiones como ésta, lo que suelo hacer es colocar un led en algún pin libre y hacer que cambie de estado en cada ejecución del bucle principal. De esta forma puedo medir con qué velocidad de ejecuta todo. (A veces me ha pasado que he podido apreciar un parpadeo de casi 1 segundo y para la aplicación era demasiado lento... ) El problema de este método es que tienes que programar, aunque sea por encima, el programa que quieres hacer con la consiguiente pérdida de tiempo si el resultado es negativo.

Saludos

Responder
mif
Respuestas: 1095
 Mif
Topic starter
(@mif)
Noble Member
Registrado: hace 19 años

Muuuchas gracias a los dos!!!
Mosvack, la verdad es que lo de poner reductora seria una buena idea, pero por las caracteristicas del proyecto no puedo hacerlo...
En camio lo de tener un led que me indique como va... en Snaph lo tengo hecho y es muuuy util, a ver si esta tarde se lo hago a TupperBot.

EagleMan, habia pasado por alto la posibilidad del PWM, ni me acordaba que estaban... ja ja ja... creo que podria ser la solucion a mis problemas, pero nunca lo he usado, me he leido la documentacion de Microchip, y no esta nada claro... Seria posible crear un PWM de 50Hz con resolucion suficiente como para mover bien un servo?
A ver si me explico... yo creo un PWM a 50Hz (20ms) vale, ahora tengo, tal y como dice el data, un valor entre 0 y 1024 para decidir el Duty Cycle, pero si hacemos:

20ms/1024 = 0.019ms = 19us por paso, lo que quiere decir que si un servo trabaja en un rango de 0.5 - 2.5ms en alto, tenemos un tiempo de 2ms para trabajar, si cada paso son 19us:
2ms/0.019ms = 105 posiciones
180º / 105 Posiciones = 1.7º Anda coño, como el que hizo Andres...

Creo que mis cálculos estan bien, no? pero estas desaprovechando 919 posiciones de las 1024 que podrias tener... en cualquier caso 1.7º es mucho mejor que los 7º que tengo ahora...
Aun asi... vale, la teoria es muy bonita, pero como paso esto a CCS? se que tengo la configuracione ne el Pic wizard, y de ahi he sacado la imagen que he subido, pero no entiendo cual de las tres opciones tengo que elegir:
19.531 khz
4.883 khz
1.221 khz

Hay alguna manera de que esas 1024 posiciones se aprovechen mejor en la banda de 0.5-2.5ms? si no todas al menos mas de 105?

Mil gracias de nuevo...

Responder
gonzao
Respuestas: 218
(@gonzao)
Estimable Member
Registrado: hace 19 años

Hola a todos.

Pero se puede conseguir con los PWMs del chip los 50Hz??
Yo cuando lo estuve mirando no me daba para un periodo tan grande, y en el foro de microchip decían que habia que hacerselos a mano.

Lo volveré a mirar a ver que encuentro.

Un saludo
gONzAO

Responder
Página 1 / 2
Compartir: