Diseño del software del controlador del motor

2

Tengo que diseñar un controlador PID para un robot de unidad diferencial.

  • La placa de hardware consiste en un AVR atmega168 que se ejecuta a 16mhz.
  • Impulsado por dos motores de scooter de 24 voltios con 256 codificadores de RCP
  • Los motores giran aproximadamente a 4700 RPM y tienen una relación de engranaje de 51.56: 1

Hasta ahora puedo leer la dirección del codificador y el conteo de tics. Pero no tengo idea de cómo convertir esto a velocidad. Y eventualmente un controlador PID. También quiero poder rotar el robot en un ángulo dado. ¿Alguien por favor me puede ayudar a comenzar?

Actualmente estoy teniendo problemas para calcular un temporizador adecuado para esto.

    
pregunta nixgadgets

3 respuestas

1

Gracias a todos por los comentarios útiles.

Logré lo que quería al implementar un controlador PID de velocidad simple.

A través de dos interrupciones (para cada codificador) calculé la cantidad de tics del codificador que se han acumulado en un intervalo de tiempo determinado. El intervalo que usé fue de 10 ms y esto se logró utilizando la función de comparación del temporizador en el temporizador 1 del AVR mcu. Las marcas de codificador se calcularon tomando la diferencia de las marcas de codificador anteriores y las marcas actuales. Luego se usó como la velocidad PV del controlador PID. La frecuencia de muestreo del controlador PID también se realizó a 10 ms. Solo para mantener las cosas simples.

Escribí una sencilla GUI de MATLAB para representar gráficamente el SP, PV de la respuesta al escalón del controlador PID. Así es como sintonicé manualmente el controlador PID. Puede que no sea la mejor manera, pero sin duda es la forma más sencilla que se me ocurre para ajustar el controlador.

Documentaré esto en la publicación de mi blog cuando tenga la oportunidad y pondré un enlace en esta publicación para que sea útil para cualquiera.

    
respondido por el nixgadgets
0

Tu pregunta es un poco ambigua. ¿Está preguntando cómo usar un temporizador en el microcontrolador, o está preguntando cómo calcular la velocidad angular dada la cuenta de un codificador y el tiempo transcurrido dado por un temporizador?

El atmega168 debe tener al menos dos temporizadores en él. Si mi memoria me sirve correctamente, hay dos temporizadores de 8 bits y un temporizador de 16 bits. Estos son periféricos integrados en el micro que pueden ejecutarse en segundo plano, dejando la CPU de su micro libre para hacer otras cosas.

Una forma de hacer esto es: (a) Inicializar e iniciar el temporizador y reiniciar el contador del codificador (b) escribir una rutina de servicio de interrupción (ISR) que se llama cuando el temporizador finaliza, reinicia el temporizador y calcula el ángulo velocidad. (c) Escriba otro ISR que se active con la marca de salida del codificador y que incremente un contador de marca global. (d) en el ISR del temporizador usted conoce el tiempo transcurrido desde la última llamada desde que inicializó el temporizador que especificó. Tiene el número de tics del codificador desde la última llamada ISR del temporizador. Por lo tanto, puedes calcular las garrapatas por unidad de tiempo. Debería conocer por los detalles mecánicos de su robot el número de tics por unidad de ángulo de rotación de la rueda, por lo tanto, debería poder calcular la velocidad angular de la rueda. Reinicie el contador de ticks dentro del ISR del temporizador después de realizar el cálculo de la velocidad, de modo que la próxima vez que se llame al ISR del timer, tendrá el nuevo recuento de tics del codificador.

Esto le proporciona la velocidad angular promedio dentro del período del temporizador. Ajuste el período del temporizador para que funcione bien para su aplicación.

Esta es solo una manera de hacer esto. Puedo imaginar a los demás. Sin embargo, encontré que este algoritmo funcionó bien para mí antes.

    
respondido por el Dave.Mech.Eng
-1

Esto va a ser bastante difícil de hacer para dos motores, ya que tienes que mirar dos canales de encoder por motor. No es imposible, pero hay mucha codificación realmente cuidadosa para asegurarse de que no se pierda ninguna transición de ninguno de los canales del codificador en ninguno de los motores (es decir, tiene 4 cosas que observar para los eventos, y si bien hay una correlación entre los canales, no hay ninguno entre los motores). Habría cierta tentación de darle a cada motor su propio microcontrolador o usar un chip de contador en cuadratura para capturar la retroalimentación (o hacerla usted mismo en un CPLD barato).

Ya que quiere poder girar ángulos precisos, presumiblemente por la rotación diferencial de las dos ruedas, consideraría hacer un par de controladores de posición en lugar de un controlador de velocidad, cada uno de los cuales giraría su motor para igualar los conteos logrados a los conteos en un registro de posición deseado. Para simplificar las cosas, su interfaz de comando principal podría ser un número firmado (de al menos 16 bits, pero probablemente 24 o incluso 32) que se agregará a la posición deseada que está buscando cada controlador.

En un nivel superior, entonces tendría un planificador de movimiento, que periódicamente usaría para actualizar las posiciones deseadas. Cuando se mueve a una velocidad fija, simplemente emite un comando para otros n pasos cada milisegundos, cuando acelere o disminuya la velocidad, lance menos. Para convertir, envía un número positivo a uno y un resultado menos positivo (o para el momento, negativo) al otro. Conceptualmente, esto es lo mismo, independientemente de si se está comunicando entre bloques lógicos en un programa en un procesador o comandando procesadores esclavos.

    
respondido por el Chris Stratton

Lea otras preguntas en las etiquetas