#ifndef __FUNCTION_H
#define __FUNCTION_H	 

#include "stm32f1xx_hal.h"
#include "oled.h"
#include "adc.h"


/******************************* ADC 采集相关定义 ********************************/
#define Ui_K	   (68.421*3.3/4096)             //Ui电压矫正K值
#define Ui_B	   4.7435		                  //Ui电压矫正B值
#define Ii_K	   (24.176*3.3/4096)	            //Ii矫正K值
#define Ii_B	   (-38.776)		                  //Ii矫正B值
#define Ubf_K	   (51.177*3.3/4096)        //Ubf电压矫正K值   (117.53*3.3/4096) 
#define Ubf_B	   2.6519							//Ubf电压矫正B值   (-114.18)	
#define Uo_K	   0.01919       					//Uo电压矫正K值   
#define Uo_B	   0											//Uo电压矫正B值
#define Io_K	   (2.177*3.3/4096)							//Io矫正K值
#define Io_B	   (-3.512)											//Io矫正B值
//采样变量结构体
typedef struct
{
	float Ui;
	float Ii;
	float Ubf;
	float Uo;
	float Io;
		
}SADC;

extern SADC adc;
void SADC_Init(void);
void ADCSample(void);
/************************ END of ADC 采集相关定义  *********************************/


/****************************  低通滤波器相关定义  ********************************/
#ifndef M_PI
#define M_PI (3.141592f)
#endif
typedef struct
{
    float ts;       //采样周期(s)
    float fc;       //截至频率(hz)
    float lastYn;   //上一次滤波值
    float alpha;    //滤波系数
} low_pass_filter_t;
extern low_pass_filter_t  low_pass_filter1;  //定义滤波器
extern low_pass_filter_t  low_pass_filter2;  //定义滤波器
extern low_pass_filter_t  low_pass_filter3;  //定义滤波器
extern low_pass_filter_t  low_pass_filter4;  //定义滤波器
extern low_pass_filter_t  low_pass_filter5;  //定义滤波器
extern low_pass_filter_t  low_pass_filter6;  //定义滤波器
extern low_pass_filter_t  low_pass_filter7;  //定义滤波器
//初始化滤波系数
void Init_lowPass_alpha(low_pass_filter_t* const filter,const float ts, const float fc);
//低通滤波
float Low_pass_filter(low_pass_filter_t* const filter, const float data);
/*************************** END of 低通滤波器相关定义 ***************************************************/




/**************************************** PID 相关定义 **********************************************/
typedef struct
{
   	float kp,ki,kd;//三个系数
    float error,lastError;//误差、上次误差
    float integral,maxIntegral;//积分、积分限幅
    float output,maxOutput;//输出、输出限幅
}PID;

typedef struct
{
   float Ubf;
   float Uo;
}Hope_Velue;

extern PID pid_Ubf;//创建一个PID结构体变量
extern PID pid_Uo;//创建一个PID结构体变量

void PID_Init(PID *pid,float p,float i,float d,float maxI,float maxOut);
void PID_Calculate(PID *pid,float reference,float feedback);
void PIDset(void);

extern Hope_Velue hope_value;     //期望值结构体
void Hope_Velue_Init(float Ubf,float Uo);
void Soft_Start(uint16_t softnum,float Ubf,float Uo);
/*************************************** END of PID 相关定义 ***************************************************/

extern int OUT_flag;

void OLEDShow(void);




#endif


