-
Notifications
You must be signed in to change notification settings - Fork 5
04.02 Arquitectura del firmware
# Arquitectura del firmware
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.
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.
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.
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.
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
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
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.
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.
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.
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.
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 deCAN1db.h
, que recoge la estructura de todos los mensajes del bus de CAN al cual estará conectado el inversor.