#ifndef PI_REGLER_H
	#define PI_REGLER_H
	
#include <avr/io.h>





// Ab diesem Wert wird der I-Anteil nicht mehr weiter aufsummiert
#define ANTI_WIND_UP	150


#define SCALING_FACTOR  128


/*! \brief PID Status
 *
 * Setpoints and data used by the PID control algorithm
 */
typedef struct regler_werte
{
	//! letzter Ausgabewert, nötig für Anti-Wind-Up
	int16_t ausgabewert_alt;
	//! letzter Istwert, nötig für D-Anteil
	uint16_t	istwert_alt;
	//! Summe der Fehler für I-Anteil
	int32_t		esum;
	//! K_P, multipliziert mit SCALING_FACTOR
	int16_t		P_Factor;
	//! K_I, multipliziert mit SCALING_FACTOR
	int16_t		I_Factor;
	//! K_D, multipliziert mit SCALING_FACTOR
	int16_t		D_Factor;
	//! maximum allowed error, avoid overflow
	int16_t maxError;
	//! maximum allowed sumerror, avoid overflow
	int32_t maxSumError;
} pidData_t;


/*! \brief Maximum values
 *
 * Needed to avoid sign/overflow problems
 */
// Maximum value of variables
#define MAX_INT         INT16_MAX
#define MAX_LONG        INT32_MAX
#define MAX_I_TERM      (MAX_LONG / 2)

void pid_Init(int16_t p_factor, int16_t i_factor, int16_t d_factor, struct regler_werte *pid_st);
int16_t pid_Controller(int16_t sollwert, int16_t istwert, struct regler_werte *pid_st);
void pid_Reset_Integrator(struct regler_werte *pid_st);


#endif