Duda sobre control de servos

Scooter

Cascarrabias crónico
He estado documentandome sobre el uso de servos y por lo que he leído es una señal de periodo 20ms y según la amplitud del pulso, de 1 a 2ms determina la posición del servo.

La pregunta, que no he conseguido resolver aunque lo he buscado, es
¿Que pasa si dejo de enviar pulsos?, ¿Se queda donde está? ¿Vuelve al origen?

La cuestión sería para controlarlo con un arduino, mientras se esté moviendo voy regulando el ancho del pulso pero una vez "en su sitio" si "no digo nada mas" ¿Se queda ahí y me puedo olvidar de él hasta que lo quiera volver a mover? Sería lo mas práctico, así no me tengo que preocupar de él.
 
pues los servos dicen que se controlan con 20ms
si le dejas de mandar pulsos se quedan donde estan y el torquee lo pierden instntaneamente

300px-ControlServo.svg.png


el diagrama del servo dice que solo es un comparador de error y un convertidor de pulsos a voltaje
es un hecho que puedes hacer uno pero viendo el diagrama vez que no es necesario que sea a 20ms

mas bien la posicion del servo esta dada por el periodo y el tiempo de duracion del estado alto

he manejado servos a 5ms y 10ms solo respetando el tiempo de subida a la escala de los 20ms

cuando quieres que el servo se quede donde esta y este fijo "que trates de moverlo con la mano y regrese a donde debe de estar".
eso lo haces mandando el pulso todo el tiempo

resumen:
1.-para que el servo este donde este debes mandarle pulsos todo el tiempo
2.- no es necesario que sea a 20ms
3.-debes respetar el pulso de subida
4.-si el pulso es mas grande de lo que es, el servo se va hasta el tope dañando los engranes
5.-si lo dejas de alimentar en pulsos se queda donde esta pero esta en modo Stand By
 
Bueno, está claro que si algo mueve el servo y no tiene señal de control... se pierde la posición.
La idea era para el caso en que no se espere "reacción" por parte del elemento movido, para descargar la CPU se podría "refrescar" la posición por ejemplo cada segundo en lugar de estar continuamente enviando los pulsos de control para esa posición.

Lo que me imagino que cuenta es la amplitud del pulso, si envías los pulsos cada 200ms pues si se pierde la posición tardará mas en reaccionar pero volverá a su sitio.
 
pues si pero no se que quieras hacer digo el cpu de un micro no se va a tostar por solo enviar un pulso y menos si es de 20ms que son 50hz es casi nada.

lo que hace el servo es que si esta alimentado con pulsos se va a quedar ahi si se le quitan los pulsos se mueve facilmente con la mano.
 
Es lo de siempre, si se hace con un timer (que tengo ya ocupado) no es nada, puede suponer unos 10µs "de esfuerzo", si se hace un bucle de 20ms es como veinte eternidades eternidades juntas mas o menos. Tengo demasiadas cosas que hacer para echarme siestas de 20ms y mas si es una detrás de otra.

De momento estoy solo recopilando información luego veré mi estrategia, si muevo el servo con el timer y dejo "lo otro" para los bucles o viceversa.
Ahora mismo no hay problema porque todo va con interrupciones así que en el bucle principal puede hacer lo que quiera, pero si atiendo al servo ya no puedo seguir añadiendo. Yo siempre quiero "hacer mas", no me gusta llegar al tope.

La idea que llevo es que el servo solo actuaría un tiempo hasta cambiar de sitio una cosa, luego ya se queda quieto unos minutos.
 
es que es estrategia de programacion

con 1 timer puedes hacer los relojes que se te antojen por ejemplo dices que tienes 10us ocupados
es mas que perfecto.

para 1 ms nececitas 100 veces el 10us
y para 20ms nececitas repetir 20 veces el 1ms

desconosco arduino por que me cae gordo pero en C es algo asi:

interrupcion
{
us++; //incrementa cada 10us
}


