64 lines
2.5 KiB
C
64 lines
2.5 KiB
C
|
|
/*
|
|||
|
|
*========================================================================================
|
|||
|
|
* (C) Copyright 2019 <EFBFBD><EFBFBD> "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
|
|||
|
|
* <EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: pi.h
|
|||
|
|
*
|
|||
|
|
*========================================================================================
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#ifndef __PI_H__
|
|||
|
|
#define __PI_H__
|
|||
|
|
/*
|
|||
|
|
*----------------------------------------------------------------------------------------
|
|||
|
|
*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*----------------------------------------------------------------------------------------
|
|||
|
|
*/
|
|||
|
|
#include "iqmath.h"
|
|||
|
|
/*
|
|||
|
|
*----------------------------------------------------------------------------------------
|
|||
|
|
*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*----------------------------------------------------------------------------------------
|
|||
|
|
*/
|
|||
|
|
/*------------------------------------------------------------------------------
|
|||
|
|
PI_GRANDO Macro Definition
|
|||
|
|
------------------------------------------------------------------------------*/
|
|||
|
|
|
|||
|
|
#define PI_MACRO(v) \
|
|||
|
|
\
|
|||
|
|
/* proportional term */ \
|
|||
|
|
v.up = _IQmpy(v.Kp, (v.Ref - v.Fbk)); \
|
|||
|
|
\
|
|||
|
|
/* integral term */ \
|
|||
|
|
v.ui = (v.Out == v.v1)?(_IQmpy(v.Ki, v.up)+ v.i1) : v.i1; \
|
|||
|
|
v.i1 = v.ui; \
|
|||
|
|
\
|
|||
|
|
/* control output */ \
|
|||
|
|
v.v1 = v.up + v.ui + v.uCorr; \
|
|||
|
|
v.Out= _IQsat(v.v1, v.Umax, v.Umin); \
|
|||
|
|
/*
|
|||
|
|
*----------------------------------------------------------------------------------------
|
|||
|
|
*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*----------------------------------------------------------------------------------------
|
|||
|
|
*/
|
|||
|
|
typedef struct {
|
|||
|
|
_iq Ref; // Input: reference set-point
|
|||
|
|
_iq Fbk; // Input: feedback
|
|||
|
|
_iq uCorr; // Input: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
_iq Out; // Output: controller output
|
|||
|
|
_iq Kp; // Parameter: proportional loop gain
|
|||
|
|
_iq Ki; // Parameter: integral gain
|
|||
|
|
_iq Umax; // Parameter: upper saturation limit
|
|||
|
|
_iq Umin; // Parameter: lower saturation limit
|
|||
|
|
_iq up; // Data: proportional term
|
|||
|
|
_iq ui; // Data: integral term
|
|||
|
|
_iq v1; // Data: pre-saturated controller output
|
|||
|
|
_iq i1; // Data: integrator storage: ui(k-1)
|
|||
|
|
} PI_CONTROLLER;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#endif // __PI_H__
|