Práctica 3: Documentación


Problema:

¿Cómo hacer que el robot pueda moverse a diferentes velocidades? ¿Cómo lograr que la velocidad sea independiente de las características del robot (peso, tipo de motores, radio de la ruedas, etc...)?. Necesitamos añadir CONTROL.

Hasta ahora, el robot lo hemos controlado de manera “binaria”. Los motores sólo podían estar en dos estados: encendidos (a máxima velocidad) y apagados (velocidad 0).

A parte de la “brusquedad” de movimientos, el consumo instantáneo de corriente es muy elevado (para que ambos motores pasen de velocidad 0 a la máxima, se requiere mucha energía instantánea). Esto se podría evitar haciendo que el robot acelerase poco a poco.

El objetivo de esta práctica es realizar un control de velocidad de tipo PI (Proporcional-Integral) para solucionar estos problemas.

Arquitectura propuesta:

El control se realizará desde el PC. En el robot se ejecutará un servidor genérico ampliado, que incluirá los servicios del TMA y LT para establecer la tensión media aplicada a los motores y leer las transiciones transcurridas desde la última lectura.

El cliente del PC debe tener acceso a los dos nuevos servicios TMA y LT. Esto se puede implementar mirando las fuentes de la librería libstargate, en la que se implementan los servicios ping, identificación, load y store. Se recomienda partir de estas fuentes para crearse el cliente (no hace falta crear una librería con los nuevos servicios, directamente se puede implementar el cliente a partir de las fuentes de la libstargate).

PWM: Cómo mover los motores a diferentes velocidades:

Desde el microcontrolador los motores del robot se controlan usando 2 bits. Según el valor que tengan, cada motor estará parado, moviéndose hacia adelante o hacia atrás. Ahora nos interesa que se pueda mover hacia adelante pero a diferentes velocidades.

Para conseguirlo se utiliza la técnica del PWM (Pulse Width Modulation, Modulación por anchura de pulso). Los motores tienen inercia y sólo responden al valor medio de la señal que se les esté aplicando. Mediante el PWM sólo se activan los motores durante un cierto tiempo, y el resto del tiempo se apagan. Es decir, que sólo durante un cierto tiempo se les inyecta energía. Si esto se hace a una frecuencia lo suficientemente alta, los motores sólo responderán al valor medio de la energia inyectada.

Supongamos que tenemos un motor como el siguiente, en el que uno de los cables está conectado a masa (0 voltios) y el otro a la señal de alimentación, que sólo puede tener 5 ó 0 voltios:

Una señal de PWM tiene esta pinta:

El valor medio de la tensión se calcula: Vm=Ton/T, siendo Ton el tiempo que la señal está a nivel alto y T es el periodo de la señal (Ton + Toff). En el ejemplo de la señal anterior, el valor medio es de 2.5v. Si se aplica al motor, se moverá exactamente igual que si se le aplicase una tensión de 2.5v. El motor estará funcionando al 50% (sólo recibe el 50% de la energía total).

En la siguiente figura se puede ver una señal PWM en la que el motor funciona al 25%. Sólo el 25% del tiempo se inyecta energía al motor. El valor de la tensión media es ahora de 1,25v.


Simplemente generando una señal PWM de periodo fijo (T fijo, por ejemplo a 25ms) y variando la anchura del pulso (Ton) se consigue que la tensión media pueda tener cualquier valor comprendido entre 0 y 5v. Y así se puede cambiar la velocidad del motor.


¿Cómo generar una señal de PWM desde el micro 6808?


Utilizaremos el temporizador que lleva incorporado el 6808. Hay que medir dos tiempo. El periodo de la señal PWM (T) y el tiempo que está a 1 (Ton).

El temporizador del 6808 es un registro de 16 bits que se incrementa con una señal de reloj cuyo periodo es también modificable. Este contador comienza en 0000h y cuando llega a FFFFh genera una interrupción de overflow y vuelve al comienzo (0000h).

Este “tope máximo” se puede cambiar en el registro TMOD. Es decir, se puede establecer un módulo diferente. Por ejemplo, si se pone como módulo el valor 8000h, cada vez que el contador alcance este valor, generará la interrupción de overflow y volverá al valor inicial 0000h.

Además, se puede emplear el registro del canal 0 (TCH0) para generar interrupciones cada vez que el contador llega a ese valor. Si en el ejemplo anterio se establece un valor de 4000h para TCH0, cuando el contador lo alcance generará una interrupción del canal 0 y seguirá contando hasta llegar al valor 8000h, donde se lanzará la interrupción de overflow y se volverá al comienzo.

Existe un registro del canal 1 que hace lo mismo, y que es independiente del anterior (TCH1), lo que permite generar la interrupción del canal 1 cada vez que el contador alcance ese valor.

En esta figura se muestran gráficamente los registros del canal 0 y 1 y el registro del módulos, con valores de 4000h, 6000h y 8000h:


El contador comienza desde 0 y se va incrementando con cada tic de reloj. Cuando alcanza el valor 4000h se genera la interrupción del canal 0. Continúa contando. Cuando llega a 6000h provoca la interrupción del canal 1. Continúa contando. Al llegar al valor de 8000h se genera la interrupción de overflow y comienza a contar otra vez desde 0.

Utilizando estas interrupciones es muy sencillo generar dos señales de PWM, una para cada motor. Lo único que hay que hacer es lo siguiente:

Lo mismo se haría para generar el pwm para el otro motor. Aquí se pueden encontrar ejemplos de manejo de las interrupciones:


Controladores PID

En la página Mundobot, de Alejandro Alonso, se puede leer un artículo muy interesante sobre el control de motores utilizando un PID.



[Página principal del laboratorio]

Juan González Gómez, 2004,2005

Se conceden permisos para copiar, distribuir y modificar la información contenida en esta página siempre y cuando se mantenga esta nota

Última modificación: 27-Abril-2005