150 lines
3.6 KiB
C
150 lines
3.6 KiB
C
|
/*
|
|||
|
* @Author: mypx
|
|||
|
* @Date: 2025-08-11 08:30:53
|
|||
|
* @LastEditTime: 2025-09-24 16:10:18
|
|||
|
* @LastEditors: mypx mypx_coder@163.com
|
|||
|
* @Description:
|
|||
|
*/
|
|||
|
#ifndef __PM_MEAS_H__
|
|||
|
#define __PM_MEAS_H__
|
|||
|
#include "et_goertzel.h"
|
|||
|
#include "et_zero_cross.h"
|
|||
|
#include "etk_pid.h"
|
|||
|
#include "etk_slope.h"
|
|||
|
#include "pm_common.h"
|
|||
|
|
|||
|
#define FZ_CALI_MAX_COUNT 10
|
|||
|
#define ZC_COUNT_STABLE_TIMES 5
|
|||
|
#define ZERO_POS_THRESHOLD 0.5f
|
|||
|
#define PID_TARGET_ZERO_POS_VAL 0.0f
|
|||
|
#define RUN_OFFSET_ANGLE_RPM (1000)
|
|||
|
|
|||
|
|
|||
|
#define FZ_UNKNOWN_STAGE_RPM 1000
|
|||
|
#define FZ_SATURATED_STAGE_RPM 1000
|
|||
|
#define FZ_WAVE_ENTER_STAGE_RPM 1000
|
|||
|
#define FZ_PREPARE_STAGE_RPM 1000
|
|||
|
#define FZ_FAST_CLOSE_STAGE_RPM 700
|
|||
|
#define FZ_PRECISE_ADJUST_MIN_RPM (0.6f * MOTOR_TO_ENCODER_FACTOR) // 0.6rpm->0.001
|
|||
|
|
|||
|
#define FZ_SATURATED_POWER_MAX 5.0f
|
|||
|
#define FZ_SATURATED_SLOPE_MAX 50.0f
|
|||
|
|
|||
|
|
|||
|
#define FZ_FAST_CLOSE_ENTER_FREQ_MIN 48.0f
|
|||
|
#define FZ_FAST_CLOSE_ENTER_FREQ_MAX 52.0f
|
|||
|
|
|||
|
#define FZ_PRECISE_ADJUST_LEAVE_POWER_MAX FZ_PRECISE_ADJUST_ENTER_POWER_MAX
|
|||
|
|
|||
|
#define FZ_PREPARE_LEAVE_SLOPE_MIN -100000
|
|||
|
#define FZ_PREPARE_LEAVE_FREQ_MIN 48.0f
|
|||
|
#define FZ_PREPARE_LEAVE_FREQ_MAX 52.0f
|
|||
|
|
|||
|
extern bool fsm_state;
|
|||
|
|
|||
|
typedef enum
|
|||
|
{
|
|||
|
TREND_UNKNOWN = 0, // 未知(首次调用,无历史数据)
|
|||
|
TREND_STABLE, // 稳定(无连续6次升/降,或当前值与上次相等)
|
|||
|
TREND_INCREASE, // 上升(连续6次大于上次值)
|
|||
|
TREND_DECREASE // 下降(连续6次小于上次值)
|
|||
|
} TrendStatus;
|
|||
|
#define TREND_MAX_CNT 20
|
|||
|
|
|||
|
typedef enum
|
|||
|
{
|
|||
|
ZF_UNKNOWN_STAGE = 0,
|
|||
|
ZF_SATURATED_STAGE,
|
|||
|
ZF_WAVE_ENTER_STAGE, // little magnitude 50hz wave detected
|
|||
|
ZF_PREPARE_ENTER_STAGE, // big magnitude 50hz wave detected
|
|||
|
ZF_FAST_CLOSE_STAGE, // near zero, fast close
|
|||
|
ZF_ZERO_STAGE, // zero found, and judgement next setup
|
|||
|
ZF_FAST_LEAVE_STAGE,
|
|||
|
ZF_PREPARE_LEAVE_STAGE, // ZF_PREPARE_ENTER_STAGE->ZF_WAVE_ENTER_STAGE or ZF_WAVE_ENTER_STAGE->ZF_SATURATED_STAGE
|
|||
|
ZF_WAVE_LEAVE_STAGE,
|
|||
|
ZF_STATE_MAX,
|
|||
|
} ZeroFindState;
|
|||
|
|
|||
|
typedef enum
|
|||
|
{
|
|||
|
PM_FSM_STOP = 0,
|
|||
|
PM_FSM_RUNNING,
|
|||
|
} FzFsmState;
|
|||
|
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
double last_val;
|
|||
|
uint8_t inc_cnt;
|
|||
|
uint8_t dec_cnt;
|
|||
|
} trend_handle_t;
|
|||
|
|
|||
|
typedef enum
|
|||
|
{
|
|||
|
STAGE_RESULT_NO,
|
|||
|
STAGE_RESULT_OK,
|
|||
|
STAGE_RESULT_UNDETERMINED,
|
|||
|
} StageResult;
|
|||
|
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
uint8_t is_updated : 1;
|
|||
|
uint8_t is_print : 1;
|
|||
|
float angle;
|
|||
|
double p50;
|
|||
|
float slope;
|
|||
|
float freq;
|
|||
|
uint32_t time; // enter time(ms)
|
|||
|
} fz_stage_t;
|
|||
|
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
uint32_t start_time; // ms
|
|||
|
uint32_t end_time; // ms
|
|||
|
float angle; // zero pos
|
|||
|
float target_angle;
|
|||
|
float power;
|
|||
|
float cali_angle;
|
|||
|
int8_t m_dir;
|
|||
|
} calib_info_t;
|
|||
|
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
ZeroFindState state;
|
|||
|
|
|||
|
fz_stage_t stage_info[ZF_STATE_MAX];
|
|||
|
|
|||
|
uint8_t calib_cnt;
|
|||
|
int target_dir; // 1: forward, -1: backward
|
|||
|
calib_info_t calib_info[FZ_CALI_MAX_COUNT];
|
|||
|
|
|||
|
uint8_t zero_stable_count;
|
|||
|
et_zero_cross_t zc;
|
|||
|
et_goertzel_config_t cfg;
|
|||
|
etk_pos_pid_t pid;
|
|||
|
double p50;
|
|||
|
float freq;
|
|||
|
etk_slope_t slope_handle;
|
|||
|
float slope;
|
|||
|
double last_p50_slope;
|
|||
|
TrendStatus trend;
|
|||
|
trend_handle_t trend_handle;
|
|||
|
} pm_meas_t;
|
|||
|
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
FzFsmState fz_fsm_state;
|
|||
|
pm_meas_t meas;
|
|||
|
PmMeasMode meas_mode;
|
|||
|
} pm_fsm_t;
|
|||
|
|
|||
|
ZeroFindState get_find_zero_state(pm_meas_t *fz);
|
|||
|
|
|||
|
void trend_handle_init(trend_handle_t *handle);
|
|||
|
|
|||
|
|
|||
|
int find_zero_process(pm_meas_t *fz, const uint16_t *adc_val, uint32_t len);
|
|||
|
|
|||
|
int pm_fsm_init(pm_fsm_t *fsm);
|
|||
|
|
|||
|
#endif
|