Propósito del filtro de segundo orden para procesar la medición de temperatura

1

Por favor, perdóneme si esta es una pregunta muy básica o tonta, pero agradecería alguna ayuda. Estoy trabajando en el código de otra persona y he encontrado algunas líneas que se han descrito como un filtro de segundo orden. Mi experiencia no está en la electrónica, por lo que no estoy realmente seguro de qué es un filtro de segundo orden o qué intenta hacer el código. Me pregunto si alguien puede ayudar a explicar el siguiente código?

setpoint_error = temperature_setpoint * FILTER_TERM_A - high_resolution_temperature_setpoint;
filtered_setpoint_error = filtered_setpoint_error + (setpoint_error - filtered_setpoint_error) / FILTER_TERM_A;
high_resolution_temperature_setpoint = high_resolution_temperature_setpoint + filtered_setpoint_error / FILTER_TERM_B;

Muchas gracias por tu ayuda.

* ACTUALIZADO EL 2018-09-18 *

A continuación hay algunas líneas adicionales para ayudar a poner el código anterior en contexto.

#define INITIAL_TEMPERATURE 80
#define TEMPERATURE_SCALE 100
#define FILTER_TERM_A 512
#define FILTER_TERM_B 1024

static int32_t high_resolution_temperature_setpoint = INITIAL_TEMPERATURE * TEMPERATURE_SCALE * FILTER_TERM_A;
static int32_t blown_air_temperature = 12 * TEMPERATURE_SCALE;
static int32_t blown_air_temperature_error = 0L;
static int32_t blown_air_kP = 2L;
static int32_t blown_air_kI = 100L;
static int32_t blown_air_PID_speed = 0L;

void temperature_100ms_task()
{
    static int32_t filtered_setpoint_error;
    static int32_t blown_air_integrator_value = 0L;
    int16_t temperature_setpoint = 100;
    int32_t setpoint_error;
    int32_t blown_air_extrapolation_offset = get_BA_extrap_offset();

    /* Code that I would appreciate help understanding */
    setpoint_error = temperature_setpoint * FILTER_TERM_A - high_resolution_temperature_setpoint;
    filtered_setpoint_error = filtered_setpoint_error + (setpoint_error - filtered_setpoint_error) / FILTER_TERM_A;
    high_resolution_temperature_setpoint = high_resolution_temperature_setpoint + filtered_setpoint_error / FILTER_TERM_B;

    /* PID control - using temperature to adjust fan speed */
    blown_air_temperature_error = blown_air_temperature + blown_air_extrapolation_offset - high_resolution_temperature_setpoint / FILTER_TERM_A;
    blown_air_integrator_value += blown_air_temperature_error * blown_air_kI;
    blown_air_PID_speed = blown_air_temperature_error * blown_air_kP + blown_air_integrator_value;
}

El código anterior se ha extraído de un archivo mucho más grande pero, con suerte, se ha incluido para poner el primer bloque de código en contexto. Gracias de nuevo.

    
pregunta Peter

1 respuesta

2

Por sí mismo, el código que exhibes no me parece un filtro de segundo orden. Al menos no en el sentido de que esto involucre los comportamientos únicos asociados con ellos: la capacidad de ser sub-humedecido, sobre-humedecido o críticamente amortiguado; No más, ni menos.

Por supuesto, si esto es parte de PID (o algo similar), entonces puedes tener esos tres comportamientos. Pero no se muestra el resto del código. Sólo esas tres líneas. No quiero que se confunda con la idea de que esas tres líneas, por sí mismas, representan un filtro de segundo orden. Sin embargo, si esto es parte de un bucle de control PID y un plant externo bajo control, entonces, por supuesto, puede ser un comportamiento de segundo orden. Pero entonces esa es una pregunta diferente, también. Estas tres líneas por sí mismas no son de segundo orden.

Lo que veo es algo como esto:

$$ \ begin {align *} \ Delta & = T_ \ text {SET} - \ frac {\ Sigma} {A} \ tag {1} \\\\ \ Sigma_y & = \ frac {A-1} {A} \ Sigma_y + \ Delta \ tag {2} \\\\ \ Sigma & = \ Sigma + \ frac {\ Sigma_y} {B} \ tag {3} \ end {align *} $$

La primera línea es un simple cálculo temporal de un término de error de algún tipo. (En este caso, no puedo decir exactamente por qué un acumulador se está aplicando directamente en este cálculo de diferenciación. Solo puedo tomar nota de él). Tenga en cuenta también que ajusté el uso del factor FILTER_TERM_A en la primera ecuación. Por ahora, solo quería centrarme en que está sucediendo más que en los detalles de how está sucediendo .

La segunda línea es un acumulador. Dependiendo del valor de FILTER_TERM_A (arriba y más adelante como simplemente \ $ A \ $), el valor de este acumulador (o integrador) puede no tener ningún significado. Entonces, por ejemplo, si \ $ A = 1 \ $, entonces \ $ \ Sigma_y = \ Delta \ $ y no se acumula nada. Es solo el error, o \ $ \ Delta \ $. Pero a medida que \ $ A \ $ aumenta en valor más allá de \ $ 1 \ $, el acumulador comienza a funcionar y tiene un efecto creciente. Cuanto más grande sea \ $ A \ $, el less impactará \ $ \ Delta \ $ al ajustar el otro otro , \ $ \ Sigma \ $, y el impacto más que el acumulador \ $ \ Sigma_y \ $ tiene en él. Esta segunda ecuación, más que las otras, apunta el propósito de \ $ A \ $.

La tercera línea es probablemente la variable integradora global. El valor de FILTER_TERM_B (arriba y en lo sucesivo señalado simplemente como \ $ B \ $) determina el impacto que tiene el término de error general (donde el término de error puede ser fuertemente filtrado o no filtrado, dependiendo de \ $ A \ $ .) Si \ $ B \ $ es muy grande, entonces el término del integrador PID apenas se mueve, y no jugará un papel importante en el comportamiento del sistema de control de bucle cerrado. Sin embargo, si \ $ B \ $ es pequeño, entonces el integrador PID tiene un mayor impacto en lo que sigue (en el código que no proporcionó) y en el control general de circuito cerrado como un sistema completo.

Mi conjetura acerca de la razón por la cual se multiplica por \ $ A \ $ en su primera línea de código es más sobre el uso de variables de enteros, que mucho más. Si se hubiera usado el punto flotante, hubiera sido suficiente crear un multiplicador de \ $ \ frac {A-1} {A} \ $ y simplemente usar ese factor en la segunda ecuación en lugar de causarle problemas. Pero es solo una conjetura, ya que tampoco dijo nada sobre las declaraciones de variables.

    
respondido por el jonk

Lea otras preguntas en las etiquetas