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_pwmp_hd.h

388 lines
15 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_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_2
/*----------------------------------------*/
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
{
/*充气过程:各百分之十阀位的控制信号值*/
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];
/*最大过冲量*/
float32_t overimpulse_in;
float32_t overimpulse_ex;
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值
uint16_t pwmp_min_stable; // 稳定区间下限值
uint16_t pwmp_max_stable; // 稳定区间上限值
} mode_pwmp_hd_control_t;
/*滤波处理*/
typedef struct
{
lpf_window_t handle;
uint16_t value;
} mode_pwmp_hd_filter_t;
typedef enum
{
INAUTO_C, // PID控制器开始模式
OFFAUTO_C, // PID控制器关闭模式
} mode_pwmp_hd_pid_mode_e;
typedef struct
{
mode_pwmp_hd_pid_mode_e pid_mode; // PID控制模式
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_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_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_OVERIMPULSE_INFLATE, // 求取充气过程中的最大过冲量
PWMP_HD_ADJUST_OVERIMPULSE_EXHAUST, // 求取排气过程中的最大过冲量
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
{
lpf_window_t handle;
uint16_t value;
} mode_pwmp_hd_adjust_filter_t;
typedef struct
{
mode_pwmp_hd_adjust_state_e adjust_state;
mode_pwmp_hd_adjust_valvepos_t valvepos; // 记录处于每10%阀位的控制信号值
mode_pwmp_hd_adjust_filter_t filter;
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; // 反馈值
float32 overimpulse_in; // 充气过程的最大超调量
float32 overimpulse_ex; // 排气过程的最大超调量
/*输出值*/
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;
*/