Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
HbAttitude.cpp
- Committer:
- MasashiNomura
- Date:
- 2018-12-20
- Revision:
- 32:7f4145cc3551
- Parent:
- 31:56c554c560c1
- Child:
- 47:d3fa874f336e
File content as of revision 32:7f4145cc3551:
#include "HbAttitude.h" #include "globalFlags.h" //========================================================= //PID制御 //========================================================= float HbAttitude::pid(float iCmdAng, float iCurAng , float iRate) { //エラー量:指令値との差を求める float errAng = iCmdAng - iCurAng; //アウターループのPゲインを掛けて目標角速度とする float cmdRate= errAng * p; //▼角速度偏差(指令値と現在値との差) float devRate = cmdRate - iRate ; //▼比例項 float clcP = devRate * kp; //▼積分項 float xi = ki * devRate; //係数をかける float tmpInteg = sum + xi;//積分して //リミット掛ける if(tmpInteg > limitH){tmpInteg = limitH;} if(tmpInteg < limitL){tmpInteg = limitL;} //積分値を次回計算用に保存 sum = tmpInteg; //▼微分項 float clcD = kd * (devRate - old); //過去データ書き換え old = devRate; // return clcP + tmpInteg + clcD; } //========================================================= //PID制御+トルク //========================================================= float HbAttitude::pid2(float iCmdAng, float iCurAng , float iRate) { //エラー量:指令値との差を求める float errAng = iCmdAng - iCurAng; //アウターループPpゲインを掛けて、角速度にkvゲインをかけて、目標角速度とする float AngVelo = (iCurAng - oAng) * 50;//サンプリング周期をかけて、角速度(deg/s)に float cmdRate= errAng * p - AngVelo * kv; //▼角速度偏差(指令値と現在値との差) float devRate = cmdRate - iRate ; //▼比例項 float clcP = devRate * kp; //▼積分項 float xi = ki * devRate; //係数をかける float tmpInteg = sum + xi;//積分して //リミット掛ける if(tmpInteg > limitH){tmpInteg = limitH;} if(tmpInteg < limitL){tmpInteg = limitL;} //積分値を次回計算用に保存 sum = tmpInteg; //▼微分項 float clcD = kd * (devRate - old); // 過去データ書き換え old = devRate; oAng = iCurAng; // return clcP + tmpInteg + clcD; //return cmdRate; } //========================================================= //パラメータゲッター //========================================================= float HbAttitude::getPp(){return p;} float HbAttitude::getP() {return kp;} float HbAttitude::getI() {return ki;} float HbAttitude::getD() {return kd;} //float HbAttitude::getT() {return kt;} float HbAttitude::getV() {return kv;} //========================================================= //パラメータセッター //========================================================= void HbAttitude::setPp(float iPp){p = iPp;} void HbAttitude::setP(float iP) {kp= iP;} void HbAttitude::setI(float iI) {ki= iI;} void HbAttitude::setD(float iD) {kd= iD;} //void HbAttitude::setT(float iT){kt = iT;} void HbAttitude::setV(float iV){kv = iV;} void HbAttitude::setIMax(float val){limitH = val;} void HbAttitude::setIMin(float val){limitL = val;} //========================================================= //コンストラクタ //========================================================= HbAttitude::HbAttitude(float iPo , float iP , float iI , float iD){ //パラメータ初期化 p =iPo ;//アウターループP制御系数 kp =iP ;//インナーループP制御系数 ki =iI ;//インナーループI制御系数 kd =iD ;//インナーループD制御系数 limitH=2000 ;//積分上限 limitL=-2000;// sum =0 ;//積分値 old =0 ;//1サンプル前のデータ(微分用) oAng = 0 ;//1サンプル前の角度 }