一阶惯性环节pid参数整定_一阶惯性环节转折频率

一阶惯性环节pid参数整定_一阶惯性环节转折频率//—————————————————————————#ifndefUnit1H#defineUnit1H//—————————————————————————#include#in

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Chart.hpp>
#include <ExtCtrls.hpp>
#include <Series.hpp>
#include <TeEngine.hpp>
#include <TeeProcs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TButton *Button1;
        TChart *Chart1;
        TLineSeries *Series1;
        TChart *Chart2;
        TLineSeries *Series2;
        TEdit *Edit1;
        TEdit *Edit2;
        TEdit *Edit3;
        TEdit *Edit4;
        TEdit *Edit5;
        TEdit *Edit6;
        TLabel *Label1;
        TLabel *Label2;
        TLabel *Label3;
        TLabel *Label4;
        TLabel *Label5;
        TLabel *Label6;
        TButton *Button2;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
private:	// User declarations
public:		// User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

2.Unit1.cpp

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "File1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   Edit1->Text = 1.5;           //控制参数
   Edit2->Text = 0.5;
   Edit3->Text = 0.1;
   Edit4->Text = 3;
   Edit5->Text = 0.3;
   Edit6->Text = 20;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   double Kp = Edit1->Text.ToDouble();
   double Ki = Edit2->Text.ToDouble();
   double Kd = Edit3->Text.ToDouble();

   double T = Edit4->Text.ToDouble();
   double Ts = Edit5->Text.ToDouble();
   double Signal = Edit6->Text.ToDouble();

   CIncrementalPID IPID(Kp,Ki,Kd);
   CPositionalPID  PPID(Kp,Ki,Kd);

   Series1->Clear() ;
   Series2->Clear() ;
   for(int i = 0; i < 200 ;i++)
   {
      IPID.SetStepSignal(Signal);
      IPID.SetInertiaTime(T,Ts);
      PPID.SetStepSignal(Signal);
      PPID.SetInertiaTime(T,Ts);

      Series1->AddXY(i,IPID.SystemOutput,"",clRed );
      Series2->AddXY(i,PPID.SystemOutput,"",clBlue );
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  Close();
}
//---------------------------------------------------------------------------

3.File1.h

#ifndef CPID_H
#define CPID_H
/*****************************************************************
#                      增量式PID系统                              #
#*****************************************************************/
class CIncrementalPID
{
public:
   CIncrementalPID(double P, double I, double D);
   ~CIncrementalPID(){}
private:
   double  Kp;
   double  Ki;
   double  Kd;

   double  PIDOutput;            //PID控制器输出
   double  LastSystemOutput;     //上次系统输出值

   double  Error;                //输出值与输入值的偏差
   double  LastError;
   double  LastLastError;
public:
   double  SystemOutput;         //系统输出值
   void    SetStepSignal(double StepSignal);
   void    SetInertiaTime(double InertiaTime,double SampleTime);
};

/******************************************************************
#                      位置式PID系统                               #
# *****************************************************************/
class CPositionalPID
{
public:
   CPositionalPID(double P, double I, double D);
   ~CPositionalPID(){}
private:
   double  Kp;
   double  Ki;
   double  Kd;

   double  ResultValueBack;
   double  PidOutput;

   double  PIDErrADD;
   double  ErrBack;
public:
   double  SystemOutput;
   void    SetStepSignal(double StepSignal);
   void    SetInertiaTime(double InertiaTime,double SampleTime);
};

#endif






4.File1.cpp

#include "File1.h"
CIncrementalPID::CIncrementalPID(double P, double I, double D)
{
   Kp = P;
   Ki = I;
   Kd = D;

   PIDOutput = 0.0;             //PID控制器输出
   SystemOutput = 0.0;          //系统输出值
   LastSystemOutput = 0.0;      //上次系统输出值

   Error = 0.0;                 //输出值与输入值的偏差
   LastError = 0.0;
   LastLastError = 0.0;
}

//设置PID控制器参数
void CIncrementalPID::SetStepSignal(double StepSignal)
{
   Error = StepSignal - SystemOutput;
   double IncrementValue = Kp * (Error - LastError) + Ki * Error + Kd * (Error - 2 * LastError + LastLastError);
   PIDOutput += IncrementValue;
   LastLastError = LastError;
   LastError = Error;
}

