MODBUS SLAVE MONITOR 1.0
Loading...
Searching...
No Matches
Procesamiento ADC y Cálculo RMS

Classes

struct  ADC_Sample
 Muestra del ADC con valor y canal asociado. More...
struct  RMS_FIFO
 Buffer circular para cálculo eficiente de RMS. More...

Functions

void IRAM_ATTR on_adc_data_ready ()
 Rutina de servicio de interrupción para conversiones ADC completadas.
void task_adquisicion (void *pvParameters)
 Tarea de adquisición de datos del ADC con manejo mejorado de multiplexor.
void task_procesamiento (void *pvParameters)
 Tarea de procesamiento de muestras y cálculo RMS.
int get_rms_history (int channel, float *output_buffer, int count)
 Obtiene el historial de valores RMS de un canal específico.

Variables

const float CONVERSION_FACTORS [NUM_CHANNELS]
 Factores de conversión específicos para cada canal ADC.
QueueHandle_t queue_adc_samples
 Cola de comunicación para muestras del ADC.
RMS_FIFO fifos [NUM_CHANNELS]
 Array de FIFOs para cada canal de medición.
float rms_history_ch0 [RMS_HISTORY_SIZE]
 Historial de valores RMS del canal 0.
float rms_history_ch1 [RMS_HISTORY_SIZE]
 Historial de valores RMS del canal 1.
float rms_history_ch2 [RMS_HISTORY_SIZE]
 Historial de valores RMS del canal 2.
volatile int rms_history_head = 0
 Índice de escritura para los historiales RMS.
SemaphoreHandle_t rms_history_mutex
 Mutex para protección de acceso concurrente a historiales RMS.
volatile bool adc_data_ready = false
 Flag de datos listos del ADC (ISR).
volatile uint8_t current_isr_channel = 0
 Canal actual en secuencia de muestreo (ISR).
const int FIFO_SIZE = 320
 Tamaño del buffer circular FIFO para cálculo RMS.
const int PROCESS_INTERVAL_MS = 1000
 Intervalo de procesamiento RMS en milisegundos.
const int RMS_HISTORY_SIZE = 100
 Tamaño del historial de valores RMS para cada canal.
const float CONVERSION_FACTOR = 0.618f
 Factor de conversión global (mantenido por compatibilidad).

Detailed Description

Resumen

Este módulo implementa la adquisición de señales analógicas mediante ADS1015 y el flujo completo de:

  • Adquisición de muestras ADC en modo round-robin entre 3 canales usando interrupciones.
  • Procesamiento en tiempo real con FIFOs circulares para cálculo eficiente de RMS.
  • Almacenamiento de historial de valores RMS en buffers thread-safe.
  • Aplicación de factores de conversión específicos por canal para calibración individual.

Estructura y componentes

  • Datos y configuración
    • ADC_Sample: estructura de muestra con valor y canal asociado.
    • RMS_FIFO: buffer circular con sumas acumulativas para cálculo incremental.
    • CONVERSION_FACTORS[]: factores de calibración específicos por canal.
  • Adquisición y procesamiento
    • queue_adc_samples: cola FreeRTOS para transferencia adquisición → procesamiento.
    • fifos[NUM_CHANNELS]: array de FIFOs circulares para cada canal.
    • rms_history_ch0/ch1/ch2: historiales independientes de valores RMS.
  • Tareas principales

API Principal

Uso

Resumen del flujo:

1) Inicialización ADC

  • Configuración del ADS1015: ganancia TWOTHIRDS (±6.144V), velocidad 3300 SPS.
  • Configuración de interrupción en pin ALERT para conversiones completadas.
  • Creación de cola queue_adc_samples con capacidad FIFO_SIZE.
  • Inicialización de mutex rms_history_mutex para protección de historiales.

2) Adquisición de muestras

3) Procesamiento RMS

  • task_procesamiento consume muestras de la cola en núcleo 0 con prioridad 3.
  • Actualización de FIFOs circulares con algoritmo incremental:
    • Mantenimiento de sumas: sum_x (∑x) y sum_x2 (∑x²).
    • Buffer circular con reemplazo automático al alcanzar FIFO_SIZE=320.
    • Cálculo de media: μ = sum_x / count.
    • Cálculo de varianza: σ² = (sum_x2 / count) - μ².
    • Valor RMS: √σ² con protección contra varianza negativa.