main
{
if(us>=100)
{
us=0;//regresamos a 0 el conteo de us
milis++; //por cada 100 u seg incrementa en 1 la variable ms
}

if(milis>=20)
{
milis=0;//aca hago 1 periodo de 20ms
}
}



ya te dejo pensar como debes usar el PWM a software para no gastar los modulos de PWM
 
Ya, pero lía la programación, hay que calcular dos trozos y sumarlos.

No es alto secreto secreto, es una centralita para un motor monocilíndrico de una carrera de bajo consumo.
Ahora mismo controlamos cuando hace el encendico y cuando y cuanto hace la inyección mediante dos interrupciones; una en el árbol de levas cada ciclo del motor (2rpm) y otra en el cigüeñal 56 por ciclo porque son los dientes de la corona de arranque.
A 7000 o mas rpm, puede llegar a 12000, tenemos 12000*56/60= 11200 interrupciones por segundo cosa que empieza a ser "graciosa". El timer ahora mismo hace la duración del tiempo de inyección y me viene bien porque me desentiendo de él hasta el siguiente ciclo termodinámico que son 100Hz a 12000rpm.
Si enmedio de ese lío tengo que partir el timer que empieza yo no se cuando; cuando el motor está en cierta posición que puede o no corresponder con los 20ms, para ver cuanto le toca a cada uno... me viene un poco mal la verdad.
El servo serviría para abrir la mariposa en aceleración del motor hasta llegar al tope y ahí se queda hasta que el piloto para el motor, en ese momento cierra la mariposa para eso tengo todos los recursos del mundo porque el motor está parado porque se corta la inyección simplemente. Ahora mismo la mariposa se acciona con un cable pero la idea es hacer una aceleración "controlada" y que el piloto solo diga "marcha" y "paro"

Lo ideal sería usar los pwm por hardware que para eso están, pero en arduino van a 450Hz o así. Supongo que se podrá "desmontar" con el C estándard del AVR y hacer la configuración que queramos, pero a este paso voy a tirar la platafotma arduino por la ventana y hacerlo todo en C del avr; el timer ya está "puenteado" al C "normal" porque arduino no da soporte.


Edito:
Mira por donde tengo la solución; en el punto "opuesto" de la inyección seguro que el timer no hace nada porque no está inyectando, así que ahí lo tengo "solo para mi" para generar los 2ms de amplitud de pulso o los que sean.
Eso si, la frecuencia de control será a la que gire el motor, entre unas 1000~8000rpm osea 16 a 133Hz... que está en un rango creo que razonable.
Será cuestión de experimentar
 
Última edición:
pues antes de decir que es mejor el PWM por hardware es mas bien que quiere uno hacer
por ejemplo queremos llenar el micro con todas las salidas PWM.
no alcansan los resgitros por hardware pero es no hace imposible

la teoria es:

hacer un timer a una interrupcion digamos 50us

calcular 1 ms

while(1)
{
if(inc>=20) //cada 20 incrementos es 1 ms
{
inc=0;
miliseg++;
}


ahora empieza el PWM por soft

if(miliseg>=20)//generamos un periodo de 20ms
{
miliseg=0;
}

if(miliseg<=10) //generamos un pulso cuadrado de 10ms arrbia y 10ms abajo
{
LED=1;
}
else
{
LED=0;
}

//y podemos repetir esto hasta saturar todas las patas del micro


}//fin del bucle


no es gran ciencia solo debes pensar el arduino es lo que hace no te hace pensar :LOL:
 
Tengo claro como se hacen y como funcionan los timers por sofware, por eso no los uso nunca. :LOL:

En arduino está la función milis() y micros() que generan un "reloj" del sistema.

Se puede leer milis() o micros(), sumarle el tiempo deseado y luego ver si milis o micros son mayor o igual que ese número... pero hay que vigilar cuando desborda porque de vez en cuando no cuadra. Eso sería lo menos malo
 
Atrás
Arriba