Autor Tema: mi servo no se queda quieto (NUEVO RETO)  (Leído 34460 veces)

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

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: mi servo no se queda quieto
« Respuesta #30 en: 16 de Junio de 2007, 00:21:10 »
Yaaaaaahooooo!!!
Yaaabaaadaaaabaaaa doooooo!!!!!!!
 :-/ :-/ :-/ :-/  :mrgreen: :mrgreen:   :-) :-) :-)
encontre la solucion a mis males!!!!
hasta ahora todas las cosas que hice con pics las ponia a funcionar a 4MHZ... para que mas??
pues antes cuando lei lo que decia dogflu sobre tener funcionando a 8 o a 20mhz me puse a pensar si hacer funcionar el pic mas rapido influiria en algo.
y una vez probado todo lo que se comenta en este hilo, y que nada diera resultado, se me dio por probar a 8mhz, los internos del 12F683. al principio me hice un lio con el tema de cambiar las configuraciones de los timers con sus respectivos calculos... pero logre hacerlo funcionar
 :shock: :shock: :shock: el servo dejaba de menar sus caderas como antes y pasaba a bailar una suave balada, apenas se movia!! a la vez que se me abria la boca de emocion, mi cerebro a la velocidad de 0,2Hz por segundo (o mas!) entendio que tenia que probar a mas velocidad a ver que ocurria!
empece a mirar mi caja con cosas y encontre un cristal de 12Mhz, una pena que no hubiese uno de 20, pero para probar valdria!
nuevamente me lie haciendo calculos, incluso peor que con el de 8mhz, ya que con este cristal te salen numeros periodicos, y decimales interminables... aunque despues terminas con los calculos y ves que todo cuadra perfectamente sin tener que truncar ni redondear ningun valor  :mrgreen:
pues eso, que lo puse a 12mhz... podia sentir la velocidad sobre mi cara, inicluso creo que pude escuchar las RPM a todo gas dentro del pic, y en ese momento broto una lagrima de mis ojos, y no era por la velocidad, sino porque mi pequeño servo solo se movia APENAS cuando encontraba una zona inestable del pot! vaya felicidad!
no paro de jugar con el, y mi cerebro funcionando a sus 0.2hz, que ahora en su pila de tareas tiene algo menos de lo que preocuparse, anela que llegue el lunes para ir a comprar un cristal de 20mhz.
lo que me queda mientras tanto es dejaros el codigo comentado (que funciona a 4, 8 o 12Mhz) para mover un servo con un potenciometro (con antirebote de pot incorporado!)
os dejo un video para que veais como vibra el servo a 4mhz aqui
lo que me preocupa es porque hay gente que puede hacer funcionar el servo a 4mhz sin que le vibre... sera que mi codigo esta poco optimizado?
pues un saludo y a ver si alguien me sabe decir si mi codigo esta tan mal como para que no funcione a 4mhz
« Última modificación: 16 de Junio de 2007, 00:32:00 por Marttyn »
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: mi servo no se queda quieto
« Respuesta #31 en: 16 de Junio de 2007, 02:44:51 »
Marttyn, me alegro que hayas disminuido las vibraciones, pero he visto algo en tu código que me chirría y te sugiero que pruebes a cambiarlo.

En tu interrución del Timer te limitas a activar un flag (flagOMS) que indica a tu bucle principal que debe levantar el pulso. En tu bucle principal tienes dos operaciones que comen bastantes ciclos de reloj: la conversión ADC y un cálculo con números float. Estas pesadas operaciones pueden retrasar el levantamiento del pulso bastante; quizás lo suficiente como para apreciar una vibración a 4MHz, aunque no tanto como para verla a 12MHz. Por eso con más frecuencia tu problema deja de verse, aunque no deja de existir.

