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/inc/mode_pwmp_hd.h

278 lines
9.9 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 10 // 蓝牙等待最大次数
#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_MAX 6U
/*阶跃信号大小*/
#define FULL_TRIP_SIGNAL 925 // 925 2020
#define HALF_TRIP_SIGNAL 753
#define SMALL_TRIP_SIGNAL 650
///////////////////////////////////////*算法整定部分宏定义END*///////////////////////////////////////////
#define EXECUTE_PLAN EXECUTE_PLAN_1
/*----------------------------------------*/
typedef enum
{
PWMP_HD_PROCESS_CONTROL,
PWMP_HD_PROCESS_ADJUST,
PWMP_HD_PROCESS_TEST,
PWMP_HD_PROCESS_STOP,
} mode_pwmp_hd_process_state_e; // 处理状态
/*需要存储的变量*/
typedef struct
{
uint8_t tuned_flag; // 是否整定过 1整定过 0未整定过
uint8_t tuned_state; // 自整定结果
uint16_t bleeding; // 放气值
uint16_t inflation; // 充气值
uint16_t arr_diff; // 控制区间
uint16_t ad_diff; // 磁条区间
uint16_t pwmp_min; // 控制最小值
uint16_t pwmp_max; // 控制最大值
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 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值
} 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
{
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_params_u *pwmp_save;
void (*params_save_cb)(void);
} mode_pwmp_hd_t;
/////////////////////////////////////////*共用部分BEGIN*////////////////////////////////////////////////
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_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 减小
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值
uint32_t all_open_time; // 全开时间
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(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;
*/