Skip to content

04.02 Arquitectura del firmware

David Redondo edited this page May 25, 2024 · 6 revisions

# Arquitectura del firmware

INVERTER.c/.h

El archivo INVERTER.c y su correspondiente encabezado INVERTER.h constituyen la implementación y la interfaz de la estructura de datos y las funciones asociadas a un inversor.

La principal funcionalidad de estos archivos es proporcionar una interfaz cohesiva y modular para la gestión de los inversores. La estructura InverterStruct definida en INVERTER.h encapsula todos los elementos necesarios para el funcionamiento del inversor, incluyendo periféricos, estados de operación, estructuras de datos para mediciones y referencias, lazos de control, entre otros. Esta encapsulación permite una gestión eficiente y organizada de la complejidad asociada al control de los inversores.

Un aspecto destacado de la implementación es la escritura de código modular y reutilizable, por ejemplo, las funciones se implementan de manera independiente de la configuración específica del hardware del inversor. Se generan dos estructuras globales InverterStruct independientes, inverter_left e inverter_right, para controlar cada uno de los inversores de forma independiente. Esta estrategia permite un control simultáneo de ambos inversores sin repetir ni una línea de código.

MOTOR.c/.h

El archivo MOTOR.c y su correspondiente encabezado MOTOR.h constituyen la implementación y la interfaz de las funciones y estructuras asociadas a los parámetros y constantes del motor.

La funcionalidad principal de estos archivos es proporcionar una interfaz modular para la gestión de los parámetros del motor. La estructura MotorParameters, definida en MOTOR.h, encapsula todos los parámetros de un motor eléctrico.

Un aspecto importante de la implementación es la inclusión de una estructura adicional, MotorConstants, dentro de MotorParameters, que almacena las constantes precalculadas relacionadas con el motor. Estas constantes se calculan en la función precalculate_motor_constants() y se utilizan en el cálculo de trayectorias para ahorrar algo de tiempo de ejecución.

Además, se proporciona una función de verificación de parámetros, check_motor_parameters(), que evalúa los valores de los parámetros del motor y realiza ajustes si se detectan errores o valores fuera de los límites especificados. Esta función garantiza que los parámetros del motor estén dentro de rangos seguros.

FSM.c/.h

El archivo FSM.c y su encabezado correspondiente FSM.h contienen la implementación y la interfaz de la Máquina de Estados Finitos (FSM) para controlar el inversor. La FSM gestiona el funcionamiento de un inversor a través de la ejecución de diferentes estados. Cada estado representa una etapa específica en el ciclo de funcionamiento del inversor y está asociado con un conjunto definido de acciones y condiciones de transición. El archivo FSM.c implementa funciones para gestionar cada estado.

Los cuatro estados implementados son:

  • Inicio (Startup): En este estado, se realizan las acciones de inicialización del inversor, como la configuración de periféricos y la detección de errores durante el arranque.

  • Reposo (Idle): El inversor está inactivo y espera órdenes para iniciar o detecta condiciones de error.

  • Funcionamiento (Running): El inversor está en pleno funcionamiento y se ejecuta el bucle de control principal.

  • Error (Fault): Se gestionan las acciones para detener el inversor y manejar las condiciones de error.

En cada estado, se describen las acciones realizadas y las condiciones que pueden provocar una transición a otro estado, como la detección de errores o cambios en las condiciones de funcionamiento del inversor.

MEASUREMENTS.c/.h

Los archivos MEASUREMENTS.c y su encabezado correspondiente MEASUREMENTS.h contienen la implementación y la interfaz para manejar las mediciones en el sistema.

En MEASUREMENTS.h, se definen algunas constantes relacionadas con ganancias y desplazamientos para corriente y voltaje, así como umbrales de falla para diversas condiciones del sistema. Además, se declaran las estructuras de datos necesarias para almacenar las mediciones de los sensores y los valores de retroalimentación.

