Diseño de software de controlador de motor

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

  • La placa de hardware consta de un AVR atmega168 que funciona a 16 MHz.
  • Impulsado por dos motores scooter de 24v con codificadores 256 CPR
  • Los motores giran aproximadamente a unas 4700 RPM y tienen una relación de transmisión de 51,56:1

Hasta ahora puedo leer la dirección del codificador y el conteo de ticks. Pero no tengo idea de cómo convertir esto en velocidad. Y eventualmente un controlador PID. También quiero poder rotar el robot en un ángulo determinado. ¿Puede alguien por favor ayudarme a empezar?

Actualmente tengo problemas para encontrar un cálculo de temporizador adecuado para esto.

bueno .. puedes diferenciar la posición para obtener velocidad; si mide el ángulo, digamos, 50 veces por segundo, entonces sabe cuánto gira en 1/50 de segundo, por lo que 50 veces serían grados (o cualquier unidad angular que use) por segundo.
cambio en el conteo/ángulo con el tiempo?
¿Los codificadores están antes o después de las cajas de cambios? (Presumiblemente antes, pero...)
por favor divida en preguntas específicas separadas
Para un controlador PID: es posible que desee leer este par de entradas de blog que escribí: Embeddedrelated.com/showarticle/121.php

Respuestas (3)

Gracias a todos por los útiles comentarios.

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

A través de dos interrupciones (para cada codificador) calculé cuántos impulsos del codificador se acumularon en un intervalo de tiempo determinado. El intervalo que utilicé fue de 10 ms y esto se logró mediante el uso de la función de comparación de temporizador en el temporizador 1 de la mcu AVR. Los pulsos del codificador se calcularon tomando la diferencia de los pulsos del codificador anteriores y los pulsos actuales. Esto 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 interfaz gráfica de usuario simple de MATLAB para graficar el SP, PV de la respuesta de paso del controlador PID. Así es como sintonicé manualmente el controlador PID. Puede que no sea la mejor manera, pero ciertamente la forma más sencilla que se me ocurrió para ajustar el controlador.

Lo documentaré 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.

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. Si mi memoria no me falla, 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 restablecer el contador del codificador (b) escribir una rutina de servicio de interrupción (ISR) que se llama cuando finaliza el temporizador, reinicia el temporizador y calcula la velocidad angular. (c) Escriba otro ISR que sea activado por el tic de salida del codificador y que incremente un contador de tic global. (d) en el temporizador ISR usted sabe el tiempo transcurrido desde la última llamada desde que inicializó el temporizador que especificó esto. Tiene el número de tics del codificador desde la última llamada ISR del temporizador. Por lo tanto, puede calcular los ticks por unidad de tiempo. Debe saber a partir de 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.

Esto le da 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 forma de hacerlo. Puedo imaginar otros. Sin embargo, encontré que este algoritmo funcionó bien para mí antes.

Esto va a ser bastante complicado de hacer para dos motores, ya que tiene que ver dos canales de codificador por motor. No es imposible, pero una codificación muy cuidadosa para asegurarse de que no se pierda ninguna transición de ningún canal del codificador en ninguno de los motores (es decir, tiene 4 cosas para ver los eventos, y si bien hay correlación entre los canales no hay ninguno entre los motores). Habría alguna tentación de darle a cada motor su propio microcontrolador o usar un chip contador de cuadratura para capturar la retroalimentación (o hacer uno propio en un CPLD barato).

Dado que desea poder girar ángulos precisos, presumiblemente mediante la rotación diferencial de las dos ruedas, consideraría hacer un par de controladores de posición en lugar de controladores 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 con signo (de al menos 16 bits, pero probablemente 24 o incluso 32) para agregar a la posición deseada que busca cada controlador.

En un nivel superior, tendría un planificador de movimiento, que lo usaría periódicamente para actualizar las posiciones deseadas. Cuando te mueves a una velocidad fija, solo emites un comando para otros n pasos cada m milisegundos, cuando aceleras o ralentizas, lanzas menos. Para activar le envías un número positivo a uno y uno menos positivo (o en el acto, 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.