Skip to content

04.02 Arquitectura del firmware

David Redondo edited this page Jun 3, 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 de un inversor, incluyendo periféricos, estados de operación, estructuras de datos para mediciones y referencias y lazos de control, entre otros. Esta encapsulación permite una gestión eficiente y organizada de la complejidad asociada al control de los dos inversores. Si el código estuviera escrito en un lenguaje como C++ se podría crear una clase en vez de una estructura, pero al estar programado en C, solamente se han podido mantener las buenas prácticas de la programación orientada a objetos.

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.

ERRORS.c/.h

Los archivos ERRORS.c y su correspondiente encabezado ERRORS.h proporcionan las funciones necesarias para establecer, leer y eliminar errores del sistema.

En este archivo, se define una enumeración llamada InverterError que representa los diferentes estados de error del inversor. Cada error se representa como un bit en un número entero sin signo de 32 bits (uint32_t).

Posición 0 1 2 3 4 5 6 7 8 9
Código
Ejemplo 0 0 0 0 0 0 1 0 0 1

Mapa de errores.

Por ejemplo, si los bits 0 y 3 están establecidos (valor binario 00 0000 1001 o valor decimal 9), significa que se ha producido un error en la etapa de potencia y otro de sobrecorriente.

En ERRORS.c, se implementan las siguientes funciones:

  • set_error: Esta función establece un error específico en el campo de errores de una estructura de datos. Toma como argumentos un puntero a la estructura de datos y el error a establecer.

  • clear_error: Esta función elimina un error específico del campo de errores de una estructura de datos. Toma como argumentos un puntero a la estructura de datos y el error a eliminar.

  • is_error_set: Esta función verifica si un error específico está establecido en el campo de errores de una estructura de datos. Toma como argumentos un puntero a la estructura de datos y el error a verificar.

Estas funciones proporcionan una interfaz para manejar los errores del sistema de manera eficiente y modular. Al representar los errores como bits en un entero sin signo, se optimiza el uso de memoria y se facilita la manipulación y el análisis de los errores individuales.

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.

Además, se crea un derating lineal para la corriente, que limita el valor máximo de la consigna:

  • calculate_derated_current: Calcula la corriente máxima basada en umbrales de temperatura.

  • derate_current_reference: Limita la referencia de corriente basándose en las temperaturas del motor y del inversor.

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 ejecuta 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.

Cabe destacar que este archivo hace uso de la librería PERGAMON del CITCEA-UPC, relacionando las diferentes partes del código con la simulación realizada anteriormente. Los bloques usados en la simulación contienen el mismo código que está escrito en estas librerías, agilizando mucho la integración.

PWM.c/.h

Los archivos PWM.c y su encabezado correspondiente PWM.h proporcionan funciones para controlar la salida PWM. Hace de capa de abstracción de los timers, ya que contiene funciones para habilitar y deshabilitar la salida PWM y para actualizar los ciclos de trabajo.

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.