Sugerencia:
- en tu bucle principal ve haciendo continuamente la conversión ADC y calcula dos números: nuevoTimerNivelAlto y nuevoTimerNivelBajo.
- estos dos números deben sumar siempre 20ms, y determinan el ancho del pulso que vamos a enviar al servo
- en tu bucle principal no haces nada más, no manipules la señal de control del servo
- tu interrupción podría quedar así:
Código: C
  1. if (input(SERVO)) {
  2.                                         // estaba en nivel alto
  3.                                         output_low(SERVO);
  4.                                         set_TIMER1(TimerNivelBajo);
  5.                                         TimerNivelBajo=nuevoTimerNivelBajo;
  6.                                         TimerNivelAlto=nuevoTimerNivelAlto;
  7.                                 } else {
  8.                                         // estaba en nivel bajo
  9.                                         output_high(SERVO);
  10.                                         set_TIMER1(TimerNivelAlto);
  11.                                 }
            
Observa que sólo cargo los nuevos valores que has calculado cuando el pulso ha bajado y está programado para sumar 20ms. Si lo cargase durante el pulso alto estaría corriendo el riesgo de que no sumase 20ms.

Por último, decirte que no lo he probado; esto es sólo teoría. Ya me contarás cómo va.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: mi servo no se queda quieto
« Respuesta #32 en: 16 de Junio de 2007, 06:43:36 »
suena interesante nocturno
y sobre todo corrobora mis sospechas de que habia algo que demoraba la subida o la bajada del pulso pwm, y por eso las vibraciones
a ver si mañana puedo probar lo que me sugieres. pero no suena para nada descabellado.
ya te contare los avances
un saludo y gracias!
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: mi servo no se queda quieto
« Respuesta #33 en: 16 de Junio de 2007, 11:11:50 »
dogflu, me acabo de leer todo el post del bot controlado por RF y no hay ni una sola mencion sobre servos  :5]
aunque mirando el lado positivo, aprendi algunas cosas sobre RF  :mrgreen:
j1m, con respecto a lo de promediar el adc, yo lo hice asi: leia el adc 10 veces en un lapso de 50ms (1 vez cada 5ms), sacaba el promedio y comenzaba de nuevo. es decir, tenia un valor cada 50ms, que es el que usaba para la pocicion del servo. el resultado: lo mismo que no promediar... aun asi probare lo que me comentas de la pila fifo a ver que tal...
por cierto, no creais que el servo se mueve BRUTALMENTE! es una vibracion pequeñita, pero genera mucho ruido y me calienta el 7805
salu2

Cierto no es en el Bot por Rf, es en este otro hilo del amigo Lord_lafebre donde compartimos invento tambien controlado por RF, de todas formas el enlace al codigo ya no funciona.
vere de probar de nuevo el codigo con los cinco servos y ya contare que ocurre.

http://www.todopic.com.ar/foros/index.php?topic=13556.0

PD. sorry..  :(
« Última modificación: 16 de Junio de 2007, 16:26:39 por dogflu66 »
Saludos desde Granada, España.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: mi servo no se queda quieto RESUELTO
« Respuesta #34 en: 18 de Junio de 2007, 01:02:48 »
 :-/ :-) :-/ :-) :-/ :-)
