291 lines
11 KiB
C
291 lines
11 KiB
C
#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.8f
|
||
#define MODE_CONTROL_MIN_OUTPUT_CURRENT_GPS2000 0.2f
|
||
#define MODE_CONTROL_MAX_OUTPUT_CURRENT_GPS3000 1.7f
|
||
#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_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, // 行程限位测试
|
||
} 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[21]; // 稳定百分比
|
||
} mode_control_storage_t;
|
||
|
||
typedef struct
|
||
{
|
||
BOOL first_run; // 首次运行
|
||
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_bleeding;
|
||
uint16_t arr_aerate;
|
||
float32 slope; // 斜率
|
||
float32 sv; // 平滑系数
|
||
float32 internal_dead_zone; // 内部死区
|
||
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 target_real; // 目标值(真实值)
|
||
float32 feedback; // 反馈值
|
||
float32 error; // 实际偏差
|
||
float32 target_list[MODE_CONTROL_TARGET_ARRAY_SIZE]; // 目标数组
|
||
} real_data;
|
||
|
||
// 稳定控制
|
||
struct
|
||
{
|
||
BOOL flag; // 稳定标志
|
||
mode_control_fine_tuning_e fine_tuning; // 精调模式
|
||
int16_t offset; // 稳定偏移值
|
||
uint32_t count; // 稳定状态次数
|
||
uint16_t arr; // 稳定数值
|
||
float32 percent; // 稳定百分比
|
||
float32 percent_last; // 稳定百分比
|
||
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 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
|
||
{
|
||
// 0-100区间电流
|
||
float32 current_0_100;
|
||
// 10-90区间电流
|
||
float32 current_10_90;
|
||
// 平衡区间占比
|
||
float32 balance_percent;
|
||
// 其余占比
|
||
float32 other_percent;
|
||
// 向上偏移
|
||
float32 up_offset;
|
||
// 向下偏移
|
||
float32 down_offset;
|
||
} output_range;
|
||
|
||
struct
|
||
{
|
||
float32 min;
|
||
float32 max;
|
||
float32 balance;
|
||
} output_percent;
|
||
|
||
} mode_control_params_t;
|
||
|
||
typedef struct
|
||
{
|
||
kalman_t actual_km;
|
||
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_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__
|