Arduino pid dc motor position control

Arduino pid dc motor position control

Control de posición de un motor de corriente continua mediante un controlador pid

dec_position = (pin_state[8] * 256) + (pin_state[7] * 128) + (pin_state[6] * 64) + (pin_state[5] * 32) + (pin_state[4] * 16) + (pin_state[3] * 8) + (pin_state[2] * 4) + (pin_state[1] * 2) + pin_state[0];
Por ejemplo, si la consigna es 0 grados, el motor gira para alcanzarla. La rotación del motor se ralentiza a medida que su posición «ahora» se aproxima a 0 grados, pero el sistema no está libre de sobregiros. Por lo tanto, incluso 1 grado de rebasamiento causa el valor de error es -359 (punto de ajuste – posición actual) y el motor gira de nuevo para alcanzar la posición deseada.

Control de posición de un motor de corriente continua mediante un potenciómetro

En el post anterior recopilé información sobre una unidad de deslizamiento de cartuchos tomada de una vieja impresora de chorro de tinta. Según descubrí, la impresora utilizaba un motor de corriente continua común para mover los cartuchos en el eje X, sin embargo, con la adición de un codificador óptico con tira, los cartuchos podían realizar movimientos precisos. Por lo tanto, quiero interconectar esto con Arduino. La electrónica original de la impresora, como los controladores del motor, no sirvieron (circuitos integrados propietarios sin hojas de datos públicas).
Tuve que accionar el motor con un módulo de puente H L298N y para el codificador construí una PCB que sustituyó a la original utilizada en la impresora. El software no es tan sencillo como se puede pensar. Simplemente no puedo encender el motor hasta que la lectura del encoder sea igual a la posición deseada. Si el motor se detiene repentinamente, no se detendrá el bloque deslizante. Debido a la inercia, sigue moviéndose un poco, incluso con el motor cortocircuitado eléctricamente. El enfoque adecuado requiere un algoritmo de control PID (proporcional-integral-derivativo) que ajuste la velocidad del motor mediante PWM.

Control de posición en bucle cerrado de arduino

El código de manejo del codificador no es seguro por lo que puede no funcionar de forma fiable. Te sugiero que ignores todo lo que tiene que ver con los motores y los PIDs y que sólo consigas que la lectura del codificador funcione de forma fiable antes de intentar cualquier otra cosa. En mi opinión, la mejor manera de saber que está funcionando correctamente es imprimir el valor actual a través del puerto serie a intervalos regulares y confirmar que se actualiza con prontitud y precisión, y que no hay deslizamiento entre el valor del tick y la posición física del codificador.
Dado que la variable ‘tick’ se utiliza en un contexto de interrupción así como en el contexto principal, necesita ser declarada volátil. Como es más grande que un byte, necesitas suspender las interrupciones alrededor de los accesos a ella en el contexto principal para evitar que cambie mientras se accede a ella. El mejor enfoque es suspender las interrupciones, copiar la variable volátil a una variable local y volver a habilitar las interrupciones, de modo que éstas queden deshabilitadas durante el menor tiempo posible.
Creo que mi función Encoder que es para tener la información de donde estamos en el codificador óptico no era buena. Como es un codificador de cuadratura, he reescrito la función : attachInterrupt se dispara en un flanco ascendente del primer pin del codificador (conectado en el pin 2) y el tick del contador se incrementa si el segundo pin está BAJO y se reduce si está ALTO. Así que debe ser más correcto.

Control de posición de motor de corriente continua matlab simulink

He probado el método de Ziegler-Nichols para sintonizar el PID, así como el método de prueba y error, pero no he podido obtener ningún resultado aceptable. Puedo deshacerme de las oscilaciones sólo si pongo tanto Ki como Kd a cero. Pero la oscilación aparece tan pronto como aumento Ki. Intenté con Ki = 0.001 y todavía había oscilación.
Haz un poco de ingeniería y calcula cómo se ve el voltaje del motor versus el perfil de tiempo para un movimiento desde el punto de ajuste mínimo hasta el punto de ajuste máximo. Espero que puedas responder a tus propias preguntas una vez que veas lo que le estás pidiendo al motor y al sistema.
Estoy seguro de que esto se puede hacer. El posicionamiento casi funciona si pongo Ki y Kd a cero. Luego hay un poco de sobreimpulso que causa un poco de oscilación pero el motor se asienta en la posición correcta bastante rápido.
Parece que se trata de un problema de sintonía. Busqué diferentes métodos para sintonizar los controladores PID y pude encontrar Kp, Ki y Kd que funcionan. Son mucho más pequeños que los que obtuve con el método de Ziegler-Nichols.

Acerca del autor

admin

Ver todos los artículos