#ifndef __MODE_PWMP_HD_H__ #define __MODE_PWMP_HD_H__ #include "main.h" #define MODE_DEFAULT_AUTOLOAD 99 // 预分频系数 #define WAIT_COUNT_MAX 2 // 蓝牙等待最大次数 #define VIP_H_EN_HD 1 // 高电压输出开关 ///////////////////////////////////////*算法整定部分宏定义BEGIN*//////////////////////////////////////// #define TIME_CYCLE 0.01f // 定义时间周期:10ms #define FSM_WAIT(st) BIT_SET(st, BIT7) #define FSM_IS_WAIT(st) (st & BIT7) #define DIFF_ADC 10U #define DIFF_ADC_MAX 6U ///////////////////////////////////////*算法整定部分宏定义END*/////////////////////////////////////////// #define EXECUTE_PLAN EXECUTE_PLAN_1 /*----------------------------------------*/ typedef enum { PWMP_HD_PROCESS_CONTROL, PWMP_HD_PROCESS_ADJUST, PWMP_HD_PROCESS_ADJUST_STOP, PWMP_HD_PROCESS_TEST, PWMP_HD_PROCESS_STOP, } mode_pwmp_hd_process_state_e; // 处理状态 typedef enum { INFLATE=0, DEFLATE, }mode_pwmp_hd_action_e; // 运动状态(充气/排气) /*需要存储的变量*/ typedef struct { uint8_t tuned_flag; // 整定标志 0:未整定,1:整定中,2:整定成功,3:整定失败 uint16_t startup_value; // 阀位启动值 uint16_t arr_diff; // 控制区间 uint16_t ad_diff; // 磁条区间 uint16_t pwmp_min; // 控制最小值 uint16_t pwmp_max; // 控制最大值 uint16_t pwmp_min_origin; // 整定控制最小值 uint16_t pwmp_max_origin; // 整定控制最大值 uint16_t trip_0; // 磁条0位置AD uint16_t trip_100; // 词条100位置AD uint16_t trip_min0; // 小回路行程0位置AD uint16_t trip_min100; // 小回路行程100位置AD uint16_t current0; // 电流最小值 uint16_t current100; // 电流最大值 uint16_t all_open_time; // 全开时间 uint16_t all_close_time; // 全关时间 uint16_t all_open_time_full; // 最大信号全开时间 uint16_t all_close_time_full; // 最大信号全关时间 uint16_t prov_flag; // 磁条安装的正反:倒装:0 正装:1 uint16_t valve_type; // 阀门正反行程:气开:ATO 气关:ATC float32 kp; float32 ki; float32 kd; } mode_pwmp_hd_storage_data_t; typedef struct { __IO uint32_t enter_count; // 用于100ms蓝牙输出计时器 float32 ctrl_target; // 目标值 float32 ctrl_feedback; // 反馈值 float32 real_error; // 实际误差 uint16_t current_adc; // 当前ADC值 uint16_t small_trip_current_adc; // 小行程反馈当前ADC值 } mode_pwmp_hd_control_t; /*滤波处理*/ typedef struct { lpf_t actual_lpf; lpf_t target_lpf; lpf_window_t *handle; } mode_pwmp_hd_filter_t; typedef union { uint8_t data[128]; // 自定义数据结构 mode_pwmp_hd_storage_data_t storage; } mode_pwmp_hd_params_u; typedef struct { /*充气过程:各百分之十阀位的控制信号值*/ uint16_t valvepos_in[9]; // 充气过程中9个不同阀位的控制信号值 /*排气过程:各百分之十阀位的控制信号值*/ uint16_t valvepos_de[9]; // 排气过程中9个不同阀位的控制信号值 float32_t valvepos_in_k[8]; float32_t valvepos_de_k[8]; float32_t valvepos_in_b[8]; float32_t valvepos_de_b[8]; } mode_pwmp_hd_valvepos_t; typedef struct { mode_pwmp_hd_valvepos_t valvepos; // 各稳定阀位控制信号值 mode_pwmp_hd_action_e action; // 运动状态(充气/排气) uint8_t lcd_adjust_state; // LCD自整定流程状态 float32 duty_percent; // 占空比 float32 current_electric; // 电流 uint8_t auto_tune_state; // 自整定状态 0:未整定 1:整定中 2:整定完成 3:整定失败 uint16_t wait_count_max; // 等待次数最大值 uint16_t arr_default; // 默认值array,推动值 uint8_t process_state; // 处理状态 uint8_t adjust_state; // 整定状态 uint16_t output; // 输出值 uint16_t current_adc; // 当前位置反馈的AD值 uint32_t count; // 计数 float32 valvepos_stable; // 10%-90%阀位之间的稳定控制值 mode_pwmp_hd_control_t control; mode_pwmp_hd_filter_t filter; mode_pwmp_hd_params_u *pwmp_save; void (*params_save_cb)(void); } mode_pwmp_hd_t; /////////////////////////////////////////*共用部分BEGIN*//////////////////////////////////////////////// typedef enum { VELOCITY_TEST, // 速度测试 SMALL_TRAVEL_TEST, // 小回路测试 PWMP_HD_TEST_OPEN_LOOP_OUTPUT, // 开环输出 } mode_pwmp_hd_test_state_e; typedef enum { PWMP_HD_TEST_GET_SMALL_TRAVEL_HIGH, // 获取小行程反馈的最大值 PWMP_HD_TEST_GET_SMALL_TRAVEL_LOW, // 获取小行程反馈的最小值 PWMP_HD_TEST_GET_SMALL_TRAVEL_50_PER_ARR, // 获取处于50%阀位时的控制值 PWMP_HD_TEST_GET_SMALL_TRAVEL_STABLE_RANGE_UP, // 获取小行程反馈的稳定区间上限 PWMP_HD_TEST_GET_SMALL_TRAVEL_STABLE_RANGE_DOWN, // 获取小行程反馈的稳定区间下限 PWMP_HD_TEST_OPEN_LOOP_OUTPUT_TEST, } mode_pwmp_hd_test_small_travel_state_e; typedef struct { mode_pwmp_hd_test_state_e test_state; mode_pwmp_hd_test_small_travel_state_e small_travel_test_state; volatile uint16_t wait_count; volatile uint16_t psb_adc; volatile uint16_t last_adc; uint8_t flag_stable; // 稳定标志 uint16_t small_trip_current_adc; // 小行程反馈当前值 uint16_t small_trip_adc_max; // 小行程反馈最大值 uint16_t small_trip_adc_min; // 小行程反馈最小值 uint16_t small_trip_adc_stable_up; // 小行程反馈稳定区间上限值 uint16_t small_trip_adc_stable_down; // 小行程反馈稳定区间下限值 uint16_t small_trip_adc_50_percent; // 当阀位为50%时小行程反馈的adc值 float32 ctrl_feedback; // 反馈值 float32 ctrl_target; // 目标值 float32 real_error; // 误差值 /*输出值*/ uint16_t arr_default; // 默认计数器(推动计数值) uint16_t arr_50_percent; // 使执行器能够稳定在百分之50阀位的控制值 volatile uint16_t arr_current; // 当前推动阀门的计数器 volatile uint16_t arr_last; // 上一次计数器值 } pwmp_hd_test_t; typedef enum { PWMP_HD_ADJUST_IDEL, PWMP_HD_ADJUST_ROUGH_POSITION0, // 粗调位置0 PWMP_HD_ADJUST_ACCURATE_POSITION0, // 精调位置0 PWMP_HD_ADJUST_ROUGH_POSITION100, // 粗调位置100 PWMP_HD_ADJUST_ACCURATE_POSITION100, // 精调位置100 PWMP_HD_ADJUST_ALL_CLOSE_TIME, // 全关时间 PWMP_HD_ADJUST_ALL_OPEN_TIME, // 全开时间 PWMP_HD_ADJUST_CALCULATE, // 阀门参数计算 PWMP_HD_ADJUST_PID_CALCULATE, // PID参数计算 PWMP_HD_ADJUST_PID_TUNING, // PID参数自整定过程(整定得到K、T、L) PWMP_HD_ADJUST_SAVE, // 存储变量 PWMP_HD_ADJUST_BLEEDING, // 在整定状态中放气 PWMP_HD_ADJUST_BLEEDING_POSITION0, // 放气位置0 PWMP_HD_ADJUST_INITIATE, // 启动值 PWMP_HD_ADJUST_STEP_BY_10_TO_100, // 由0-100找到控制值 PWMP_HD_ADJUST_STEP_BY_10_TO_0, // 由100-0找到控制值 PWMP_HD_ADJUST_VALVEPOS_CALCULATE, // 对各区间阀位控制值进行线性化处理 PWMP_HD_ADJUST_STOP, PWMP_HD_ADJUST_FAIL, // 整定失败 PWMP_HD_ADJUST_TEST, PWMP_HD_ADJUST_BLEEDING_TIMER, PWMP_HD_ADJUST_AERATE_TIMER, PWMP_HD_ADJUST_TUNING, } mode_pwmp_hd_adjust_state_e; // 整定状态 #define PWMP_HD_ADJUST_STEP LCD_ADJUST_STOP // 整定步骤 typedef enum { // 自整定结果 0:未整定 1:整定中 2:整定完成 3:整定失败 PWMP_HD_ADJUST_RESULT_IDEL = 0, PWMP_HD_ADJUST_RESULT_TUNING, PWMP_HD_ADJUST_RESULT_SUCCESS, PWMP_HD_ADJUST_RESULT_FAIL, } mode_pwmp_hd_adjust_result_e; // 整定结果 typedef struct { /*充气过程:各百分之十阀位的控制信号值*/ uint16_t valvepos_in[9]; // 充气过程中9个不同阀位的控制信号值 /*排气过程:各百分之十阀位的控制信号值*/ uint16_t valvepos_de[9]; // 排气过程中9个不同阀位的控制信号值 } mode_pwmp_hd_adjust_valvepos_t; typedef struct { mode_pwmp_hd_adjust_state_e adjust_state; mode_pwmp_hd_adjust_valvepos_t valvepos; // 记录处于每10%阀位的控制信号值 volatile uint16_t wait_count; volatile uint16_t psb_adc; volatile uint16_t last_adc; uint8_t adc_count; BOOL preheat; BOOL adc_0_100_flag; // 判断0-100移动过程中ad值是增大还是减少,TRUE 增大,FALSE 减小 BOOL flag_stable_begin; BOOL flag_stable_end; BOOL all_bleed_time_flag; uint16_t adc_record_0; // 记录放气时阀门最小位置ad值 uint16_t adc_record_1; // 记录放气时阀门最小位置ad值 uint16_t adc_record_2; // 记录充气时阀门最大位置ad值 uint16_t arr_record_0; // 最低位置阀门的ad值 uint16_t arr_record_1; // 最小推动阀门的ad值 uint16_t arr_record_2; // 最大位置阀门的ad值 uint16_t arr_record_stable; // 记录使阀位稳定的ad值 uint16_t arr_record_stable_begin; // 记录阀门稳定区域开始的ad值 uint16_t arr_record_stable_end; // 记录阀门稳定区域结束的ad值 uint32_t all_open_time; // 全开时间 uint32_t all_open_time_full; // 信号为最大输出时的全开时间 uint32_t all_close_time; // 全关时间 uint32_t all_close_time_full; // 信号为最大输出时的全关时间 uint32_t tmp_time; // 临时用来记录全开全关/整定时间 uint32_t current_0; // 0位置电流大小 uint32_t current_100; // 100位置电流大小 float32 ctrl_target; // 控制目标值 float32 real_error; // 实际误差 float32 ctrl_feedback;// 反馈值 /*输出值*/ uint16_t arr_default; // 默认计数器(推动计数值) volatile uint16_t arr_current; // 当前推动阀门的计数器 volatile uint16_t arr_last; // 上一次计数器值 } pwmp_hd_adjust_t; /////////////////////////////////////////*共用部分END*////////////////////////////////////////////////// /////////////////////////////////////////*PID参数自整定部分BEGIN*//////////////////////////////////////// /*PID整定方法*/ typedef enum { PID_AUTOTUNE_WAY_ZN = 1, PID_AUTOTUNE_WAY_CC, } pid_autotune_way_e; /*阶跃信号大小*/ typedef enum { FULL_TRIP = 1, HALF_TRIP, SMALL_TRIP, } step_signal_value; /*PID整定过程数据*/ typedef struct { float32 pre_actual; // 前一次的行程 float32 cur_actual; // 当前的行程 float32 adjust_tmp_actual; // 临时行程 float32 actual_error; // 行程的误差 float32 step_signal; // 阶跃信号 float32 step_signal_delt; // 阶跃信号差值 float32 ouput_signal_delta; // 输出信号差值 float32 input_range; // 输入范围 float32 output_range; // 输出范围 float32 input_scale; // 输入比例 float32 output_scale; // 输出比例 float32 slope; // 变化率 float32 slope_Max; // 最大变化率 float32 actual_slope_Max; // 最大变化率时的行程 uint32_t pid_autotune_time_origin; // PID自整定初始时间 uint32_t time_slope_Max; // 最大变化率时的时间节点 uint32_t time_Runing; // 自整定程序运行的总时间 float32 actual_stable; // 稳定时的阀位 float32 k; // 切线斜率 float32 b; // 切线截距 } pid_auto_process_data; /*PID参数自整定主体结构体*/ typedef struct PID_AUTOTUNE_HD { uint8_t autotune_way; // 整定的方式 uint8_t signal_value; // 阶跃信号的大小 float32 k_hd; // 增益 float32 t_hd; // 时间常数 float32 l_hd; // 延时时间 float32 p_auto_hd; // 整定输出的P参数 float32 i_auto_hd; // 整定输出的I参数 float32 d_auto_hd; // 整定输出的D参数 float32 ti_auto_hd; // 整定得到的积分时间 float32 td_auto_hd; // 整定得到的微分时间 pid_auto_process_data data; // 过程数据 lpf_t actual_auto_lpf; // 滤波后的行程 } pid_autotune_hd_t; /////////////////////////////////////////*PID参数自整定部分END*//////////////////////////////////////// /////////////////////////////////////////*控制算法BEGIN*//////////////////////////////////////// typedef enum { EXECUTE_PLAN_1, EXECUTE_PLAN_2, EXECUTE_PLAN_3, EXECUTE_PLAN_4, } execute_plan_hd_e; /// 操作标志 typedef enum { EXECUTE_HD_NONE = 0, ///< 不执行任何操作 EXECUTE_HD_OUT = 1, ///< 执行输出 } execute_hd_e; /// 返回内容 typedef struct { execute_hd_e code; ///< 操作标志 uint16_t dac; ///< DAC值 } execute_rsp_hd_t; /////////////////////////////////////////*控制算法END*//////////////////////////////////////// void mode_pwmp_hd_init(mode_interface_req_t *req, uint16_t positioner_model, mode_pwmp_hd_params_u *params, void (*params_save_cb)(void)); void mode_pwmp_hd_dinit(void); void mode_pwmp_hd_process(void); void pwmp_hd_process_state_set(mode_pwmp_hd_process_state_e state); // extern void pwmp_control_update(filter_e type); extern mode_pwmp_hd_t *mode_pwmp_hd; #endif // __MODE_PWMP_HD_H__ /* 控制范围 * 实验室大阀(气关): static int16_t mode_pwmp->pwmp_save->storage.pwmp_min = 613; static int16_t mode_pwmp->pwmp_save->storage.pwmp_max = 900; 实验台中型阀(气开): static int16_t mode_pwmp->pwmp_save->storage.pwmp_min = 1100; static int16_t mode_pwmp->pwmp_save->storage.pwmp_max = 2000; */ /*位置传感器区间 实验室大阀(60mm,气关): uDevice.TravelVol100 = 1547; uDevice.TravelVol0 = 2520; 流量实验室中型阀(40mm,气开): uDevice.TravelVol100 = 1583; uDevice.TravelVol0 = 2506; */