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.