polarimeter_software/User/app/tec_control.h
2025-09-30 10:37:23 +08:00

56 lines
1.8 KiB
C

/*
* @Author: mypx
* @Date: 2025-06-23 13:05:04
* @LastEditTime: 2025-09-25 13:13:20
* @LastEditors: mypx mypx_coder@163.com
* @Description:
*/
/***
* @Author: mypx
* @Email: mypx_coder@163.com
* @Date: 2025-06-23 13:05:04
* @LastEditors: mypx mypx_coder@163.com
* @Description:
*/
#ifndef __TEC_CONTROL_H__
#define __TEC_CONTROL_H__
#include "et_ema_filter.h"
#include "etk_pid.h"
#include <rtthread.h>
#include <stdbool.h>
#define EMA_FILTER_ALPHA 0.1
#define EXCEPTION_TEMPERATURE_DEF 45.0f // exception temperature value, control will not be performed if exceeded
#define TEC_CONTROL_PERIOD 1000 // temperature calculation period, unit ms
#define ADC_SAMPLE_PERIOD 500 // ADC sampling period, unit ms
// event flags for temperature control
#define TEC_CONTROL_START_EVENT (1 << 0) // start temperature control event
#define TEC_CONTROL_STOP_EVENT (1 << 1) // stop temperature control event
#define TEC_TEMP_UPDATE_EVENT (1 << 2) // target temperature update event
typedef struct
{
double acq_voltage; // acquisition and calculation voltage value
float target_temper; // target temperature value
float exception_temper; // exception temperature value, control will not be performed if exceeded
float cur_temper;
bool is_control; // whether temperature control is active
bool is_exception; // whether temperature is in exception state
et_integral_separation_pid_t pid;
rt_event_t control_event; // event object for temperature control
et_ema_filter_t ema_filter;
} tec_control_t;
int tec_control_init(tec_control_t *tec);
void tec_control_reset(void);
int tec_control_start(void);
int tec_control_stop(void);
float tec_get_target_voltage(float R);
#endif // __TEMPERATURE_H__