pues ahora si! lo he conseguido de verdad de la buena!
bueno, no se puede decir exactamente que lo he conseguido yo, sino vosotros, y en especial nocturno con su ultima aportacion que fue la decisiva!
ya puedo mover un servo con total precision y sin que vibre lo mas minimo.
ahora, he hecho cantidad innumerable de pruebas... es mas, creo que el pic con el que hago las pruebas ya debe haber cumplido su ciclo de vida promedio  :D
tantas pruebas me lleva a sacar nuevas conclusiones de la mejor manera de configurar los componentes y el soft para que funcione mejor.
lo que me parecio mas curioso es que no hacen falta condensadores de filtrado en ningun lado. ni antes o despues del 7805, ni en la entrada del pot, ni entre el + y - del pot... SOLO hace falta un condensador de 100 nanos entre Vss y Vdd del pic. NADA MAS
primero probe con una bateria de 12v como fuente, y como vi que no hacian falta los condensadores probe con los 12v de la fuente de alimentacion del PC (esa que todos dicen que son tan malas) porque no da voltaje constante... y el servo seguia sin vibrar ni nada...
de hecho, le quite el antirebotes por soft que le hice al pot, para ver que ocurria, y el servo seguia moviendose perfectamente.
las pruebas las estaba haciendo con un pot de los caros, pero casi me indignaba que el servo no quisiera vibrar, asi que busque el peor pot que encontre y probe con el... pero seguia funcionando todo con la suavidad de la seda.
visto que parecia a prueba de bombas recurri al adc de 10bits, calculos con mas decimales y a un potenciometro multivueltas (de estos de tornillo), y lo unico que consegui fue quedarme perplejo al ver que vuelta tras vuelta del pot, el servo se limitaba a responder a la perfeccion, sin encontrar NI UNA zona inestable en todo su recorrido  :shock:
pues nada... ahora soy un hombre feliz, que puede continuar con su vida y dormir bien por las noches.
pero como no, ahora tendre que embarcarme en nuevos proyectos, porque no se si soportare estas por mucho tiempo sin un problema gordo sin resolver  :D
os dejo el codigo para que lo aprovecheis, esta en C, para un 12F683... tiene implementado el codigo de antirrebote del pot, pero esta desactivado porque por ahora no hizo falta.
solo me queda una duda a la que todavia no le habia hecho caso... hace falta poner una resistencia limitadora de corriente en la entrada del ADC y en el pin de salida del servo? alargarian la vida util de ambos o solo los haria mas propensos a los ruidos e interferencias?
un saludo y gracias a todos por la ayuda!
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: mi servo no se queda quieto (RESUELTO)
« Respuesta #35 en: 18 de Junio de 2007, 01:54:42 »
Enhorabuena por conseguirlo. Acabas de recibir una inyección de adrenalina pura para acometer nuevos proyectos.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: mi servo no se queda quieto (RESUELTO)
« Respuesta #36 en: 18 de Junio de 2007, 18:01:52 »
Quedo magnifico el hilo, ya lo puse en el indice de robotica como recomendado...  :-)
Saludos desde Granada, España.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: mi servo no se queda quieto (RESUELTO)
« Respuesta #37 en: 18 de Junio de 2007, 18:22:14 »
Me encanta que las cosas terminen bien.

Mi experimento con el Servo terminó (quedó abandonado) sin solucionar el tema de la impresición según que lectura hacía (en mi caso un termo-servo cuya posición la controlaba un sensor de temperatura) ... asi que ahora me toca revisar todo el hilo y aprender de las soluciones que nos aportas.

Mis mas sinceras felicitaciones Marttyn, ése es el espíritu del foro.  :mrgreen:

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: mi servo no se queda quieto (RESUELTO)
« Respuesta #38 en: 19 de Junio de 2007, 17:05:51 »
 :cry: que felicidad... ya me siento "util" en el foro...
bueno, hice una prueba mas con un potenciometro deslizante. los otros con los que habia probado eran todos diferentes tipo de los que giran 270º, excepto el multivuelta. y con el pot deslizante si que encuentro bastante impresicion al leer el adc, es decir, me vibra. tambien vibra con cables largos hasta el pot (como ya lo habia comentado antes alguien). asi que lo de que no son necesarios los condensadores de filtrado o el antirebote por soft es relativo... variara segun el diseño de cada circuito y la calidad de los componentes.
nada mas... salu2

PD: que ilusion! estoy en el indice de robotica!  :-/
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: mi servo no se queda quieto (RESUELTO)
« Respuesta #39 en: 20 de Junio de 2007, 20:17:41 »
vamos a enroscarlo aun mas  :-)
el codigo que funciona tiene un pequeño (o muy grande) defecto... que ocurre si se quiere controlar mas de un servo? habria que tener un timer por cada uno... y eso no es viable.
que solucion podriamos encontrar para eso?
dogflu, tu como controlabas los 5 servos a la vez con presicion?
yo ya estoy dandole vueltas al asunto y haciendo las pruebas necesarias... si alguno tiene alguna idea que la comente.
salu2

PD: que poco duro la paz...  :D
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: mi servo no se queda quieto (NUEVO RETO)
« Respuesta #40 en: 21 de Junio de 2007, 01:54:34 »
Te lanzo mi sugerencia.

