#ifndef _PROVALCTRL_H_ #define _PROVALCTRL_H_ 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; float current_pressure; float current_percent; float target_pressure; float target_percent; float current_input; float input_max; float input_min; float bias; float bias_previous; float bias_area; //bias permitted [-a, a]% float Kp; //used for pid control float Ti; float Ing; float Ing_sum; float Ing_max; float Ing_min; float Td; float Ts; float Div; float pidout; float pidout_max; float pidout_min; float cstep_gasin; // tinny step adjust float cstep_gasout; float cstep_max; float cstep_min; unsigned char cstep_wait; void (*pvout)(float pout); //dac out }propotion_valve; //propotion valve #define OSCILL_TIMES 10 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); #define CSTEP_WAIT_MAX 0 #define BIAS_MAX 10 /******************************************************************************************/ #endif