-
Notifications
You must be signed in to change notification settings - Fork 0
Programación_2012
Para controlar los motores, usamos la biblioteca lib_pwm armada por otros integrantes del Club. La misma abstrae el uso de las salidas PWM del ATMega8, para poder manejar la velocidad y sentido de los motores con mayor facilidad.
El código utiliza una máquina de estados, originalmente pensada para una estructura de 3 sensores. Se puede ver en esta imagen: source:"/Otros/Maquina de estados.png@92". La estructura permitía usar un cuarto sensor para detectar el cambio de recta a curva (usado en las Competencias de Bahía Blanca), que eventualmente se convirtió en un sensor más del arreglo.
En la EEPROM (invocada con la macro PROGMEM) se guarda una tabla de doble entrada con todas las posibles combinaciones de sensores y estados, donde la combinación de grupo de sensores y estado actual determina el siguiente estado. Para cada estado existe una función que cambia la velocidad y sentido de los motores. En memoria existe otro arreglo en donde se guardan punteros a estas funciones, para llamarlos de manera genérica en el bucle principal. Este último tiene una implementación muy sencilla (aquí mostrada resumida):
while (1) {
estado_sensores = ESTADO_SENSORES; // macro que obtiene el valor de cada pin del micro
nuevo_estado = transiciones[estado_actual][estado_sensores]; // obtiene el valor de la tabla
if (nuevo_estado != ST_SIN_CAMBIOS) {
estado_actual = nuevo_estado;
(*funciones[estado_actual])(); // llamada a cada función, mediante un puntero
}
}
La tabla de posibles transiciones puede observarse desde el siguiente link: source:"tito/SRC/tito.c@78#L49".