Cuente los pulsos PWM alimentados en el controlador FET del motor paso a paso

Estoy tratando de contar (con precisión) la cantidad de pulsos alimentados a un controlador de motor paso a paso TI DRV8711 . Este controlador "convierte" un flanco ascendente, según la configuración, en un paso completo o micropaso. El MCU que estoy usando para generar esos pulsos PWM es un Freescale MPC5602D . La frecuencia de pulso será inferior a 30 kHz por motor paso a paso.

La aplicación para la que estoy usando este dispositivo es el control de posición con un motor paso a paso. Esto requiere un conocimiento preciso de los pasos dados (dado que el motor paso a paso no se detiene).

¿Cómo se conduce normalmente ese tipo de conductores? ¿Usando un pin GPIO normal que se afirma en una rutina de interrupción del temporizador o mediante PWM? Quiero evitar abarrotar el bucle principal con la afirmación y la anulación de un pin GPIO. (Tengo que controlar más de 5 motores paso a paso simultáneamente)

Contar los pulsos PWM enviados al controlador es trivial con un pin GPIO normal.

Por otro lado, ¿cómo se va a abordar el problema de contar con precisión el número de pulsos PWM? ¿Se hace esto alimentando la salida PWM a la MCU y usando un contador para contar los flancos ascendentes? Supongo que tengo que disminuir la frecuencia de PWM antes de alcanzar el número deseado de pulsos para deshabilitar el PWM antes del último pulso y así garantizar que no se "sobrepase" el punto de ajuste.

Si está generando el PWM, entonces está utilizando algún tipo de temporizador periférico, muy bien capaz de contar los pulsos que está produciendo, o generar una interrupción cada N pulsos.
@EugeneSh. Solo puedo encontrar una opción para generar una interrupción cada vez que se crea un pulso. Contar estas interrupciones en un ISR me parece una sobrecarga de procesamiento excesiva para esta tarea. Alimentar manualmente la salida PWM a una entrada de contador de pulsos tampoco parece demasiado limpio. Me pregunto cómo se hace esto normalmente.
Normalmente, no usaría el módulo PWM en absoluto, porque los motores paso a paso no requieren un ciclo de trabajo variable. En su lugar, podría requerir una frecuencia variable (para aceleración/desaceleración). Entonces, un periférico especial o un GPIO regular controlado por software especial servirá.
Exactamente, esta es la razón por la que estoy usando una salida modulada por frecuencia y ancho de pulso, aún, por conveniencia, llamada salida PWM. La forma en que lo describe fue en realidad mi primer acercamiento. Sin embargo, TI declara la entrada como una señal "PWM", así que pensé que tenía que haber una solución más elegante.
El punto aquí es que usted está tratando de obtener de una retroalimentación lo que sea que tenga que ser un feedforward . No desea que el MC le diga cuántos pulsos envió, pero necesita decirle cuántos enviar.
Sí, desafortunadamente, esto no parece ser posible con la MCU que mencioné (al menos en cuanto al hardware). ¿Conoce alguna MCU que implemente una característica como esa? De lo contrario, realmente me apegaré al pin GPIO controlado por software.

Respuestas (2)

Conozco tres formas de lograr lo que necesita (y he usado las tres). Ha mencionado los dos primeros en su comentario.

Hacer que un ISR cuente los pulsos escalonados es lo más simple. El ISR solo necesita incrementar o disminuir un contador de posición. En los micros de 8 bits que uso, tal ISR tomaría menos de un microsegundo (aunque codifico en lenguaje ensamblador, no C, en esa MCU). No debería ser una gran sobrecarga en cualquier MCU.

La segunda forma es llevar el pulso de paso a un contador. Eso podría ser difícil de manejar si su motor funciona en ambas direcciones, ya que necesita incrementar algunas veces y disminuir otras (o simplemente saber en qué dirección está el conteo en relación). Utilicé este método en los años 80, cuando los chips de contador/temporizador se usaban normalmente para el control de movimiento.

La forma más eficiente de controlar un paso a paso es con un circuito generador de velocidad separado, controlado por la MCU. Una forma sencilla de construir uno es usar el chip multiplicador de tasa 7497 . Cada 7497 es de seis bits y los conecta en cascada para obtener la resolución deseada. Sin embargo, su flujo de pulsos de salida no es muy uniforme, lo que puede causar inestabilidad en algunas aplicaciones (sin embargo, se puede filtrar). Una técnica mejor es el método del sumador/acumulador, que proporciona un flujo de pulsos de salida muy limpio y se multiplexa fácilmente para impulsar varios motores (si es necesario). He tenido algunos sistemas de 32 ejes que utilizaron este enfoque. El Adder/acumulador (y el mux) encaja muy bien en un FPGA.

