PID y control de motores por PWM

Tengo un potenciómetro que da un voltaje analógico en el rango de 0-5V. Estoy considerando este POT como entrada de acelerador para motor. Si cambio la velocidad del potenciómetro, aumente y disminuya en función del voltaje procedente del potenciómetro. Estoy detectando el voltaje analógico del ADC de mi ATMEL mcu. Mi MCU está trabajando en 5V.

Digamos que la entrada analógica del POT es de 2V. Y asumo que la señal de comando es un motor fpr de 200 RPM. Mi motor tiene un sensor hall o/p desde el cual puedo leer la velocidad actual del motor, que es decir 120 RPM.

error = set_speed - current_speed  = 200 -120 = 80 RPM

Ahora aplico el PID a esta señal de error (80 RPM) obtendré algún controlador o/p.

La velocidad del motor se controla cambiando el ciclo de trabajo PWM (registro de 16 bits). Pero la gran pregunta es que PWM se usa para controlar la velocidad del motor. Ahora, cómo usar esta salida del controlador para cambiar el deber PWM de mi MCU

¿Cómo se relaciona PWM con la señal o/p del controlador para ajustar la velocidad?

Respuestas (2)

Al configurar un regulador PID, necesitará parámetros de escala, que traducen los números PID abstractos a las características del mundo real. De manera similar, también debe tener límites máximos y mínimos en P, I y D respectivamente, que también deben escalarse a las características de salida.

Tendrá un voltaje específico que es la velocidad máxima del motor. Este voltaje especificado debe traducirse a un ciclo de trabajo máximo del PWM. Tal vez sea 5V y luego el máximo es un ciclo de trabajo del 100%.

El valor de escala que debe usar para el regulador PID será este ciclo de trabajo máximo. La unidad serán los tics del temporizador que utiliza para generar el PWM.

También asegúrese de tener algún medio para sincronizar la lectura del sensor Hall con las actualizaciones de su regulador PID. No puede regular el sistema más rápido de lo que puede leer el sensor. Las lecturas también deben escalarse, probablemente también sea más fácil escalarlas al ciclo de trabajo, de modo que tenga la misma unidad en todas partes.

En cuanto a la programación, es mucho más fácil trabajar con este valor de tic del temporizador sin procesar de 16 bits que, por ejemplo, con voltios, porcentaje de trabajo, RPM, etc.

Supongo que la salida de su sensor es voltaje y su entrada es voltaje del potenciómetro, por lo que sería natural escalar todo a voltaje y hacer PID con voltaje como control, y luego traducirlo al ciclo de trabajo. Pero estoy de acuerdo contigo en su mayor parte.
mi sensor Hall o/p está en forma de pulsos.
usted dice ... Las lecturas también deben escalarse, probablemente también sea más fácil escalarlas al ciclo de trabajo, por lo que tiene la misma unidad en todas partes. ... lo que obtuve de esto es que la variable de entrada es la velocidad establecida y o/p es la velocidad real ... entonces quiere decir tener la misma unidad en todas partes ... la velocidad de entrada y la velocidad real aplicada al detector de errores deberían ser reducido al deber de PWM... en este caso, tengo el mismo deber de PWM de la unidad en todo el modelo de mi planta... ¿verdad?
@Haris778 No existe voltaje dentro del programa, el voltaje es una unidad artificial creada para que los humanos comprendan lo que está sucediendo. Dentro del programa, tiene una salida como un ciclo de trabajo sin procesar expresado en tics de temporizador, y la entrada como otro valor sin procesar expresado en bits de su resolución de ADC, o como lecturas de su sensor/unidad de temporizador, etc. No tiene sentido escalar tanto el la salida y la entrada a alguna unidad de voltaje artificial, que a nadie más que a los humanos les importa. A menos que tenga una pantalla que muestre el voltaje medido, no es necesario tenerlo en su programa.
@ user6363 Sí, supongo que tendrá pulsos por unidad de tiempo como entrada. Muchos errores y confusión en este tipo de programas se originan en programadores que usan diferentes unidades por todas partes y toman decisiones irracionales como "oh, pero esto será 3.3V y hay un decimal, así que debo usar números flotantes". Así es como piensan los programadores de PC. Los programadores integrados deben estar más cerca del metal.
Estoy de acuerdo con usted, pero traté de explicar desde el punto de vista del control automático. Sé que en MCU el voltaje es solo una unidad artificial, pero creo que es más fácil entender cómo la velocidad está relacionada con el voltaje y el voltaje con el ciclo de trabajo.
¿Es correcto, por favor sugiera?
@Lundin Aso si tomo la variable i/p y o/p de interés como servicio PWM, entonces en ese caso el gráfico de respuesta de mi sistema (sobreimpulso, oscilación, respuesta de estado estable) será en términos de servicio PWM, no en términos de velocidad. ?? ¿Cómo proceder... por favor sugiera?

El período de ciclo de trabajo completo le dará la máxima velocidad y el ciclo de trabajo cero no le dará ninguna rotación. Su error también puede ser 0 y el valor máximo cuando desea la velocidad máxima y el motor no gira. El ciclo de trabajo completo es igual al rango completo de CC a 5 V, el ciclo de trabajo de medio período es igual a 2,5 V y así sucesivamente. Debe realizar la conversión del voltaje que obtiene como salida en su cálculo de PID al ciclo de trabajo. Por ejemplo, si la salida de PID es de 1 V (en el rango de 0 a 5 V), su ciclo de trabajo debería ser de 0,2. Espero que esto ayude.

está diciendo ... Debe realizar la conversión del voltaje que obtiene como salida en su cálculo de mi PID al ciclo de trabajo. ... pero mi salida del cálculo PID es la diferencia de velocidad ... ¿algo que esté diciendo sobre el voltaje?
Estoy aplicando PID en el comando de entrada de velocidad - velocidad real del motor... entonces, ¿cómo es que el o/p del controlador pid será un voltaje?
La entrada de su PID es un error de velocidad (¿expresado en qué unidades, rpm?) Si ese es el caso, entonces necesita asignar valores a la velocidad máxima como ciclo de trabajo completo y velocidad cero a sin rotación. Y debido a que el voltaje depende linealmente del ciclo de trabajo y la velocidad del motor depende linealmente del voltaje, lo tiene todo. Si consideramos el sistema como LTI.
Es muy importante que utilice la misma unidad en todas partes. Si habla de RPM en una respiración, ciclo de trabajo en la siguiente respiración y voltaje en la tercera respiración, no logrará más que confusión. Elija una unidad al unísono y utilícela durante todo el programa. El voltaje no parece intuitivo, porque es solo un paso intermedio entre el ciclo de trabajo de PWM expresado en tics del temporizador y la rotación del motor, expresada en RPM.
por lo que quiere decir encontrar el valor promedio (ya que sé que en el trabajo máximo lo que es RPM y en el trabajo mínimo de 0 RPM también es cero) digamos para 1 RPM cuánto debe ser el valor del registro del ciclo de trabajo ... entonces, como sé, el error resulta ser 80 RPM, por lo que en este caso, aumente el valor del registro de servicio en 80 * (valor digital del servicio para 1 RPM) ... ¿verdad?
Su PID no es lineal (hay P, I y D), por lo que no solo aumenta el ciclo de trabajo en 80 si el error es 80.
@ Haris778 ¿Esta unidad no depende de la carga del motor entre PWM y la velocidad del codificador? Solo sería cierto para una carga dada.