Fallo del motor paso a paso: ¿causado por PWM o de otra manera?

Como se sugirió en mi pregunta original en raspberrypi.stackexchange.com , también estoy publicando mi problema aquí, lo encontrará textualmente al final de esta pregunta.

Sin embargo, debido a que este es un sitio de ingeniería eléctrica, me complace formular una pregunta que es un poco más específica sobre la parte de ingeniería eléctrica:

Según el problema que describo, ¿es probable que el
problema se deba a un problema de sincronización (es decir, busque una solución en la forma en que dirijo el
motor paso a paso, es decir, una solución de software), o cree que hay algún
tipo de problema eléctrico/? ¿Problema mecánico o característica del motor paso a paso que no conozco?

Muchas gracias de antemano!

EDICIÓN 1: Actualización basada en los comentarios hasta ahora: el helicóptero es una placa de aluminio de 16 cm de diámetro y 1 mm de espesor con 5 agujeros. Suponiendo un disco masivo para facilitar el cálculo, el disco tiene un volumen de 20 cm^3 y una masa de 54 gramos. El momento de inercia debe ser 0,5 M R^2 = 0,5 0,054 0,08^2 = 0,0001728 kg.m2. La conversión a oz.pulgada^2 produce ~9.4 oz.pulgada^2, lo que concedo parece ser 2-3 veces el par motor basado en su hoja de especificaciones. (No seleccioné el hardware para este prototipo... :)) Lo que me sorprende es que incluso una aceleración 10 veces más lenta (llegando a la velocidad máxima en el transcurso de 32 segundos) TAMBIÉN falla regularmente , generalmente alrededor de 2000PPS o 10000PPS según un algunos intentos rápidos. El hecho de que funcione a veces(aunque rara vez) también me sorprende.

Por lo que entiendo hasta ahora, podría ser que el motor tenga poca potencia. ¿Alguna explicación de por qué funcionará bien a veces, e incluso fallará en aceleraciones muy lentas a veces también?


Publicación original a continuación


Resumen:
Raspberry Pi controla un EasyDriver y un motor paso a paso, pero los resultados son inconsistentes y el sistema falla regularmente. No puedo entender por qué.

Texto largo:
Hola a todos,

Tengo una configuración pequeña en la que se supone que un motor paso a paso impulsa una rueda de helicóptero para modular una señal. Contar los pasos no es un requisito ya que el motor viene con un codificador, pero sí una velocidad estable. Estoy usando la biblioteca pigpio (más específicamente, la función hardware_PWM) para configurar el RPM en el pin (12) en la Raspberry. Dado que configurarlo a máxima velocidad instantáneamente no hace que el motor paso a paso se mueva en absoluto, he codificado un pequeño aumento de velocidad. El script de prueba que uso hace que suba a 32000 ppm (20 Hz / 1200 RPM), permanezca allí durante unos segundos y luego disminuya nuevamente.

He tenido un problema regular en el que, en cualquier momento durante la aceleración, el funcionamiento estable o la disminución gradual (aunque generalmente aumenta), el motor parece perder su "agarre" en el eje giratorio y el helicóptero. A partir de ese momento, el picador disminuirá su velocidad a 0 RPM, pero el motor continuará intentando acelerar (incrementar) o mantener la velocidad (RPM estables), lo que provocará un silbido/zumbido diferente al del funcionamiento normal. Actualmente creo que debe ser algún tipo de problema de tiempo, ya que, según mi comprensión limitada, un motor paso a paso se puede comparar con un giro que necesitaría "empujar" en el momento correcto, o no hará nada o realmente lento abajo. ¿Es posible que en algún punto aleatorio se produzca una discrepancia de tiempo entre el tren de pulsos y los "tiempos de empuje ideales", lo que provoque este problema? Asombrosamente,

Me doy cuenta de que esto es probablemente una combinación de Raspberry Pi, hardware y pigpio, pero espero que esto le suene a alguien que pueda ayudarme, ¡sería muy apreciado!

