#define  PID_C
#include "pid.h"
void PID_Calculate(PID_TypeDef *Data)
{
    float Inc, P, I, D, Err;
    
    Err = Data->Target - Data->Current;
    
    Data->Error[0] = Data->Error[1];
    Data->Error[1] = Data->Error[2];
    Data->Error[2] = (Abs_float(Err) > Data->DeadZone) * Err;
    
    P = Data->Kp*(Data->Error[2]-Data->Error[1]);
    I = Data->Ki*(Data->Error[2]);
    D = Data->Kd*(Data->Error[2]-2*Data->Error[1]+Data->Error[0]);
    Inc = (P+I+D);
    
    Data->Output += Inc;
    Data->Output = Min_float(Data->Output, Data->OutputLimit);
    Data->Output = Max_float(Data->Output,-Data->OutputLimit);
}
void PID_Clear(PID_TypeDef *Data)
{
    Data->Current   = 0;
    
    Data->Error[0]  = 0;
    Data->Error[1]  = 0;
    Data->Error[2]  = 0;
    
    Data->Output    = 0;
}
 
#ifndef  PID_H
#define  PID_H
#include "main.h"
#ifdef   PID_C
#endif
typedef struct
{
    float Kp,Ki,Kd;
    float Target;
    float Current;
    float Error[3];
    float DeadZone;float Output;
    float OutputLimit;
} PID_TypeDef;
void PID_Calculate(PID_TypeDef *Data);
void PID_Clear    (PID_TypeDef *Data);
#endif