Acceleration motor STEP to PAP STEP
hal2000
Posts: 66
I attempt to take control of the acceleration of a motor PAP
At the moment only to a small ramp acceleration
But it is not very uniform
This is what I do
Reducing the time between step and step
It accelerate
The result is an exponential acceleration
This was improved by adding another variable to offset the effect by reducing the remainder of the variable acceleration
Take an example
·
ifnot pasosn==0·
····· repeat p from 1 to pasosn
········ time:= cnt···
··········· outa[noparse][[/noparse]1]:=1
··········· waitcnt((1000+ac+dc) + cnt)······· ' valor critico -2000
······· a++
··········· outa[noparse][[/noparse]1]:=0····
····
········ if ac>4000 ·····························‘Speed limit
··········· if a==tm
············· ac-=(1000-tm)············ ‘Tm compensates for the reduction of time
············· a:=0
············ tm++
·
······
······· waitcnt(time += ac+dc+11500)
··
Does anyone have a better idea to get aceleracione slowdowns and better control?
Is it a good idea to use a table in memory?
Perdon by my English
Thanks·
At the moment only to a small ramp acceleration
But it is not very uniform
This is what I do
Reducing the time between step and step
It accelerate
The result is an exponential acceleration
This was improved by adding another variable to offset the effect by reducing the remainder of the variable acceleration
Take an example
·
ifnot pasosn==0·
····· repeat p from 1 to pasosn
········ time:= cnt···
··········· outa[noparse][[/noparse]1]:=1
··········· waitcnt((1000+ac+dc) + cnt)······· ' valor critico -2000
······· a++
··········· outa[noparse][[/noparse]1]:=0····
····
········ if ac>4000 ·····························‘Speed limit
··········· if a==tm
············· ac-=(1000-tm)············ ‘Tm compensates for the reduction of time
············· a:=0
············ tm++
·
······
······· waitcnt(time += ac+dc+11500)
··
Does anyone have a better idea to get aceleracione slowdowns and better control?
Is it a good idea to use a table in memory?
Perdon by my English
Thanks·
Comments
Post Edited (deSilva) : 12/29/2007 1:30:46 AM GMT
English: You can decrease the time between stes to a minimum determined by your motor tye. Below that limit the motor will ignore some steps and you may end with the reverse effect (decelerating or constant seed).
I'd recommend you experiment with several acceleration curves, this kind of motors do not accelerate linearly they do it logarithmically of exponentially. A Matching courve with some 10 steps should be enough...
Spanish: El tiempo entre pasos se puede reducir, pero mas alla de un limite impuesto por el motor, el motor va a ignorar los pasos y el efecto puede ser contrario o sea va a desascelerar o tendra velocidad constante, depende de la frecuencia de los pasos.
Te recomendaria que pruebes con diferentes curvas de asceleracion, estos motores no suelen ascelerar linearmente, si no que lo hacen en forma logaritmica o exponencial, una tabla con 10 pasos funcionaria... creo yo.
Neither myself understand the written word
This is for sleeping late
Attempts to better explain where this awake
Thanks Ale!· :-)
Gracias Ale!!!
·
·
Para ir mas rápido te escribo en Español que en ingles parezco un·niño y el google tampoco es que sea una maravilla.
·
Este bloque de programa lo único que hace es acelerar el motor al principio de la secuencia.
Si tienes razón, el motor a partir de una frecuencia ya no responde y se traba.
·
Pero trabajando en micro pasos la frecuencia es mucho mayor y el motor· se comporta mejor.
Algo que es muy bueno para no perder pasos es utilizar aceleraciones y desaceleraciones.
He encontrado algunas formulas basadas en V=e/T pero las que producen mejores resultados requieren
De coma flotante (Propeller poca coma flotante) y otras funciones tipo cos y que· requieren ·mucho tiempo de proceso.
·
Por eso pensé dos maneras
1 intentar mediante restas y divisiones conseguir una aceleración progresiva
· Este código lo consigue, te explico
·
·El bucle se repite tantas veces como queramos mover el motor "PASOSN" tiene el total de los pasos a recorrer
Recojo el valor de CNT para que el tiempo sea estable
Enciendo el pin 1
Espero ·1000+ac+dc····· “1000 seria la velocidad maxima … por si las moscas”
A·· ·se incrementa
Apaga el pin 1 “ mi controladora es de micro pasos y de este modo es mas bonita la curma de salida al motor”
·
If ac>4000········ si la espera en megahercios es mayor de 4000 pues entonces empezamos a restar tiempo
·
If a==(1000-tm)·· con la variable TM conseguimos que la aceleración sea casi lineal
·¿Por qué?· Bueno si no compensásemos esto resultaría que según se incrementa la velocidad del motor también se incrementaría la aceleración y de lo que se trata es de una aceleración lineal
·
A:=0·· A es el contador , según aceleramos dejamos que a alcance un valor mayor a si no aceleramos en cada paso, solo al principio de la rampa… al final es cada un cierto numero de pasos segun Tm.
·
Tm++····· Tm se incrementa y a la vez incrementa el limite de·A ( if a==tm)
·
Waicnt(time +=ac+dc+11500)··· esto hace que la frecuencia sea estable. El valor de cnt lo cojo al principio y le sumo 11500 que es lo que consumen en tiempo las instrucciones, este valor esta calculado por el método prueba y error…………….
·
·
Esta rutina funciona bastante bien, pero tiene otros problemas, si quieres que el motor empiece a· girar desde una velocidad muy lenta, la aceleración es eterna …. Pero bonita, eso si. Para hacer esto mejor abría que variar el valor que restamos al tiempo de una manera mas eficiente dependiendo del numero de pasos en los que queramos acelerar
·
·
La otra forma que se me ocurre es calcular unas curvas y introducirlas en la memoria.
Pienso que podría ser de la siguiente manera
·
El valor máximo seria 255 y la longitud de la tabla de 100. según queramos acelerar mas rápido o mas lento recorremos esta tabla más deprisa o mas lento y el valor lo multiplicamos por 10 o 100 o 1000
·
Llegados a este punto
¿en la memoria del Propeller no hay una tabla con una función coseno???????
¿Donde esta???
Vamos por partes: - El propeller tiene una tabla de 2049 valores para el seno de 0 a 90 °, esta en 0xE000, y son valores de 16 bit entre 0 y 0xffff. podes sin problema usarla. Tambien hay otra tabla de logaritmos creo que en 0xd000. con similares caracteristicas (entre 1 y 2 o algo asi, esta en el manual, leiste el manual no ?).
Lo de la tabla te lo sugeri antes. Pero quiza como vos decis 100 valores sean mejor que 10. Para ascelerar mas rapido, recorre la tabla mas rapido, o sea salteate valores, en vez de multilicar or 100 o 1000, asi queda en rango.
Si pones un emisor/receptor infrarrojo y una rueda dentada solidarios al eje del motor podes hacer el circuit realimentado y saber cuanto ascelero y or ende compenzar mejor. Un sensor de efecto HALL y un peque~no iman tambien te servirian.
Para numeros correctamente en rango, podes usar aritmetica 16.16 y evitar la coma flotante.
Mandame un PM con mas preguntas si queres, pues los foros deben ser en ingles y or ahi se enojan.
Buena suerte.
Perdon
The next question will be in English
over this language.
Regards
Envio editado por (hal2000) : 12/29/2007 4:34:53 PM GMT