Algunas especificaciones, en caso de que ayuden:
Motor : NEMA08-17-01D-AMT112S ( https://www.cuidevices.com/product/resource/nema08-amt112s.pdf )
Fuente de alimentación : LPV-150-24 (LED reutilizado- controlador, https://www.meanwell-web.com/nl-nl/ac-dc-single-output-led-driver-constant-voltage-c-lpv--150--24 )
Controlador : EasyDriver ROB-12779 ( https://www.sparkfun.com/products/12779 )
Código de prueba : https://pastebin.com/tKS0jvDA (Hay un error tipográfico en la línea 7 que no está en el código real;))
Demostración de error: https: //www.youtube.com/watch?v=KtLGCtxPLPw
Notas de demostración:En el primer ciclo, falla durante el centrifugado, puede escuchar cómo aumenta la frecuencia pero el eje se ralentiza. En el segundo intento, alcanza la velocidad que debería, y luego falla mientras reduce la velocidad, momento en el que la melodía que escuchas es causada por la masa del helicóptero que impulsa efectivamente un motor sin energía :)

EDITAR 29/04: Se agregó una lista de códigos para publicar según lo solicitado:

import datetime
import time
import pigpio
import numpy as np
import Rpi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(6, GPIO.OUT)
GPIO.output(6,0)    #Enable motor
pi = pigpio.pi()
 
freq_startup_diff = 100
freq_startup_wait = 0.01
motor_freq = 32000
startup_range = np.arange(0,motor_freq+1,freq_startup_diff)
print('Motor starting')
for freq in startup_range:
  pi.hardware_PWM(int(12),int(freq),int(1e6*0.5))
  print("Frequency equals {}".format(freq))
  time.sleep(freq_startup_wait)
 
print('Motor started.')
 
time.sleep(3)
print('Motor stopping.')
stop_range = np.flip(startup_range)
for freq in stop_range:
  pi.hardware_PWM(int(12),int(freq),int(1e6*0.5))
  print("Frequency equals {}".format(freq))
  time.sleep(freq_startup_wait)
 
GPIO.output(6,1)    # Disable motor
print('Motor stopped.')
```
Parece que estás acelerando demasiado rápido para tu carga física. Describa la rueda de su helicóptero, ¿conoce su momento de inercia? O bien, si nos dice el peso y el tamaño, podemos estimarlo.
Es una placa de aluminio de 16 cm de diámetro y 1 mm de espesor, con 5 agujeros de aproximadamente 3x3 cm. Eso debería ser aproximadamente 55 gramos (sin considerar los agujeros).
@SvB Esta es una gran inercia. Sin embargo, un pequeño desequilibrio podría hacer que el motor pierda pasos, ha combinado un motor pequeño con un volante grande. Este es el principal problema.
Mirando un poco más los números, tendría que estar de acuerdo contigo. Sin embargo, he tenido 2 ejecuciones exitosas en este momento, acelerando a la velocidad máxima en 6,4 segundos (cambiando la velocidad cada 0,1 segundo), después de lo cual 2 fallaron más y una quinta tuvo éxito nuevamente. Al mismo tiempo, no he tenido una sola carrera exitosa mientras aceleraba más de 32 segundos (cambiando la velocidad cada 0.01 s). Simplemente no puedo entender por qué este escenario mucho más fácil fallaría más a menudo. (Además, conozco prototipos similares en los que este problema no parece existir). No digo que no te crea, solo estoy sorprendido/confundido :)
¿A qué está ajustado el limitador de corriente de la placa del controlador? Solo 10 ms para "establecerse" en una nueva frecuencia suena difícil dado el hecho de que pigpio no "coincidirá" con los patrones de pasos, lo que puede conducir por casualidad a una situación de "pulso de paso en el momento equivocado".
@ChristianB. A su máximo, 750mA. Pensé que esos 10 ms deberían estar bien siempre que el cambio en la frecuencia fuera lo suficientemente pequeño y preferible a tiempos de establecimiento más largos donde se realiza un paso más grande. Por supuesto, también son posibles tiempos más largos y pequeños pasos, pero eso conduciría a minutos de aceleración. Veré si puedo jugar un poco más y encontrar un punto óptimo, aunque hasta ahora los resultados no han sido muy confiables: las configuraciones que funcionarían con una tasa de éxito del 90% un día, podrían fallar constantemente al día siguiente o viceversa .
PD: ¿SJ2 está cerrado o abierto? Si está abierto, VCC debe ser de 5 V, lo que no coincidiría con los RPis GPIO. Si está cerrado, VCC debe ser de 3,3 V según los esquemas. Sin embargo, la corriente máxima también debe limitarse (la hoja de datos indica: ITRIPmax = VREF / 8 * R_sense ).
En su lugar, probaría con una rampa "personalizada". algo como wait_times = (t1, t2, t3) speeds = (v1,v2,v3) for cur_wait_time, cur_speed in zip(wait_times, speeds)y luego jugar con los valores. descubra los "pasos más grandes posibles para la velocidad mientras busca un tiempo de espera decente"
Cambiar la velocidad en pasos no es el método ideal. Un cambio instantáneo en la velocidad exige un pico en la aceleración. Realmente quieres una aceleración constante. Los microcontroladores pueden lograr esto con temporizadores, en lugar de PWM como está usando el RPi.
¿Has mirado los pulsos en un alcance? Si los pulsos no están sincronizados cuando cambia de velocidad a través de PWM, podría tener 2 pulsos demasiado juntos. Esto podría ser aleatorio y explicar su comportamiento inconsistente. La mayoría de los osciloscopios tienen la opción de disparo por pulsos que puede buscar en este caso.
Intente eliminar los comandos printf dentro de los bucles.
@Mattman944: Estoy jugando con formas de onda personalizadas con perfiles de aceleración más regulares (cuando tengo tiempo...) pero hasta ahora no he tenido éxito. ¡Aunque no he dejado de intentarlo! No he mirado con un alcance, esta configuración está en casa y solo tengo un alcance en mi lugar de trabajo que rara vez visito hoy en día. Eliminé los comandos printf que lo mejoraron un poco, pero no mucho.
@ChristianB. Tuve que verificar, pero Sj2 está abierto, es decir, VCC es de 5 V y se debe alcanzar la corriente máxima. El VCC es de 5V (según lo regulado en la propia placa a partir de su voltaje de entrada de 24V), pero estoy de acuerdo en que la salida RasPi PWM será de solo 3,3V. Sin embargo, dado que es solo PWM ('datos', no 'potencia'), ¿debería importar eso ya que claramente se está registrando?
De acuerdo con la hoja de datos, el nivel de entrada debe ser de al menos 0,7 x VCC para registrarse como alto. Para VCC = 5 -> 3.5V que está por encima del máximo de RPi. Además, la salida del RPi probablemente sean niveles CMOS de 3,3 V. Es decir, solo "necesita" llegar a VDD - 0.4 = 3.1V para "cumplir" su nivel de salida. Esto es especialmente importante para una conmutación más rápida y un entorno ruidoso.

Respuestas (1)

O su motor paso a paso no entrega suficiente torque para seguir tal rampa o la corriente es demasiado pequeña para este motor. Solución: aumente la rampa de aceleración/desaceleración y verifique la configuración de corriente de salida de la placa del controlador.

T = j α

El par requerido para acelerar la masa de inercia en el ángulo de aceleración especificado. Si la aceleración requerida es demasiado alta, entonces el motor paso a paso se desincroniza y pierde pasos.

Otro aspecto es el par VS. características de velocidad

Sanyo Denki

ingrese la descripción de la imagen aquí

A velocidades más altas, el par cae. El punto de inflexión depende de la constante de voltaje del motor y del voltaje de la fuente de alimentación.

EDITAR:

ingrese la descripción de la imagen aquí

La combinación motor/carga actúa como un péndulo de torsión. La combinación de la inercia del rotor y la carga con un eje forma un sistema oscilante. Cuando hace girar el motor con cualquier desequilibrio del volante, en realidad excita el sistema, una vez que se alcanza la resonancia, su motor no puede sostener este par de ondulación.

NOTA para su generación de rampa:

d Ω d t = α

Si cambia el punto de ajuste de velocidad en pasos, eso teóricamente significa una aceleración ilimitada. Debe actualizar el PWM lo más rápido posible con pequeñas cantidades:

límite Δ T 0 Δ Ω Δ T = d Ω d t = α C o norte s t

Vea el método para crear un PWM que cambia continuamente: cómo generar una rampa de frecuencia suave

Actualizaré la publicación con información, demasiado para un comentario.
El método PWM para generar una rampa de frecuencia suave es exactamente lo que he estado intentando. Sin embargo, encontré algunas barreras porque subir a 32000PPS en el transcurso de unos segundos requiere muchos pulsos, más de los que podría caber en una sola ola o incluso en una cadena de olas. Todavía estoy tratando de averiguar si alcancé la limitación de ese método o si me faltan las habilidades adecuadas :)