Shop OBEX P1 Docs P2 Docs Learn Events
Acceleration motor STEP to PAP STEP — Parallax Forums

Acceleration motor STEP to PAP STEP

hal2000hal2000 Posts: 66
edited 2007-12-29 16:22 in Propeller 1
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· cool.gif

Comments

  • deSilvadeSilva Posts: 2,967
    edited 2007-12-29 01:23
    Hal, your code is difficult to understand for many reasons, please allow me to make some editorial changes before we discuss it further:
       time:= cnt  
       repeat pasosn
          outa:=1
          waitcnt(time + (1000+ac+dc) )   ' valor critico -2000
          a++
          outa:=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)
    

    Post Edited (deSilva) : 12/29/2007 1:30:46 AM GMT
  • AleAle Posts: 2,363
    edited 2007-12-29 08:18
    hal2000, you can PM me in Spanish if you need.

    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.
  • hal2000hal2000 Posts: 66
    edited 2007-12-29 10:01
    DeSilva have reason. :-(
    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???
  • AleAle Posts: 2,363
    edited 2007-12-29 11:24
    hal2000:

    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.
  • hal2000hal2000 Posts: 66
    edited 2007-12-29 16:19
    Not wanted to annoy.
    Perdon

    The next question will be in English
    over this language.

    Regards


    Envio editado por (hal2000) : 12/29/2007 4:34:53 PM GMT
  • AleAle Posts: 2,363
    edited 2007-12-29 16:22
    hal, you do not annoy. We have loads to learn smile.gif, welcome to the club.
Sign In or Register to comment.