4) Gestión de historial

  • Cálculo RMS cada PROCESS_INTERVAL_MS=1000ms.
  • Almacenamiento en buffers circulares independientes por canal.
  • Protección thread-safe con rms_history_mutex.
  • Función get_rms_history() para extracción de últimos N valores.

5) Calibración por canal

  • Array CONVERSION_FACTORS[] con factores específicos:
    • Canal 0: 0.653f
    • Canal 1: 0.679f
    • Canal 2: 1.133f
  • Aplicación en dataUpdateTask para compensar diferencias de sensores.
  • Permite ajuste individual de rangos de medición y acondicionamiento.

6) Algoritmo RMS incremental

  • Eficiencia O(1) para inserción de nuevas muestras.
  • Sin necesidad de recorrer todo el buffer para cálculo.
  • Mantenimiento automático de estadísticas acumulativas.
  • Gestión robusta de desbordamiento en buffer circular.

Advertencias y mejores prácticas:

  • Verificar estabilidad de alimentación del ADS1015 para conversiones precisas.
  • Configurar pullups externos en líneas I2C si hay problemas de comunicación.
  • Validar conexión del pin ALERT antes de habilitar interrupciones.
  • Proteger acceso a historiales RMS con timeout apropiado en mutex.
  • Calibrar CONVERSION_FACTORS[] según características reales de sensores.
  • Monitorear latencia de procesamiento para evitar saturación de cola.
  • Verificar que FIFO_SIZE sea suficiente para ventana de análisis requerida.

Function Documentation

◆ get_rms_history()

int get_rms_history ( int channel,
float * output_buffer,
int count )

Obtiene el historial de valores RMS de un canal específico.

Extrae los últimos N valores RMS de forma thread-safe usando mutex. Los valores se devuelven en orden cronológico (más antiguo primero).

Parameters
channelNúmero de canal (0, 1 o 2).
output_bufferBuffer de salida para los valores RMS.
countNúmero de valores solicitados.
Returns
Número de valores efectivamente copiados.

◆ on_adc_data_ready()

void IRAM_ATTR on_adc_data_ready ( )

Rutina de servicio de interrupción para conversiones ADC completadas.

Se ejecuta cuando el ADS1015 completa una conversión y activa la línea ALERT.

◆ task_adquisicion()

void task_adquisicion ( void * pvParameters)

Tarea de adquisición de datos del ADC con manejo mejorado de multiplexor.

Gestiona la secuencia de conversiones ADC en modo round-robin entre canales. Implementa selección explícita de configuración de multiplexor para cada canal. Encola las muestras en queue_adc_samples para procesamiento posterior.

Parameters
pvParametersParámetros de la tarea (no utilizados).

Selección explícita de configuración de multiplexor por canal.

Mapeo directo de número de canal a constante de configuración del multiplexor ADS1015 para evitar errores de direccionamiento.

◆ task_procesamiento()

void task_procesamiento ( void * pvParameters)

Tarea de procesamiento de muestras y cálculo RMS.

Consume muestras de queue_adc_samples, las almacena en FIFOs circulares y calcula valores RMS periódicamente usando algoritmos incrementales eficientes. Actualiza el historial RMS de forma thread-safe.

Parameters
pvParametersParámetros de la tarea (no utilizados).

Variable Documentation

◆ CONVERSION_FACTOR

const float CONVERSION_FACTOR = 0.618f

Factor de conversión global (mantenido por compatibilidad).

Deprecated
Usar CONVERSION_FACTORS array para factores específicos por canal.

◆ CONVERSION_FACTORS

const float CONVERSION_FACTORS[NUM_CHANNELS]
Initial value:
= {
0.653f,
0.679f,
1.133f
}

Factores de conversión específicos para cada canal ADC.

Permite calibración individual por canal para compensar diferencias en sensores, acondicionamiento de señal o rangos de medición específicos.