#ifndef __MODE_CONTROL_DEF_H__ #define __MODE_CONTROL_DEF_H__ #include "lib.h" #include "filter.h" #include "mode_def.h" #include "pid.h" #include "params.h" #include "pdctrl.h" #define MODE_CONTROL_ADJUST_DIFF_ADC_MAX 6 // 在整定过程中,判断是否稳定的AD误差,大于此值则认为不稳定 #define MODE_CONTROL_STABLE_STEP 1 // 稳定步长 #define MODE_CONTROL_STABLE_STEP_COUNT ((100 / MODE_CONTROL_STABLE_STEP) + 1) // 稳定步长个数 0-100 #define MODE_CONTROL_UNDER_LINE_MIN 10.0f // 下限最小值 #define MODE_CONTROL_UNDER_LINE 25.0f #define MODE_CONTROL_STEP_THRESHOLD 10 // 阶跃阈值 #define MODE_CONTROL_UPWARD_DOWNWARD_TICKS 3 // 上升下降时间tick数 #define MODE_CONTROL_MAX_OUTPUT_CURRENT_GPS2000 1.5f #define MODE_CONTROL_MIN_OUTPUT_CURRENT_GPS2000 0.2f #define MODE_CONTROL_MAX_OUTPUT_CURRENT_GPS3000 1.5f #define MODE_CONTROL_MIN_OUTPUT_CURRENT_GPS3000 0.3f #define MODE_CONTROL_TARGET_ARRAY_SIZE 50 // 目标数组大小 #define MODE_CONTROL_OUTPUT_STABLE_ARRAY_SIZE 40 // 输出数组大小,用于判断稳定输出 #define MODE_CONTROL_SPEED_TEST_CYCLE 500 // 速度测试周期 #define MODE_CONTROL_ADJUST_TEMPERATURE_UNDER -30 // 整定温度下限 #define MODE_CONTROL_ADJUST_TEMPERATURE_UPLINE 30 // 整定温度上限 #define MODE_CONTROL_STABLE_TEMPERATURE 10 // 温差在xx度以内,使用稳定值 #define MODE_CONTROL_ADJUST_BASE_DAC_2000 500 // DAC整定启动值 #define MODE_CONTROL_ADJUST_BASE_DAC_3000 1000 // DAC整定启动值 typedef enum { CONTROL_MOVE_DIR_NONE, CONTROL_MOVE_DIR_UPWARD, // 上升 CONTROL_MOVE_DIR_DOWNWARD, // 下降 CONTROL_MOVE_DIR_STOP, // 停止 } mode_control_move_dir_e; typedef enum { // 取消 CONTROL_FINE_CANCEL, // 使用平衡值 CONTROL_FINE_BALANCE, // 使用动态值 CONTROL_FINE_DYNAMIC, } mode_control_fine_tuning_e; typedef enum { CONTROL_PROCESS_CONTROL, // 控制 CONTROL_PROCESS_ADJUST, // 整定 CONTROL_PROCESS_ADJUST_STOP, // 整定停止 CONTROL_PROCESS_MANUAL, // 手动 CONTROL_PROCESS_STOP, // 停止 CONTROL_PROCESS_CONTROL_FAIL, // 失败,无法控制 CONTROL_PROCESS_STROKE_TEST, // 行程限位测试 CONTROL_PROCESS_SPEED_TEST, // 速度测试 } mode_control_process_state_e; // 处理状态 typedef enum { EQUILIBRIUM_POINT_START = 0, EQUILIBRIUM_POINT_0, EQUILIBRIUM_POINT_10, EQUILIBRIUM_POINT_20, EQUILIBRIUM_POINT_30, EQUILIBRIUM_POINT_40, EQUILIBRIUM_POINT_50, EQUILIBRIUM_POINT_60, EQUILIBRIUM_POINT_70, EQUILIBRIUM_POINT_80, EQUILIBRIUM_POINT_90, EQUILIBRIUM_POINT_100, EQUILIBRIUM_POINT_END, } mode_control_adjust_tuning_pi_state_e; typedef struct { uint8_t step; uint16_t driver_output; float32_t current; } stable_percent_step_t; // 稳定百分比 typedef struct { pdctrl_mode_e driver_mode; // 驱动模式 DAC/PWM tuned_result_e tuned_flag; // 整定标志 0:未整定,1:整定中,2:整定成功,3:整定失败 mode_adjust_error_e tuned_err_code; // 整定错误码 uint8_t process_change_flag; // 磁条接收的反馈电压由大变小 0 由小变大 1 uint16_t ad_0; uint16_t ad_100; uint16_t ad_diff; uint16_t bleeding_min_arr; // 在100的位置获取的放气值 uint16_t bleeding_max_arr; // 在0的位置获取的放气值 uint16_t aerate_min_arr; // 在100的位置获取的充气值 uint16_t aerate_max_arr; // 在0的位置获取的充气值 uint16_t bleeding_arr; uint16_t aerate_arr; float32 bleeding_max_current; ///< 最大放气电流(毫安,放大100倍,0.01ma=1) float32 bleeding_min_current; ///< 最小放气电流(毫安,放大100倍, 0.01ma=1) float32 aerate_min_current; ///< 最小充气电流(毫安,放大100倍,0.01ma=1) float32 aerate_max_current; ///< 最大充气电流(毫安,放大100倍,0.01ma=1) float32 kp; float32 ki; float32 kd; float32 move_speed_up; // 上升移动速度 float32 move_speed_down; // 下降移动速度 float32 all_open_time; // 全开时间 float32 all_close_time; // 全关时间 int8_t stable_temperature; // 整定稳定温度值 stable_percent_step_t stable_percent_steps[5]; // 稳定百分比 } mode_control_storage_t; typedef union { uint8_t data; struct { uint8_t first_run : 1; ///< 首次运行 0:非首次运行 1:首次运行 uint8_t speed_test_run : 1; ///< 速度测试启动 } bits; } mode_control_flag_t; typedef struct { uint8_t cnt; // 计数 uint16_t ad_start; // 开始AD值 uint16_t ad_last; // 上次AD值 float32 real_ad_speed; // 实时速度 float32 ad_speed; // 速度 (每秒AD值/S) uint32_t time_ms_start; // 启动时间 uint32_t time_ms; // 时间 } mode_control_speed_t; typedef struct { mode_control_flag_t flag; // 标志 uint16_t enter_count; // 进入次数 uint16_t enter_count1; // 进入次数 uint16_t enter_count2; // 持续输出相同次数 pid_common_position_t *position; // 参数 struct { uint16_t arr_min; uint16_t arr_max; uint16_t arr_0; uint16_t arr_100; float32 min_percent; float32 blance_percent; float32 max_percent; float32 slope; // 斜率 float32 sv; // 平滑系数 float32 internal_dead_zone; // 内部死区 float32 internal_ki; // 内部积分系数 feedback_char_e feedback_char; // 反馈特性 } params; // 实际数据 struct { uint16_t current_adc; // 当前位置反馈的AD值 uint16_t balance_arr; // 平衡值 int16_t balance_arr_correct; // 平衡值校正 float32 balance_percent; // 平衡值百分比 float32 output; // 输出值 float32 target; // 目标值(一阶滞后滤波法处理后的数据) float32 feedback; // 反馈值 float32 error; // 实际偏差 float32 target_list[MODE_CONTROL_TARGET_ARRAY_SIZE]; // 目标数组 float32 target_tmp; } real_data; // 稳定控制 struct { BOOL flag; // 稳定标志 mode_control_fine_tuning_e fine_tuning; // 精调模式 int16_t offset; // 稳定偏移值 uint32_t count; // 稳定状态次数 uint16_t arr; // 稳定数值 float32 percent; // 稳定百分比 float32 current; // 稳定电流 float32 output; // 稳定输出值 float32 output_list[MODE_CONTROL_OUTPUT_STABLE_ARRAY_SIZE]; // 稳定输出数组 } stable; struct { BOOL flag; // 阶跃标志 BOOL change; // 阶跃变化标志 BOOL access; // 进入PID微调控制区域确认 uint16_t count; // 进入PID控制区域确认次数 } step; // 行程统计 struct { BOOL flag; // 行程标志 0:未到位 1:到位 mode_control_move_dir_e dir; // 行程方向 mode_control_move_dir_e last_dir; // 行程方向 mode_control_move_dir_e step_dir; // 阶跃时行程方向 uint16_t need_ticks; // 需要的时间 uint16_t used_ticks; // 已经使用的时间 float32 stroke_speed; // 行程速度 float32 stroke_dead_upper_limit; // 行程死区上限 float32 stroke_dead_lower_limit; // 行程死区下限 float32 start_position; // 启动时位置 float32 target_position; // 到达目标位置 } stroke; struct { float32 min; float32 max; float32 balance; } output_percent; mode_control_speed_t speed; } mode_control_params_t; typedef struct { lpf_t actual_lpf; lpf_t target_lpf; lpf_window_t ctrl_output_lpf_window; } mode_control_filter_t; typedef struct { uint16_t output; // 输出 uint16_t manual_output; // 手动模式下输出 struct { uint16_t default_min_value; // 默认值 DAC:0 PWM:3999 uint16_t positioner_model; // 定位器型号 uint16_t wait_count_max; // 等待次数最大值 float32 max_current; float32 min_current; } params; struct { uint16_t current_adc; // 当前位置反馈的AD值 uint16_t current_ipsb_adc; // 当前小回路反馈的AD值 float32 current_electric; // 当前电流 } real_data; struct { uint8_t process_state; // 处理状态机 uint8_t adjust_state; // 整定状态机 uint8_t diagnosis_state; // 诊断状态机 uint8_t lcd_adjust_state; // LCD自整定流程状态 } fsm; mode_control_storage_t *storage; // 存储数据 mode_control_params_t control_data; // 控制 mode_control_filter_t filter; // 滤波 void (*params_save_cb)(void); // 参数保存回调函数 } mode_control_t; extern mode_control_t *mode_control; extern float32 mode_control_get_kp(void); extern float32 mode_control_get_ki(void); extern float32 mode_control_get_kd(void); extern float32 mode_control_get_slope(uint16_t arr_max, uint16_t arr_min); extern float32 mode_control_get_percent_upline(void); extern float32 mode_control_get_percent_underline(void); extern uint16_t mode_control_get_default_min_value(void); extern uint16_t mode_control_get_default_max_value(void); extern uint16_t mode_control_get_default_max_value_allow(void); extern uint16_t mode_control_get_default_min_value_allow(void); extern uint16_t mode_control_get_wait_ticks(uint16_t time); extern uint16_t mode_control_get_stable_arr(float32 target); extern uint16_t mode_control_percent_convert_arr(float32 percent); extern float32 mode_control_arr_convert_percent(int16_t arr); extern void mode_control_stable_insert(float32 array[], uint8_t len, float32 value); extern BOOL mode_control_stable_check_deviation(float32 array[], uint8_t len, float32 err); extern void mode_control_bluetooth_output_trip(float32 trip); extern void mode_control_bluetooth_output_control(void); extern void mode_control_bluetooth_output_speed(void); extern void mode_control_pid_load(void); extern void mode_control_set_parms(void); extern void mode_control_start(void); extern void mode_control_execute(void); extern void mode_control_set_magnetic_stripe_specifications(void); extern float32 mode_control_add_offset(float32 value); #endif // __MODE_CONTROL_DEF_H__