acdt/users/Inc/provalctrl.h

120 lines
3.4 KiB
C

#ifndef _PROVALCTRL_H_
#define _PROVALCTRL_H_
#include "modbus.h"
#include "dac7311.h"
#include "main.h"
//#include "flash.h" //擦写出错,写入出错
#include "eeprom.h"
#include "math.h"
#define CSTEP_WAIT_MAX 0 //逐步接近,等待时间
#define BIAS_MAX 10 //偏大大于此值时不进行控制
#define GAS_IN 0 //充气
#define GAS_OUT 1 //排气
#define SLDW_PRES_OUT 10 //输出气压的滑动窗口长度
extern float ao_dwq; //AO输出电流值(定位器)
extern float ao_blf1; //AO输出电流值(比例阀)
extern float ao_blf2; //AO输出电流值(比例阀)
typedef enum
{
PROV_RUNNING = 0, //运行
PROV_ADJUSTING = 1, //整定
PROV_HOLDING = 2 //保持原样,不进行校准
}prov_status;
typedef enum
{
ADJ_START = 0, //整定开始
ADJ_MOVE2MIDDLE = 1, //输出气源气压的一半,移动至中间位置附近
ADJ_OSCILLATE = 2, //继电反馈,强制振荡
ADJ_CALCULATE = 3, //计算结果
ADJ_END = 4, //整定结束,等待一段时间后恢复控制
ADJ_WAIT = 5 //等待,未进入整定程序
}adj_steps;
typedef struct
{
prov_status status; //比例阀状态
unsigned char tag; //标签,用于区分
float previous_pressure[SLDW_PRES_OUT]; //前几个时刻的输出气压
float current_pressure; //当前输出气压
float current_percent; //当前输出气压百分比
float target_pressure; //目标气压
float target_percent; //目标气压百分比
float target_current; //目标值的理论电流
float current_input; //当前电流输入
float input_max; //输入电流上限
float input_min; //输入电流下限
float bias; //偏差百分比
float bias_previous; //前一个偏差
float bias_area; //允许的误差范围 [-a, a]%
uint8_t gas_direction; //
float Kp; //比例系数
float Ti; //积分时间
float Ing; //积分项
float Ing_sum; //积分求和
float Ing_max; //求和上限
float Ing_min; //求和下限
float Td; //微分时间
float Ts; //采样时间(控制周期)
float Div; //微分项
float pidout; //PID输出
float pidout_max; //PID输出上限
float pidout_min; //PID输出下限
uint8_t slow_down_flg; //减速标志
// float cstep_gasin; //逐步接近,充气步长
// float cstep_gasout; //逐步接近,排气步长
// float cstep_max; //步长上限
// float cstep_min;
// unsigned char cstep_wait; //步长下限
void (*pvout)(float pout); //dac 输出
}propotion_valve; //比例阀参数结构体
#define OSCILL_TIMES 5 //振荡次数
#define TICK_LIMIT 120 //振荡周期限时
typedef struct
{
unsigned char adj_flag; //整定标志,用于判断是否处于整定中
float relay_d; //继电反馈,回环幅值
float relay_a[OSCILL_TIMES]; //继电反馈,输出气压振荡幅值,中间数据
float relay_A; //继电反馈,输出气压振荡幅值,结果
float relay_tc[OSCILL_TIMES]; //继电反馈,输出气压振荡周期,中间数据
float relay_Tc; //继电反馈,输出气压振荡周期,结果
float air_source; //气源压力
float middle_current; //中间位置电流
unsigned char oscil_times; //当前振荡次数
}prov_adjust; //自整定参数结构体
extern propotion_valve pv_one;
extern propotion_valve pv_two;
void prov_init(void);
void prov_adj_init(void);
void prov_set(float target_p, propotion_valve *pvx);
void prov_ctrl(propotion_valve *pvx, prov_adjust *adj_pvx);
void prov_calibrate_pid(propotion_valve *pvx);
void prov_calibrate_step(propotion_valve *pvx);
void analog_ctrl(void);
float abs_bias(float bias);
void prov_adj(propotion_valve *pvx, prov_adjust *adj_pvx);
/******************************************************************************************/
#endif