Proyecto Final – Medición de Inclinación 0.0.1
Este proyecto utiliza la placa NUCLEO-STM32F446RE y permite detectar y visualizar en tiempo real la inclinación mediante el sensor MPU-6050.
Cargando...
Buscando...
Nada coincide
Referencia del archivo sys_sm.c

Máquina de estados principal del sistema. Más...

#include "sys_sm.h"
#include "FreeRTOS.h"
#include "cmsis_os.h"
#include "dev_LCD.h"
#include "mpu6050.h"
#include "ds3231.h"
#include "mpu_math.h"
#include "dev_gpio_cfg.h"
#include "dev_uart.h"
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

Estructuras de datos

struct  SM_Handler
 Estructura de control que contiene todas las variables de la SM principal. Más...
struct  Boot_Status
 Estructura utilizada en el proceso de inicialización de dispositivos. Más...

defines

#define SAMPLE_PERIOD_MS   100
 Configuración del ciclo de muestreo y actualización del sistema.
#define PERIOD_100MS   pdMS_TO_TICKS(100)
#define PERIOD_1S   pdMS_TO_TICKS(1000)
#define UART_REFRESH_DIV   5
#define ALPHA   0.2f /* Filtro utilizado para el calculo del angulo*/
#define STR_LENGTH   DEV_LCD_COLS + 1 /* 16 Caracteres del LCD + \0 */
#define BOOT_MAX_TRIES   3 /* Numero de intentos de inicialización por periférico */
#define RTC_YEAR   25
#define RTC_MONTH   10
#define RTC_DATE   15
#define RTC_DAY   3
#define RTC_HOUR   14
#define RTC_MIN   30
#define RTC_SEC   0

Enumeraciones

enum  Device_Init_Stage {
  DEV_INIT_LCD = 0 , DEV_INIT_RTC , DEV_INIT_MPU , DEV_INIT_COMPLETE ,
  DEV_INIT_ERROR
}
 Estado de inicialización de periféricos durante el arranque del sistema.

Funciones

HAL_StatusTypeDef SM_InitOS (void)
 Crea e inicializa la tarea principal de la máquina de estados, utilizando el FreeRTOS proporcionado por el CubeMX.
void SM_Iter (void *argument)
 Máquina de estados principal del sistema.

Descripción detallada

Máquina de estados principal del sistema.

Esta SM se encarga de coordinar todo el flujo del dispositivo: arranca los periféricos (LCD, RTC, MPU6050), realiza las lecturas periódicas y muestra la información tanto en pantalla como por UART. Además, controla el parpadeo del LED según el ángulo de inclinación detectado.

Ciclo principal (≈100 ms):

  1. Lee los sensores.
  2. Calcula el ángulo de inclinación.
  3. Ajusta la frecuencia del LED según el ángulo.
  4. Actualiza la hora y el ángulo en LCD y UART.

Flujo de estados: ST_INIT ↓ ST_READ_SENSORS → ST_UPDATE_LED → ST_UPDATE_UART → (vuelve a leer)

Autor
Matías Durante
Versión
1.0
Fecha
2025

Documentación de «define»

◆ SAMPLE_PERIOD_MS

#define SAMPLE_PERIOD_MS   100

Configuración del ciclo de muestreo y actualización del sistema.

  • El loop principal corre cada 100 ms (PERIOD_100MS).
  • Se lee la información del RTC y se actualizan los valores del LCD cada 1 segundo.

Documentación de funciones

◆ SM_InitOS()

HAL_StatusTypeDef SM_InitOS ( void )

Crea e inicializa la tarea principal de la máquina de estados, utilizando el FreeRTOS proporcionado por el CubeMX.

Valores devueltos
HAL_OKsi la tarea fue creada correctamente.

◆ SM_Iter()

void SM_Iter ( void * argument)

Máquina de estados principal del sistema.

Tarea que ejecuta la máquina de estados.

Estados:

  • ST_INIT: Inicializa periféricos. Si inicializan correctamente, se pasa al estado ST_READ_SENSORS; En caso de falla luego de los reintentos, se pasa al estado ST_ERROR.
  • ST_READ_SENSORS: Lee la información del MPU6050, filtra el ángulo y pasa a ST_UPDATE_LED.
  • ST_UPDATE_LED: Ajusta el periodo de parpadeo según el ángulo; pasa a ST_UPDATE_UART.
  • ST_UPDATE_UART: Envía hora y ángulo por UART; vuelve a ST_READ_SENSORS.
  • ST_ERROR: Muestra un mensaje de error en el LCD y reinicia el MCU.
  • RTC: Actualiza el LCD cada 1 s con hora y ángulo.
  • LED: Parpadea según la inclinación calculada.