La gran ventaja de un generador de tarifas es la simplicidad del software. El generador de tasas le brinda una interrupción a una tasa fija, que es su período de actualización. En ese ISR simplemente carga la cantidad de pasos que desea ejecutar en el próximo período. Las interrupciones de actualización pueden ser relativamente poco frecuentes, por lo que la sobrecarga es baja. La posición es fácil de mantener: solo agrega el valor que carga en el generador de tasas a su contador de posición. La velocidad se controla fácilmente porque es directamente proporcional al número de pasos que carga en el generador de frecuencia. La aceleración también es fácil de controlar: solo agregue o reste un valor fijo en cada actualización. Si tiene varios motores, los actualizaría todos en el mismo ISR.

(uf) Lo siento si eso fue demasiado extenso.

¡No demasiado extenso en absoluto! ¡Justo lo que estaba buscando!
¿Tiene más documentación sobre el "generador de tarifas"? Estoy pensando en ejemplos de circuitos/aplicaciones, documentación, tutoriales que explican cómo funciona.
@VictorLamoine - Lamento la demora en la respuesta, pero acabo de recibir su comentario. Voy a desenterrar uno o dos esquemas antiguos. Sé que tengo una versión de un solo eje que puse en un FPGA (muy legible) y es posible que tenga una versión de varios ejes. ¿Necesita multieje?
Sí, necesito controlar 72 motores paso a paso sincrónicamente. ¡Un esquema de un solo eje ya sería un buen comienzo para mí!
@VictorLamoine: 72 motores paso a paso es bastante, pero dentro de las capacidades de un sumador multiplexado. ¿Tienes una idea para una tasa de actualización? ¿Una tasa de paso máxima? A medida que aumentan esos valores, la velocidad del reloj debe aumentar. Puedo hacer los números por ti, pero tal vez debería ser una pregunta aparte.
Probablemente tendría 100 pasos/segundos como máximo. Voy a crear una pregunta dedicada sobre eso. Eso es una buena idea
@VictorLamoine - wow, eso es bastante lento. Estoy acostumbrado a la zona de 100.000 pasos/segundo. Una vez que tenga su nueva pregunta, asegúrese de vincularla aquí, para que pueda encontrarla (no he leído nuevas preguntas en mucho tiempo).

Quizás el método más simple para generar pulsos PWM es usar un PLC Omron CP1L-M30DT1-D (este es un número de pieza de ejemplo, ya que hay varios modelos adicionales con salida de pulsos de alta velocidad). No solo puede generar pulsos PWM con este dispositivo, sino cualquier cantidad de pulsos estándar predeterminados al 50% del ciclo de trabajo para conducir un motor paso a paso a una posición predeterminada. La aceleración y la desaceleración también son programables, lo que elimina los errores del controlador del motor paso a paso. Los contadores de alta velocidad también están disponibles si desea retroalimentar los pulsos para su verificación, pero por lo general son innecesarios ya que el dispositivo generará con precisión el número de pulsos preprogramados. Soy nuevo en este grupo y no creo que pueda crear un enlace a la especificación de PLC, así que tal vez alguien más pueda crearlo por mí.

http://www.miel.si/wp-content/VsebinaPDF/P20E-EN-02+CP1L+Datasheet.pdf

Las especificaciones de entrada de contador de alta velocidad y salida de pulsos se encuentran en la página 3 de esta documentación

Abogar por la compra de un equipo modular, sin duda costoso, que encapsula todos los detalles funcionales en su interior de caja negra no es realmente una respuesta a una pregunta que busca comprender cómo implementar esta funcionalidad en detalle, ni realmente en el espíritu . del sitio La pregunta que efectivamente está respondiendo "¿qué puedo comprar para resolver este problema?" estaría prohibida aquí como una pregunta de compra/selección.
Gracias @ChrisStratton entendido. Como mencioné en mi comentario, soy nuevo en el sitio y lo entendí como basado en soluciones, no limitado a soluciones de nivel IC. Mi intención era ofrecer una solución alternativa de bajo costo, sin embargo, aún requería una comprensión profunda de la programación para obtener los resultados deseados. Pero gracias por la información y lo tendré en cuenta cuando responda en el futuro.