//设置一阶惯性环节系统  其中InertiaTime为惯性时间常数
void CIncrementalPID::SetInertiaTime(double InertiaTime,double SampleTime)
{
   SystemOutput = (InertiaTime * LastSystemOutput + SampleTime * PIDOutput) / (SampleTime + InertiaTime);
   LastSystemOutput = SystemOutput;
}

/********************************************************************
#                      位置式PID系统                                #
# ******************************************************************/
CPositionalPID::CPositionalPID(double P, double I, double D)
{
   Kp = P;
   Ki = I;
   Kd = D;

   SystemOutput = 0.0;
   ResultValueBack = 0.0;
   PidOutput = 0.0;
   PIDErrADD = 0.0;
   ErrBack = 0.0;
}

//设置PID控制器参数
void CPositionalPID::SetStepSignal(double StepSignal)
{
   double Err = StepSignal - SystemOutput;
   double KpWork = Kp * Err;
   double KiWork = Ki * PIDErrADD;
   double KdWork = Kd * (Err - ErrBack);
   PidOutput = KpWork + KiWork + KdWork;
   PIDErrADD += Err;
   ErrBack = Err;
}
//设置一阶惯性环节系统  其中InertiaTime为惯性时间常数
void CPositionalPID::SetInertiaTime(double InertiaTime,double SampleTime)
{
   SystemOutput = (InertiaTime * ResultValueBack + SampleTime * PidOutput) / (SampleTime + InertiaTime);
   ResultValueBack = SystemOutput;
}


5.实现效果:

一阶惯性环节pid参数整定_一阶惯性环节转折频率

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/185959.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • mysql 主从1146_mysql 主从复制1146错误处理办法

    mysql 主从1146_mysql 主从复制1146错误处理办法错误现象:Replicate_Wild_Ignore_Table:Last_Errno:1146Last_Error:Error’Table’mydb.test1146’doesn’texist’onquery.Defaultdatabase:’mydb’.Query:’insertintotest1146values(‘bigdiao’)’方法一、在slave上重…

  • PHP headers_sent() 函数

    PHP headers_sent() 函数

  • sudoers修改_ubuntu sudoers 文件修改「建议收藏」

    sudoers修改_ubuntu sudoers 文件修改「建议收藏」自己作死,没有用visudo修改/etc/sudoers文件,结果导致sudoers文件出错,sudo无法使用。在网上找了一圈才搞好,哎!首先,不要慌,重启电脑,切换到recovery模式:###########开机后长按shift键,进入选择启动的界面光标移动到advance模式(14.04是第二排的)按enter进入后,选择recoverymode切换到rootroot@use…

  • 分享社群规划全流程sop(基础搭建、日常维…

    分享社群规划全流程sop(基础搭建、日常维…无套路,纯分享!全套社群运营文档,可学习套用相信不少做社群运营的朋友一定会出现过这种情况,微信社群或者QQ社群内的群成员不活跃,整天群里犹如一潭死水,此外还有运营目标不明确、成员不愿积极发言、大部分人入群从不说话等等问题。作为运营狗一定要学会社群规划,今天就给大家带来一份【社群规划全流程sop】,主要包含基础搭建、日常维护、增留转、互动案例等四个步骤,每个步骤都有详细的规划讲解,以及相关案例,非常值得参考学习使用。社群规划全流程sop社群规划全流程sop社…

  • Dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢?

    Dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢?面试题dubbo负载均衡策略和集群容错策略都有哪些?动态代理策略呢?面试官心理分析继续深问吧,这些都是用dubbo必须知道的一些东西,你得知道基本原理,知道序列化是什么协议,还得知道具体用dubbo的时候,如何负载均衡,如何高可用,如何动态代理。说白了,就是看你对dubbo熟悉不熟悉:dubbo工作原理:服务注册、注册中心、消费者、代理通信、负载均衡; 网络通…

  • RANSAC算法理解

    最早应该是十四讲上见过,在第九章的project中src中的visual_odometry.cpp中,最核心的求解3d-2d的变换中://整个核心就是用这个cv::solvePnPRansac()去求解两帧之间的位姿变化cv::solvePnPRansac(pts3d,pts2d,K,Mat(),rvec,tvec,false,100,4.0,0.99,in

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号