#ifndef __FUNCTION_H
#define __FUNCTION_H	 

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


/****************************  低通滤波器 ********************************/
#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;  //定义滤波器
//初始化滤波系数
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);
/******************************************************************************/



extern uint16_t ADC1_RESULT[8];

//extern struct  _ADI SADC;
extern struct  _Ctr_value  CtrValue;
extern struct  _FLAG    DF;
extern uint16_t OLEDShowCnt;



//函数声明
void ADCSample(void);

void KEYFlag(void);
void SADC_Init(void);
void OLEDShow(void);
void PWM_ON_OFF(uint16_t EN);

/*****************************故障类型**************************************/
#define   F_NOERR      			0x0000//无故障
#define   F_SW_VIN_UVP  		0x0001//输入欠压
#define   F_SW_VIN_OVP    	0x0002//输入过压
#define   F_SW_VOUT_UVP  		0x0004//输出欠压
#define   F_SW_VOUT_OVP    	0x0008//输出过压
#define   F_SW_IOUT_OCP    	0x0010//输出过流
#define   F_SW_SHORT  			0x0020//输出短路

#define		MIN_BUKC_DUTY			80//BUCK最小占空比
#define 	MAX_BUCK_DUTY 		3809//BUCK最大占空比，93%*Q12
#define		MAX_BUCK_DUTY1 		3277//MIX模式下 BUCK固定占空比80%
#define 	MIN_BOOST_DUTY	 	80//BOOST最小占空比
#define 	MIN_BOOST_DUTY1 	283//BOOST最小占空7%
#define 	MAX_BOOST_DUTY		2662//最大占空比 65%最大占空比
#define 	MAX_BOOST_DUTY1		3809//BUCK最大占空比，93%*Q12


#define CAL_Uab_K	0.0008056640625	//AB相线电压矫正K值
#define CAL_Uab_B	0		//AB相线电压矫正B值
#define CAL_Ubc_K	0.0008056640625	//BC相线电压矫正K值
#define CAL_Ubc_B	0		//BC相线电压矫正B值
#define CAL_Ia_K	0.66666	//A相电流矫正K值
#define CAL_Ia_B	0			//A相电流矫正B值
#define CAL_Ib_K	14.18425531	//B相电流矫正K值
#define CAL_Ib_B	0			//B相电流矫正B值
#define CAL_Ic_K	0.66666	//C相电流矫正K值
#define CAL_Ic_B	0			//C相电流矫正B值
#define CAL_Udc_K	0.02651624177	//直流母线电压矫正K值
#define CAL_Udc_B	0			//直流母线电压矫正B值
#define CAL_Idc_K	0.0008056640625	//直流母线电流矫正K值
#define CAL_Idc_B	0			//直流母线电流矫正B值


//采样变量结构体
typedef struct
{
	float		Uref;				//1.65V基准电压
	
	float		Uab;				//AB相线电压
	float		UabAvg;			//AB相线电压平均值
	float		UabOffset;	//AB相线电压采样偏置
	float		Ubc;				//BC相线电压
	float		UbcAvg;			//BC相线电压平均值
	float		UbcOffset;	//BC相线电压采样偏置

	float		Ua;					//A相相电压
	float		Ub;					//B相相电压
	float		Uc;					//C相相电压
	
	float		Ia;					//A相电流
	float		IaAvg;			//A相电流平均值
	float		IaOffset;		//A相电流采样偏置
	float		Ib;					//B相电流
	float		IbAvg;			//B相电流平均值
	float		IbOffset;		//B相电流采样偏置
	float		Ic;					//C相电流
	float		IcAvg;			//B相电流平均值
	float		IcOffset;		//B相电流采样偏置
	
	float		Udc;				//直流母线电压
	float		UdcAvg;			//直流母线电压平均值
	float		Idc;				//直流母线电流
	float		IdcAvg;			//直流母线电流平均值
	float		IdcOffset;	//直流母线电流采样偏置
}SADC;


struct  _Ctr_value
{
	int32_t		Voref;//参考电压
	int32_t		Ioref;//参考电流
	int32_t		ILimit;//限流参考电流
	int16_t		BUCKMaxDuty;//Buck最大占空比
	int16_t		BoostMaxDuty;//Boost最大占空比
	int16_t		BuckDuty;//Buck控制占空比
	int16_t		BoostDuty;//Boost控制占空比
	int32_t		Ilimitout;//电流环输出
};

//标志位定义
struct  _FLAG
{
	uint16_t	SMFlag;//状态机标志位
	uint16_t	CtrFlag;//控制标志位
	uint16_t  ErrFlag;//故障标志位
	uint8_t	BBFlag;//运行模式标志位，BUCK模式，BOOST模式，MIX混合模式	
	uint8_t PWMENFlag;//启动标志位	
	uint8_t KeyFlag1;//按键标志位
	uint8_t KeyFlag2;//按键标志位	
	uint8_t BBModeChange;//工作模式切换标志位
};

//状态机枚举量
typedef enum
{
    Init,//初始化
    Wait,//空闲等待
    Rise,//软启
    Run,//正常运行
    Err//故障
}STATE_M;

//状态机枚举量
typedef enum
{
    NA,//未定义
		Buck,//BUCK模式
    Boost,//BOOST模式
    Mix//MIX混合模式
}BB_M;

//软启动枚举变量
typedef enum
{
	SSInit,//软启初始化
	SSWait,//软启等待
	SSRun//开始软启
 } SState_M;



#define CCMRAM  __attribute__((section("ccmram")))

#endif


