313 lines
12 KiB
C
313 lines
12 KiB
C
#ifndef __MODE_PWMP_HD_H__
|
||
#define __MODE_PWMP_HD_H__
|
||
#include "main.h"
|
||
|
||
#define EXECUTE_PLAN EXECUTE_PLAN_1
|
||
|
||
/*----------------------------------------*/
|
||
typedef enum
|
||
{
|
||
ANGULAR_TRAVEL,
|
||
LINEAR_TRAVEL,
|
||
} mode_pwmp_hd_valve_type_e; // 阀门类型
|
||
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 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 prov_flag; // 磁条安装的正反:倒装:0 正装:1
|
||
uint16_t valve_type; // 阀门正反行程:气开:VALVE_CLOSE 气关:VALVE_OPEN
|
||
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 struct
|
||
{
|
||
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; // 计数
|
||
|
||
mode_pwmp_hd_control_t control;
|
||
mode_pwmp_hd_filter_t filter;
|
||
mode_pwmp_hd_storage_data_t *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_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
|
||
{
|
||
mode_pwmp_hd_adjust_state_e adjust_state;
|
||
|
||
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;
|
||
|
||
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; // 全关时间
|
||
BOOL all_close_time_flag;
|
||
uint32_t tmp_time; // 临时用来记录全开全关/整定时间
|
||
|
||
/*输出值*/
|
||
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_storage_data_t *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;
|
||
*/
|