this code is for inverted pendulum balancer. it is based on two-loop PID controller. One controller is for Angle and another one is for velocity.

Dependencies:   HCSR04 L298HBridge mbed

PID/PID.h

Committer:
dudu941014
Date:
2017-08-25
Revision:
0:489498e8dae5

File content as of revision 0:489498e8dae5:

//////////////////////////////////////////////////////////////////////////////////
// Company: edinburgh of university
// Engineer: ZEjun DU
// 
// Create Date: 2017/08/20 13:06:52
// Design Name: Inverted Pendulum Balancer
// Module Name: basic PID algorithm
// Tool Versions: “Keil 5” or “Mbed Complie Online”
// Description: this part is to build the basic PID control theroy
//                           
// 
//////////////////////////////////////////////////////////////////////////////////

#include "mbed.h"

////////////////////////////////////////////////////////////
//the D term is very sensitive, this part is to filter the D term 
//but the effect of this function is not obvious
////////////////////////////////////////////////////////////

// Examples for _filter:
// f_cut = 10 Hz -> _filter = 15.9155e-3
// f_cut = 15 Hz -> _filter = 10.6103e-3
// f_cut = 20 Hz -> _filter =  7.9577e-3
// f_cut = 25 Hz -> _filter =  6.3662e-3
// f_cut = 30 Hz -> _filter =  5.3052e-3
#define PID_D_TERM_FILTER 0.00795770f    // 20hz filter on D term
//#define PID_D_TERM_FILTER 0.0063662f    // 30hz filter on D term
//#define PID_D_TERM_FILTER 0.0f    // no filter on D term

typedef struct
{
    float kp;
    float ki;
    float kd;
    float desired;
    float prevError;
    float error;
    float integ;
    float deri; 
    float prevDeri;
    float outP;
    float outI;
    float outD;
    float iLimit;
    float iLimitLow;
    float dt;
}PidObject;

float show_I_term(void);
void pidInit(PidObject* pid, const float desired, const float kp,const float ki, const float kd, const float iLimit, const float dt);
float get_p(PidObject* pid);
float get_i(PidObject* pid, float distance);
float get_d(PidObject* pid);

float get_pid_vel(PidObject* pid, float distance);

float get_pid(PidObject* pid);
void pidReset(PidObject* pid);
void pidSetError(PidObject* pid, const float error);
void pidSetDesired(PidObject* pid, const float desired);