177 lines
5.1 KiB
C
177 lines
5.1 KiB
C
/*
|
|
------------------------------------------------------------------------------
|
|
~ File : pid.h
|
|
~ Author : Majid Derhambakhsh
|
|
~ Version: V1.0.0
|
|
~ Created: 02/11/2021 03:43:00 AM
|
|
~ Brief :
|
|
~ Support:
|
|
E-Mail : Majid.do16@gmail.com (subject : Embedded Library Support)
|
|
|
|
Github : https://github.com/Majid-Derhambakhsh
|
|
------------------------------------------------------------------------------
|
|
~ Description:
|
|
|
|
~ Attention :
|
|
|
|
~ Changes :
|
|
------------------------------------------------------------------------------
|
|
*/
|
|
|
|
#ifndef __PID_H_
|
|
#define __PID_H_
|
|
|
|
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Include ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
|
|
#include "zf_common_headfile.h"
|
|
|
|
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Defines ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
|
|
/* ------------------------ Library ------------------------ */
|
|
#define _PID_LIBRARY_VERSION 1.0.0
|
|
|
|
/* ------------------------ Public ------------------------- */
|
|
#define _PID_8BIT_PWM_MAX UINT8_MAX
|
|
#define _PID_SAMPLE_TIME_MS_DEF 100
|
|
|
|
#ifndef _FALSE
|
|
|
|
#define _FALSE 0
|
|
|
|
#endif
|
|
|
|
#ifndef _TRUE
|
|
|
|
#define _TRUE 1
|
|
|
|
#endif
|
|
|
|
/* ---------------------- By compiler ---------------------- */
|
|
#ifndef GetTime
|
|
|
|
/* ---------------------- By compiler ---------------------- */
|
|
|
|
#ifdef __CODEVISIONAVR__ /* Check compiler */
|
|
|
|
#define GetTime() 0
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
#elif defined(__GNUC__) /* Check compiler */
|
|
|
|
#define GetTime() 0
|
|
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
|
|
#else
|
|
#endif /* __CODEVISIONAVR__ */
|
|
/* ------------------------------------------------------------------ */
|
|
|
|
#endif
|
|
|
|
/* --------------------------------------------------------- */
|
|
|
|
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Types ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
|
|
/* PID Mode */
|
|
typedef enum
|
|
{
|
|
|
|
_PID_MODE_MANUAL = 0,
|
|
_PID_MODE_AUTOMATIC = 1
|
|
|
|
}PIDMode_TypeDef;
|
|
|
|
/* PID P On x */
|
|
typedef enum
|
|
{
|
|
|
|
_PID_P_ON_M = 0, /* Proportional on Measurement */
|
|
_PID_P_ON_E = 1
|
|
|
|
}PIDPON_TypeDef;
|
|
|
|
/* PID Control direction */
|
|
typedef enum
|
|
{
|
|
|
|
_PID_CD_DIRECT = 0,
|
|
_PID_CD_REVERSE = 1
|
|
|
|
}PIDCD_TypeDef;
|
|
|
|
/* PID Structure */
|
|
typedef struct
|
|
{
|
|
|
|
PIDPON_TypeDef POnE;
|
|
PIDMode_TypeDef InAuto;
|
|
|
|
PIDPON_TypeDef POn;
|
|
PIDCD_TypeDef ControllerDirection;
|
|
|
|
uint32_t LastTime;
|
|
uint32_t SampleTime;
|
|
|
|
float DispKp;
|
|
float DispKi;
|
|
float DispKd;
|
|
|
|
float Kp;
|
|
float Ki;
|
|
float Kd;
|
|
|
|
float *MyInput;
|
|
float *MyOutput;
|
|
float *MySetpoint;
|
|
|
|
float OutputSum;
|
|
float LastInput;
|
|
|
|
float OutMin;
|
|
float OutMax;
|
|
|
|
}PID_TypeDef;
|
|
|
|
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Variables ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
|
|
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Enum ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
|
|
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Struct ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
|
|
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Class ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
|
|
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Prototype ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
|
|
/* :::::::::::::: Init ::::::::::::: */
|
|
void PID_Init(PID_TypeDef *uPID);
|
|
|
|
void PID(PID_TypeDef *uPID, float *Input, float *Output, float *Setpoint, float Kp, float Ki, float Kd, PIDPON_TypeDef POn, PIDCD_TypeDef ControllerDirection);
|
|
void PID2(PID_TypeDef *uPID, float *Input, float *Output, float *Setpoint, float Kp, float Ki, float Kd, PIDCD_TypeDef ControllerDirection);
|
|
|
|
/* ::::::::::: Computing ::::::::::: */
|
|
uint8_t PID_Compute(PID_TypeDef *uPID);
|
|
|
|
/* ::::::::::: PID Mode :::::::::::: */
|
|
void PID_SetMode(PID_TypeDef *uPID, PIDMode_TypeDef Mode);
|
|
PIDMode_TypeDef PID_GetMode(PID_TypeDef *uPID);
|
|
|
|
/* :::::::::: PID Limits ::::::::::: */
|
|
void PID_SetOutputLimits(PID_TypeDef *uPID, float Min, float Max);
|
|
|
|
/* :::::::::: PID Tunings :::::::::: */
|
|
void PID_SetTunings(PID_TypeDef *uPID, float Kp, float Ki, float Kd);
|
|
void PID_SetTunings2(PID_TypeDef *uPID, float Kp, float Ki, float Kd, PIDPON_TypeDef POn);
|
|
|
|
/* ::::::::: PID Direction ::::::::: */
|
|
void PID_SetControllerDirection(PID_TypeDef *uPID, PIDCD_TypeDef Direction);
|
|
PIDCD_TypeDef PID_GetDirection(PID_TypeDef *uPID);
|
|
|
|
/* ::::::::: PID Sampling :::::::::: */
|
|
void PID_SetSampleTime(PID_TypeDef *uPID, int32_t NewSampleTime);
|
|
|
|
/* ::::::: Get Tunings Param ::::::: */
|
|
float PID_GetKp(PID_TypeDef *uPID);
|
|
float PID_GetKi(PID_TypeDef *uPID);
|
|
float PID_GetKd(PID_TypeDef *uPID);
|
|
|
|
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ End of the program ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
|
|
|
|
#endif /* __PID_H_ */
|