Las estructuras definidas son:

  • Encoder: Estructura para la lectura del encoder, que almacena los valores de los canales A, B y Z, así como la velocidad angular eléctrica y la posición del rotor eléctrico.

  • Analog: Estructura para las mediciones de los sensores analógicos de cada inversor, es decir, las corrientes de fase y la tensión del bus DC.

  • Feedback: Estructura para los valores de retroalimentación, que contiene corrientes $d-q$, par calculado y velocidad medida.

En MEASUREMENTS.c, se implementan las funciones para manejar las mediciones, como la conversión de lecturas de ADC a medidas físicas, el cálculo de corrientes $d-q$ a partir de las mediciones de corriente de fase y el ángulo eléctrico, y la calibración de los offsets de los sensores de corriente.

REFERENCE.c/.h

Los archivos REFERENCE.c y su encabezado correspondiente REFERENCE.h proporcionan funciones para manejar la consigna de par de cada motor. En REFERENCE.h, se define una estructura de datos llamada Reference, que contiene los valores de consigna para las corrientes $d-q$ y el par.

Las funciones principales implementadas en REFERENCE.c son:

  • set_torque_direction: Esta función ajusta la dirección del par en función de la dirección deseada del motor.

  • saturate_symmetric: Esta función satura simétricamente un valor de referencia en función del valor máximo permitido.

  • limit_torque_to_prevent_overspeed: Esta función actúa como una saturación de par, reduciendo el par para limitar la velocidad máxima del motor.

  • handle_torqueRef: Esta función llama a las anteriores y las encadena para gestionar adecuadamente la consigna de par.

PCB_IO.c/.h

Los archivos PCB_IO.c y su encabezado correspondiente PCB_IO.h actúan como capa de abstracción del hardware. En PCB_IO.h, se definen macros para leer y controlar algunos GPIOs, así como enumeraciones y estructuras para manejar LEDs y direcciones de motores.

Las funciones principales implementadas en PCB_IO.c son:

  • handle_LED: Esta función maneja los modos de parpadeo de los LEDs basándose en el modo actual del LED y un contador de milisegundos.

  • handle_direction: Esta función lee el estado del interruptor de dirección (DIR) y actualiza las direcciones de los motores izquierdo y derecho en función de este estado.

  • enable_inverters: Esta función lee el estado de la cadena de shutdown del vehículo y habilita o deshabilita los inversores en función de este estado y de una habilitación externa por software.

CONTROL.c/.h

Los archivos CONTROL.c y su encabezado correspondiente CONTROL.h proporcionan funciones para el lazo de control de cada inversor. Las funciones principales implementadas en CONTROL.c son:

  • calc_current_reference: Esta función calcula las consignas de corriente $d - q$ de la misma manera que en las simulaciones de control. Se implementan las trayectorias utilizando las ecuaciones analíticas de las mismas.

  • calc_current_loop: Esta función calcula los lazos de corriente para los ejes $d$ y $q$.

  • saturate_voltage: Esta función satura la salida de los lazos de corriente para no exceder el voltaje máximo sintetizable.

  • calc_duties: Esta función calcula la transformada inversa de Park y los ciclos de trabajo utilizando SVPWM.

PWM.c/.h

Los archivos PWM.c y su encabezado correspondiente PWM.h proporcionan funciones para controlar la salida PWM. Las funciones principales implementadas en PWM.c son:

  • enable_PWM: Esta función habilita la salida PWM para el timer especificado.

  • disable_PWM: Esta función deshabilita la salida PWM para el timer especificado.

  • update_PWM: Esta función actualiza los ciclos de trabajo para los canales PWM.

CAN_e-Tech.c/.h

Los archivos CAN_e-Tech.c y su encabezado correspondiente CAN_e-Tech.h proporcionan funciones para manejar la comunicación CAN con el vehículo. Las funciones principales implementadas en CAN_e-Tech.c son:

  • handle_CAN: Esta función implementa la lógica para manejar mensajes CAN recibidos.

  • send_CAN_message: Esta función prepara y envía un mensaje CAN utilizando información de CAN1db.h, que recoge la estructura de todos los mensajes del bus de CAN al cual estará conectado el inversor.