Lo primero sería definir la resolución mínima con la que quieres trabajar. Por ejemplo, si divides el rango de movimientos del servo en 100 posiciones, necesitarías un byte (o sólo 7 bits) que te indique la posición de cada uno. Podríamos almacenar estas posiciones en un array Servo(i)

Obviamente, tendrás que dividir también en 100 posiciones el ancho máximo del pulso alto de la señal PWM que maneja el servo. Si el rango va de 0.5ms a 2.5ms, tendrás una resolución mínima de (2.5ms - 0.5ms) / 100 = 20us. Configura el timer para que interrumpa cada 20us.

La primera vez que se entra a la interrupción ponemos todas las salidas a nivel alto.
A continuación, cada vez que volvemos a entrar en la interrupción vamos incrementando en una unidad el "contador de pasos". Recorremos el array de posiciones para comparar dicho contador de pasos con la posición que tenemos almacenada para cada servo. En los servos en los que la condición se cumpla, bajamos el pulso.

Al llegar al paso nº 100 ya hemos tenido que bajar el pulso de todos los servos. Sólo nos queda esperar a que pasen los 20ms de rigor sin hacer nada para comenzar un nuevo ciclo.

La pega más importante que puede haber es que a la interrupción no le dé tiempo acabar los deberes en 20us, por lo que yo empezaría las pruebas con una resolución baja (10 posiciones, por ejemplo) y la aumentaría cuando todo estuviese funcionando y depurado.

Al igual que la otra vez, no lo he probado; sólo es una idea y espero que tú puedas convertirla en realidad como en la ocasión anterior.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: mi servo no se queda quieto (NUEVO RETO)
« Respuesta #41 en: 21 de Junio de 2007, 03:43:59 »
Pues Manolo te lo explico claro y con todo detalle.... :mrgreen:
y aqui si que se necesita velocidad de proceso... :D
Saludos desde Granada, España.

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: mi servo no se queda quieto (NUEVO RETO)
« Respuesta #42 en: 21 de Junio de 2007, 13:18:37 »
y una solucion como la que nos ofrece redpic en sus ejemplitos?
es decir, el timer a 20ms, y en el bucle principal miras en que posicion se encuentra el timer. cuando le corresponda a cada servo se baja el pulso.
vamos, es el primer codigo con el que probe... y vibraba, pero supongo que era por las conversiones adc...
pero si las conversiones adc las hiciera SOLO una vez que el pulso haya bajado tendria como minimo 17.5ms para esta tarea, con lo que EN PRINCIPIO no deberia hacer vibrar al servo ya que el pulso se esta bajando correctamente cada vez.
nocturno, voy a probar de esta manera primero que asi tengo que hacer menos modificaciones al codigo, y si no da resultado mirare como tu dices.
y sino siempre podemos subir la velocidad del micro  :mrgreen:
salu2
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Giovanny

  • PIC12
  • **
  • Mensajes: 97
    • Supercomponentes
Re: mi servo no se queda quieto (NUEVO RETO)
« Respuesta #43 en: 21 de Junio de 2007, 19:35:54 »
hola amigos de todo pic.  :mrgreen:

para marttyn y todos lo interesados en controlar la posicion de los servomotores, pongo a su disposicion un ejemplo (con comentarios) de cómo hacerlo usando el puerto serie.
En este programa he seguido algunas recomendaciones del amigo Nocturno. :-)
cualquier otra sugerencia les agradezco. 

Espero que les sea de utilidad y que se diviertan en el camino. :D :D

Hasta pronto
        Saludos desde Colombia! Que hermoso país....

Desconectado Giovanny

  • PIC12
  • **
  • Mensajes: 97
    • Supercomponentes
Re: mi servo no se queda quieto (NUEVO RETO)
« Respuesta #44 en: 22 de Junio de 2007, 16:56:41 »
correccion..
en la interrupcion #int_rda
//y guarda este valor en tServo1
//para luego cargarlo a timer0

cambiar por:

//y guarda este valor en tServo1
//para luego compararlo con timer0
        Saludos desde Colombia! Que hermoso país....