資料介紹
繼卡爾曼封裝之后推出第二個封裝,PID算法,這個其實比上個簡單多了下面貼出代碼
/**
??******************************************************************************
??* @file ???PID_Control.h
??* @author ?willieon
??* @version V0.1
??* @date ???January-2015
??* @brief ??PID控制算法頭文件
??* ???????????????????????定義結(jié)構(gòu)體類型以及聲明函數(shù)
??* ???????????????????????#define IF_THE_INTEGRAL_SEPARATION ?0/1 ?為積分分離標(biāo)志
??******************************************************************************
??**/
?
#ifndef __PID_CONTROL_H__
#define __PID_CONTROL_H__
?
#define IF_THE_INTEGRAL_SEPARATION ?0 ???
//#define IF_THE_INTEGRAL_SEPARATION ?1 ??//是否積分分離 ?0-不分離,1 -分離
?
typedef struct
{
????????double SetPoint; // 設(shè)定目標(biāo) Desired Value ??
????????double Proportion; // 比例常數(shù) Proportional Const
????????double Integral; // 積分常數(shù) Integral Const
????????double Derivative; // 微分常數(shù) Derivative Const ??
????????double LastError; // Error[-1]
????????double PrevError; // Error[-2]
????????double SumError; // Sums of Errors ?
}PID;
?
#if IF_THE_INTEGRAL_SEPARATION ???????????//是否積分分離預(yù)編譯開始
?
double PIDCalc(double NextPoint ,double SepLimit, PID *pp); ??//帶積分分離的PID運算
?
#else
?
double PIDCalc( double NextPoint, PID *pp); ????//不帶積分分離的PID運算
?
#endif ???????//是否積分分離預(yù)編譯結(jié)束
?
void PIDInit (double SetPoint, double Proportion, double Integral, double Derivative, PID *pp);
?
#endif
/**
??******************************************************************************
??* @file ???PID_Control.c
??* @author ?willieon
??* @version V0.1
??* @date ???January-2015
??* @brief ??PID控制算法函數(shù)代碼
??* ???????
??*
??******************************************************************************
??**/
?
#include "PID_Control.h"
#include "math.h"
?
/*************************************************************************************
* ???????名 ???稱: double PIDCalc( PID *pp, double NextPoint ,double SepLimit)
* ???????功 ???能: PID控制運算
* ???????入口參數(shù): PID *pp ?- 定義的運算所需變量的結(jié)構(gòu)體
* ??????????????????????????NextPoint - 負反饋輸入值
* ??????????????????????????SepLimit ?- 積分分離上限
* ???????出口參數(shù): 返回PID控制量
* ???????說 ???明: 默認不進行積分分離,如果用戶需要使用積分分離,需在PID_Control.h中
* ???????????????????????????????將 #define IF_THE_INTEGRAL_SEPARATION ?0 ?改為
* ???????????????????????????#define IF_THE_INTEGRAL_SEPARATION ?1
* ???????調(diào)用方法: 進行積分分離時入口參數(shù)為3個,具體方法如下:
* ???????????????????????????????PID PIDControlStruct ; ??//定義PID運算結(jié)構(gòu)體
* ???????????????????????????????PIDInit(50, 0.24, 0.04, 0.2, &PIDControlStruct);//結(jié)構(gòu)體初始化,注意&符號不能省
* ???????????????????????????????ControlData = PIDCalc(ReadData, 200, &PIDControlStruct); ??//控制量 = PIDCalc(反饋值,積分分離上限,PID運算結(jié)構(gòu)體)
*
***************************************************************************************
*/
?
#if IF_THE_INTEGRAL_SEPARATION
?
double PIDCalc(double NextPoint ,double SepLimit, PID *pp)
{
????????double dError, Error,Flag; ??
????????Error = pp->SetPoint - NextPoint; ????????// 偏差
????????if(abs(Error) > SepLimit) ???????//當(dāng)偏差大于分離上限積分分離
????????{
????????????????Flag = 0;
????????}
????????else ??????//當(dāng)偏差小于分離上限,積分項不分離
????????{
????????????????Flag = 1;
????????????????pp->SumError += Error; ????????// 積分 ?
????????}
????????dError = pp->LastError - pp->PrevError; ????????// 當(dāng)前微分
????????pp->PrevError = pp->LastError;
????????pp->LastError = Error; ?
????????return (
????????????????pp->Proportion ???????????????* ???????????????Error ????????????????// 比例項
????????????????+ Flag * pp->Integral ???????* ???????????????pp->SumError ????????// 積分項
????????????????+ pp->Derivative ???????????????* ???????????????dError ????????????????// 微分項
????????????????);
}
?
#else
?
double PIDCalc( double NextPoint, PID *pp)
{ ?
????????double dError, Error; ??
????????Error = pp->SetPoint - NextPoint; ????????????????????????// 偏差
????????pp->SumError += Error; ???????????????????????????????????????// 積分 ?
????????dError = pp->LastError - pp->PrevError; ???????????????// 當(dāng)前微分
????????pp->PrevError = pp->LastError;
????????pp->LastError = Error; ?
????????return (pp->Proportion ???????* ???????Error ???????????????// 比例項
????????????????+ pp->Integral ???????????????* ???????pp->SumError ????????// 積分項
????????????????+ pp->Derivative ???????* ???????dError ????????// 微分項
????????????????);
}
?
#endif
?
?
/*************************************************************************************
* ???????名 ???稱: double PIDCalc( PID *pp, double NextPoint ,double SepLimit)
* ???????功 ???能: PID初始化設(shè)定
* ???????入口參數(shù): PID *pp ?- 定義的運算所需變量的結(jié)構(gòu)體
* ??????????????????????????SetPoint - 設(shè)定的目標(biāo)值
* ??????????????????????????Proportion,Integral ,Derivative - P,I,D系數(shù)
* ???????出口參數(shù): 無
* ???????說 ???明: ???????
* ???????調(diào)用方法: ?PID PIDControlStruct ; ??//定義PID運算結(jié)構(gòu)體
* ???????????????????????????????PIDInit(50, 0.24, 0.04, 0.2, &PIDControlStruct);//結(jié)構(gòu)體初始化,注意&符號不能省
* ???????????????????????????????因為函數(shù)需要傳入一個指針,需要對結(jié)構(gòu)體取首地址傳給指針
*
***************************************************************************************
*/
?
?
void PIDInit (double SetPoint, double Proportion, double Integral, double Derivative, PID *pp)
{ ?
????????pp -> SetPoint = SetPoint; // 設(shè)定目標(biāo) Desired Value ??
????????pp -> Proportion = Proportion; // 比例常數(shù) Proportional Const
????????pp -> Integral = Integral; // 積分常數(shù) Integral Const
????????pp -> Derivative = Derivative; // 微分常數(shù) Derivative Const ??
????????pp -> LastError = 0; // Error[-1]
????????pp -> PrevError = 0; // Error[-2]
????????pp -> SumError = 0; // Sums of Errors
?
????????//memset ( pp,0,sizeof(struct PID)); ??//need include "string.h"
}
將前篇 卡爾曼 和本次的 PID放在一起,在VS2010平臺中調(diào)試 代碼如下
#include "kalman.h"
?
#include "stdio.h"
#include "stdlib.h"
#include "PID_Control.h"
?
void main(void)
?
{
????????KalmanCountData k;
????????PID PIDControlStruct;
????????Kalman_Filter_Init(&k);
????????PIDInit(50, 1, 0.04, 0.2, &PIDControlStruct);
????????int m,n;
?
????????double out;
?
????????for(int a = 0;a<80;a++)
????????{
????????????????m = 1+ rand() %100;
????????????????n = 1+ rand() %100;
????????????????Kalman_Filter((float)m,(float)n,&k);
????????????????out = PIDCalc(k.Angle_Final, &PIDControlStruct);
????????????????printf("%3d and %3d is %6f -pid- %6f\r\n",m,n,k.Angle_Final,out);
?
????????}
}
?
/**
??******************************************************************************
??* @file ???PID_Control.h
??* @author ?willieon
??* @version V0.1
??* @date ???January-2015
??* @brief ??PID控制算法頭文件
??* ???????????????????????定義結(jié)構(gòu)體類型以及聲明函數(shù)
??* ???????????????????????#define IF_THE_INTEGRAL_SEPARATION ?0/1 ?為積分分離標(biāo)志
??******************************************************************************
??**/
?
#ifndef __PID_CONTROL_H__
#define __PID_CONTROL_H__
?
#define IF_THE_INTEGRAL_SEPARATION ?0 ???
//#define IF_THE_INTEGRAL_SEPARATION ?1 ??//是否積分分離 ?0-不分離,1 -分離
?
typedef struct
{
????????double SetPoint; // 設(shè)定目標(biāo) Desired Value ??
????????double Proportion; // 比例常數(shù) Proportional Const
????????double Integral; // 積分常數(shù) Integral Const
????????double Derivative; // 微分常數(shù) Derivative Const ??
????????double LastError; // Error[-1]
????????double PrevError; // Error[-2]
????????double SumError; // Sums of Errors ?
}PID;
?
#if IF_THE_INTEGRAL_SEPARATION ???????????//是否積分分離預(yù)編譯開始
?
double PIDCalc(double NextPoint ,double SepLimit, PID *pp); ??//帶積分分離的PID運算
?
#else
?
double PIDCalc( double NextPoint, PID *pp); ????//不帶積分分離的PID運算
?
#endif ???????//是否積分分離預(yù)編譯結(jié)束
?
void PIDInit (double SetPoint, double Proportion, double Integral, double Derivative, PID *pp);
?
#endif
/**
??******************************************************************************
??* @file ???PID_Control.c
??* @author ?willieon
??* @version V0.1
??* @date ???January-2015
??* @brief ??PID控制算法函數(shù)代碼
??* ???????
??*
??******************************************************************************
??**/
?
#include "PID_Control.h"
#include "math.h"
?
/*************************************************************************************
* ???????名 ???稱: double PIDCalc( PID *pp, double NextPoint ,double SepLimit)
* ???????功 ???能: PID控制運算
* ???????入口參數(shù): PID *pp ?- 定義的運算所需變量的結(jié)構(gòu)體
* ??????????????????????????NextPoint - 負反饋輸入值
* ??????????????????????????SepLimit ?- 積分分離上限
* ???????出口參數(shù): 返回PID控制量
* ???????說 ???明: 默認不進行積分分離,如果用戶需要使用積分分離,需在PID_Control.h中
* ???????????????????????????????將 #define IF_THE_INTEGRAL_SEPARATION ?0 ?改為
* ???????????????????????????#define IF_THE_INTEGRAL_SEPARATION ?1
* ???????調(diào)用方法: 進行積分分離時入口參數(shù)為3個,具體方法如下:
* ???????????????????????????????PID PIDControlStruct ; ??//定義PID運算結(jié)構(gòu)體
* ???????????????????????????????PIDInit(50, 0.24, 0.04, 0.2, &PIDControlStruct);//結(jié)構(gòu)體初始化,注意&符號不能省
* ???????????????????????????????ControlData = PIDCalc(ReadData, 200, &PIDControlStruct); ??//控制量 = PIDCalc(反饋值,積分分離上限,PID運算結(jié)構(gòu)體)
*
***************************************************************************************
*/
?
#if IF_THE_INTEGRAL_SEPARATION
?
double PIDCalc(double NextPoint ,double SepLimit, PID *pp)
{
????????double dError, Error,Flag; ??
????????Error = pp->SetPoint - NextPoint; ????????// 偏差
????????if(abs(Error) > SepLimit) ???????//當(dāng)偏差大于分離上限積分分離
????????{
????????????????Flag = 0;
????????}
????????else ??????//當(dāng)偏差小于分離上限,積分項不分離
????????{
????????????????Flag = 1;
????????????????pp->SumError += Error; ????????// 積分 ?
????????}
????????dError = pp->LastError - pp->PrevError; ????????// 當(dāng)前微分
????????pp->PrevError = pp->LastError;
????????pp->LastError = Error; ?
????????return (
????????????????pp->Proportion ???????????????* ???????????????Error ????????????????// 比例項
????????????????+ Flag * pp->Integral ???????* ???????????????pp->SumError ????????// 積分項
????????????????+ pp->Derivative ???????????????* ???????????????dError ????????????????// 微分項
????????????????);
}
?
#else
?
double PIDCalc( double NextPoint, PID *pp)
{ ?
????????double dError, Error; ??
????????Error = pp->SetPoint - NextPoint; ????????????????????????// 偏差
????????pp->SumError += Error; ???????????????????????????????????????// 積分 ?
????????dError = pp->LastError - pp->PrevError; ???????????????// 當(dāng)前微分
????????pp->PrevError = pp->LastError;
????????pp->LastError = Error; ?
????????return (pp->Proportion ???????* ???????Error ???????????????// 比例項
????????????????+ pp->Integral ???????????????* ???????pp->SumError ????????// 積分項
????????????????+ pp->Derivative ???????* ???????dError ????????// 微分項
????????????????);
}
?
#endif
?
?
/*************************************************************************************
* ???????名 ???稱: double PIDCalc( PID *pp, double NextPoint ,double SepLimit)
* ???????功 ???能: PID初始化設(shè)定
* ???????入口參數(shù): PID *pp ?- 定義的運算所需變量的結(jié)構(gòu)體
* ??????????????????????????SetPoint - 設(shè)定的目標(biāo)值
* ??????????????????????????Proportion,Integral ,Derivative - P,I,D系數(shù)
* ???????出口參數(shù): 無
* ???????說 ???明: ???????
* ???????調(diào)用方法: ?PID PIDControlStruct ; ??//定義PID運算結(jié)構(gòu)體
* ???????????????????????????????PIDInit(50, 0.24, 0.04, 0.2, &PIDControlStruct);//結(jié)構(gòu)體初始化,注意&符號不能省
* ???????????????????????????????因為函數(shù)需要傳入一個指針,需要對結(jié)構(gòu)體取首地址傳給指針
*
***************************************************************************************
*/
?
?
void PIDInit (double SetPoint, double Proportion, double Integral, double Derivative, PID *pp)
{ ?
????????pp -> SetPoint = SetPoint; // 設(shè)定目標(biāo) Desired Value ??
????????pp -> Proportion = Proportion; // 比例常數(shù) Proportional Const
????????pp -> Integral = Integral; // 積分常數(shù) Integral Const
????????pp -> Derivative = Derivative; // 微分常數(shù) Derivative Const ??
????????pp -> LastError = 0; // Error[-1]
????????pp -> PrevError = 0; // Error[-2]
????????pp -> SumError = 0; // Sums of Errors
?
????????//memset ( pp,0,sizeof(struct PID)); ??//need include "string.h"
}
將前篇 卡爾曼 和本次的 PID放在一起,在VS2010平臺中調(diào)試 代碼如下
#include "kalman.h"
?
#include "stdio.h"
#include "stdlib.h"
#include "PID_Control.h"
?
void main(void)
?
{
????????KalmanCountData k;
????????PID PIDControlStruct;
????????Kalman_Filter_Init(&k);
????????PIDInit(50, 1, 0.04, 0.2, &PIDControlStruct);
????????int m,n;
?
????????double out;
?
????????for(int a = 0;a<80;a++)
????????{
????????????????m = 1+ rand() %100;
????????????????n = 1+ rand() %100;
????????????????Kalman_Filter((float)m,(float)n,&k);
????????????????out = PIDCalc(k.Angle_Final, &PIDControlStruct);
????????????????printf("%3d and %3d is %6f -pid- %6f\r\n",m,n,k.Angle_Final,out);
?
????????}
}
?
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- STM32平衡小車原理圖 1次下載
- 平衡小車與電機PID系列教程 29次下載
- stm32平衡小車 51次下載
- 基于STM32的自平衡小車DIY
- 【STM32】兩輪自平衡小車學(xué)習(xí)筆記1
- 畢設(shè)分享:基于STM32兩輪自平衡小車 含源碼、原理圖及PCB文件
- STM32智能平衡小車詳細電路原理圖 196次下載
- 使用PID設(shè)計兩輪智能平衡小車的資料合集 35次下載
- 使用STM32單片機實現(xiàn)雙輪自平衡智能小車的設(shè)計與實現(xiàn)學(xué)習(xí)PPT課件 4次下載
- 兩輪自平衡智能小車的資料合集免費下載 52次下載
- 設(shè)計一個平衡智能小車的全套資料合集 24次下載
- STM32運用之自平衡小車的卡爾曼算法封裝 8次下載
- 基于滑膜干擾抑制的兩輪小車自平衡控制算法_陳運勝 3次下載
- 兩輪自平衡小車的設(shè)計與實現(xiàn) 20次下載
- 兩輪自平衡小車資料 30次下載
- 基于R128開發(fā)板的自平衡賽車機器人設(shè)計 960次閱讀
- 基于FPGA的平衡小車設(shè)計 851次閱讀
- 基于STM32的兩輪平衡小車設(shè)計 3266次閱讀
- PID控制算法代碼 PID控制算法的原理 2809次閱讀
- 烤箱自平衡門鉸鏈機構(gòu)的設(shè)計 1760次閱讀
- PID控制算法基本原理 1.1w次閱讀
- PID控制算法詳解 1.3w次閱讀
- 位置式PID算法和增量式PID算法的差異 1.3w次閱讀
- PID控制算法原理、方法概述 9579次閱讀
- 自動化控制PID到底是啥趣味講解資料說明 6230次閱讀
- 詳細分析PID控制算法原理和調(diào)試口訣 2.1w次閱讀
- 基于STC12C5A60S2單片機及PID控制算法的氣味循跡車設(shè)計 3248次閱讀
- 白平衡幾種算法總結(jié) 2.2w次閱讀
- 基于STM32和MPU-6050的兩輪自平衡小車系統(tǒng)設(shè)計與實現(xiàn) 3.1w次閱讀
- 新手入門超聲自平衡小車最佳方案 1.3w次閱讀
下載排行
本周
- 1EMC電路設(shè)計工程師必備的EMC基礎(chǔ)
- 0.42 MB | 4次下載 | 2 積分
- 2AU3116 2×60W模擬輸入雙通道Class-D 音頻功率放大器數(shù)據(jù)手冊
- 1.19 MB | 1次下載 | 免費
- 3低壓降肖特基整流管SR340L數(shù)據(jù)手冊
- 0.78 MB | 1次下載 | 免費
- 4ZX8002E 觸摸調(diào)光LED集成IC數(shù)據(jù)手冊
- 2.27 MB | 次下載 | 免費
- 5SOD-323塑料封裝ESD保護二極管SD05T系列規(guī)格書
- 1.07 MB | 次下載 | 免費
- 6SOT-23塑料封裝ESD保護二極管SMxx Series系列規(guī)格書
- 0.93 MB | 次下載 | 免費
- 7高效率整流二極管HER151 THRU HER158數(shù)據(jù)手冊
- 0.54 MB | 次下載 | 免費
- 8低壓降肖特基整流管SL22 THRU SL210數(shù)據(jù)手冊
- 1.03 MB | 次下載 | 免費
本月
- 1三相逆變主電路的原理圖和PCB資料合集免費下載
- 27.35 MB | 111次下載 | 1 積分
- 2運算放大器基本電路中文資料
- 1.30 MB | 16次下載 | 免費
- 3蘋果iphone 11電路原理圖
- 4.98 MB | 11次下載 | 5 積分
- 4TL494工業(yè)用開關(guān)電源原理圖資料
- 0.22 MB | 10次下載 | 1 積分
- 5常用電子元器件介紹
- 3.21 MB | 8次下載 | 免費
- 6QW2893應(yīng)急燈專用檢測芯片
- 590.40 KB | 4次下載 | 免費
- 7相關(guān)協(xié)議信號總結(jié)
- 0.94 MB | 4次下載 | 免費
- 8EMC電路設(shè)計工程師必備的EMC基礎(chǔ)
- 0.42 MB | 4次下載 | 2 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935130次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191390次下載 | 10 積分
- 5十天學(xué)會AVR單片機與C語言視頻教程 下載
- 158M | 183344次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81591次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73815次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65989次下載 | 10 積分
評論