電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>嵌入式開(kāi)發(fā)>STM32運(yùn)用之自平衡小車的PID算法封裝-求加精

STM32運(yùn)用之自平衡小車的PID算法封裝-求加精

2017-11-27 | rar | 1.3 MB | 次下載 | 免費(fèi)

資料介紹

繼卡爾曼封裝之后推出第二個(gè)封裝,PID算法,這個(gè)其實(shí)比上個(gè)簡(jiǎn)單多了下面貼出代碼
/**
??******************************************************************************
??* @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ù)編譯開(kāi)始
?
double PIDCalc(double NextPoint ,double SepLimit, PID *pp); ??//帶積分分離的PID運(yùn)算
?
#else
?
double PIDCalc( double NextPoint, PID *pp); ????//不帶積分分離的PID運(yùn)算
?
#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控制運(yùn)算
* ???????入口參數(shù): PID *pp ?- 定義的運(yùn)算所需變量的結(jié)構(gòu)體
* ??????????????????????????NextPoint - 負(fù)反饋輸入值
* ??????????????????????????SepLimit ?- 積分分離上限
* ???????出口參數(shù): 返回PID控制量
* ???????說(shuō) ???明: 默認(rèn)不進(jìn)行積分分離,如果用戶需要使用積分分離,需在PID_Control.h中
* ???????????????????????????????將 #define IF_THE_INTEGRAL_SEPARATION ?0 ?改為
* ???????????????????????????#define IF_THE_INTEGRAL_SEPARATION ?1
* ???????調(diào)用方法: 進(jìn)行積分分離時(shí)入口參數(shù)為3個(gè),具體方法如下:
* ???????????????????????????????PID PIDControlStruct ; ??//定義PID運(yùn)算結(jié)構(gòu)體
* ???????????????????????????????PIDInit(50, 0.24, 0.04, 0.2, &PIDControlStruct);//結(jié)構(gòu)體初始化,注意&符號(hào)不能省
* ???????????????????????????????ControlData = PIDCalc(ReadData, 200, &PIDControlStruct); ??//控制量 = PIDCalc(反饋值,積分分離上限,PID運(yùn)算結(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)偏差小于分離上限,積分項(xiàng)不分離
????????{
????????????????Flag = 1;
????????????????pp->SumError += Error; ????????// 積分 ?
????????}
????????dError = pp->LastError - pp->PrevError; ????????// 當(dāng)前微分
????????pp->PrevError = pp->LastError;
????????pp->LastError = Error; ?
????????return (
????????????????pp->Proportion ???????????????* ???????????????Error ????????????????// 比例項(xiàng)
????????????????+ Flag * pp->Integral ???????* ???????????????pp->SumError ????????// 積分項(xiàng)
????????????????+ pp->Derivative ???????????????* ???????????????dError ????????????????// 微分項(xiàng)
????????????????);
}
?
#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 ???????????????// 比例項(xiàng)
????????????????+ pp->Integral ???????????????* ???????pp->SumError ????????// 積分項(xiàng)
????????????????+ pp->Derivative ???????* ???????dError ????????// 微分項(xiàng)
????????????????);
}
?
#endif
?
?
/*************************************************************************************
* ???????名 ???稱: double PIDCalc( PID *pp, double NextPoint ,double SepLimit)
* ???????功 ???能: PID初始化設(shè)定
* ???????入口參數(shù): PID *pp ?- 定義的運(yùn)算所需變量的結(jié)構(gòu)體
* ??????????????????????????SetPoint - 設(shè)定的目標(biāo)值
* ??????????????????????????Proportion,Integral ,Derivative - P,I,D系數(shù)
* ???????出口參數(shù): 無(wú)
* ???????說(shuō) ???明: ???????
* ???????調(diào)用方法: ?PID PIDControlStruct ; ??//定義PID運(yùn)算結(jié)構(gòu)體
* ???????????????????????????????PIDInit(50, 0.24, 0.04, 0.2, &PIDControlStruct);//結(jié)構(gòu)體初始化,注意&符號(hào)不能省
* ???????????????????????????????因?yàn)楹瘮?shù)需要傳入一個(gè)指針,需要對(duì)結(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平臺(tái)中調(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);
?
????????}
}
?
下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1TC358743XBG評(píng)估板參考手冊(cè)
  2. 1.36 MB  |  330次下載  |  免費(fèi)
  3. 2開(kāi)關(guān)電源基礎(chǔ)知識(shí)
  4. 5.73 MB  |  6次下載  |  免費(fèi)
  5. 3100W短波放大電路圖
  6. 0.05 MB  |  4次下載  |  3 積分
  7. 4嵌入式linux-聊天程序設(shè)計(jì)
  8. 0.60 MB  |  3次下載  |  免費(fèi)
  9. 5基于FPGA的光纖通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
  10. 0.61 MB  |  2次下載  |  免費(fèi)
  11. 6基于FPGA的C8051F單片機(jī)開(kāi)發(fā)板設(shè)計(jì)
  12. 0.70 MB  |  2次下載  |  免費(fèi)
  13. 751單片機(jī)窗簾控制器仿真程序
  14. 1.93 MB  |  2次下載  |  免費(fèi)
  15. 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
  16. 0.86 MB  |  2次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33564次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21548次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
  16. 0.00 MB  |  6653次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537796次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191185次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183278次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)