This repository has been archived on 2025-02-28. You can view files and clone it, but cannot push or open issues or pull requests.
controller-hd/User/application/mode/mode_control_def.h

291 lines
11 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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__