Pid控制算法-变积分的pid算法的C++实现

2023-05-16

PID控制算法的C++实现

七 变积分的PID控制算法C++实现

  变积分PID可以看成是积分分离的PID算法的更一般的形式。在普通的PID控制算法中,由于积分系数ki是常数,所以在整个控制过程中,积分增量是不变的。但是,系统对于积分项的要求是,系统偏差大时,积分作用应该减弱甚至是全无,而在偏差小时,则应该加强。积分系数取大了会产生超调,甚至积分饱和,取小了又不能短时间内消除静差。因此,根据系统的偏差大小改变积分速度是有必要的。

   变积分PID的基本思想是设法改变积分项的累加速度,使其与偏差大小相对应:偏差越大,积分越慢; 偏差越小,积分越快。

   这里给积分系数前加上一个比例值index:

   当abs(err)<180时,index=1;

   当180<abs(err)<200时,index=(200-abs(err))/20;

   当abs(err)>200时,index=0;

   最终的比例环节的比例系数值为ki*index;

   具体PID实现代码如下:

 pid.h:
#ifndef _PID_H_
#define _PID_H_
 
typedef struct _pid{
float SetSpeed;
float ActualSpeed;
float err;
float err_last;
float Kp, Ki, Kd;
float voltage;
float integral;
float umax;
float umin;
}Pid;
 
 
class Pid_control
{
public:
 
void PID_init();
float PID_realize(float speed);
 
private:
int index;
Pid pid;
};
#endif
 
pid.cpp:#include <iostream>
#include "pid.h"
 
using namespace std;
 
void  Pid_control::PID_init()
{
pid.SetSpeed = 0.0;
pid.ActualSpeed = 0.0;
pid.err = 0.0;
pid.err_last = 0.0;
pid.voltage = 0.0;
pid.integral = 0.0;
pid.Kp = 0.4;
pid.Ki = 0.2;
pid.Kd = 0.2;
pid.umax = 400;
pid.umin = -200;
}
 
float Pid_control::PID_realize(float speed){
float index;
pid.SetSpeed = speed;
pid.err = pid.SetSpeed - pid.ActualSpeed;
 
if (abs(pid.err)>200)
{
index = 0.0;
}
else if (abs(pid.err)<180){
index = 1.0;
pid.integral += pid.err;
}
else{
index = (200 - abs(pid.err)) / 20;
pid.integral += pid.err;
}
pid.voltage = pid.Kp*pid.err + index*pid.Ki*pid.integral + pid.Kd*(pid.err - pid.err_last);
 
pid.err_last = pid.err;
pid.ActualSpeed = pid.voltage*1.0;
return pid.ActualSpeed;
}
main.cpp:
#include "pid.h"
#include <iostream>
 
using namespace std;
 
int main()
{
Pid_control Pid;
 
Pid.PID_init();
 
int count = 0;
 
while (count<1000)
{
float speed = Pid.PID_realize(200.0);
 
cout << speed << ";" << " ";
 
count++;
}
cout << endl;
 
system("pause");
 
return 0;
}


最终结果可以看出,系统的稳定速度非常快(测试程序参见本系列教程3):

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pid控制算法-变积分的pid算法的C++实现 的相关文章

  • 在IDEA中解决进行有关详细信息, 请使用 -Xlint:unchecked 重新编译。

    springboot默认的打包是如下 xff1a lt build gt lt plugins gt lt plugin gt lt groupId gt org springframework boot lt groupId gt lt
  • Jetson Nano更换软件源

    Nano的镜像默认是国外的源 xff0c 速度很慢 xff0c 国内的源有的上不去 xff0c 有的包无法安装 xff0c 经过测试清华大学的源完美可用 xff0c 现放上教程 首先备份原本的source list文件 sudo cp et
  • prometheus在k8s中的部署

    1 k8s的监控指标 监控指标具体实现举例Pod性能cAdvisor容器CPU xff0c 内存利用率Node性能node exporter节点CPU xff0c 内存利用率K8S资源对象kube state metricsPod Depl
  • vue前端

    span class token operator lt span span class token operator span DOCTYPE html span class token operator gt span span cla
  • VueCli 脚手架的安装

    配置淘宝npm仓库 xff1a span class token function npm span config span class token builtin class name set span registry https re
  • vue进阶知识

    Vue单文件组件 xff08 又名 vue文件 xff0c 缩写为SFC xff09 是一种特殊 的文件格式 xff0c 它允许讲Vue组件的模板 逻辑与样式封装在 单个文件中 正如所见 xff0c Vue SFC 是经典的 HTML CS
  • ssh@host:""ssh切换到其他机器上执行多条命令;Pseudo-terminal will not be allocated because stdin is not a terminal.

    1 背景 xff1a shell脚本在主机器上执行kafka的启动命令 其他机器也会起这个进程 之前的脚本每次执行的时候出现卡住的现象 xff0c 不能回到命令行 解决方法 xff1a 第一种 span class hljs comment
  • centos升级glibc(升级到 2.17版)

    1 原先的系统glibc库的版本是2 12 xff0c 需要升级到2 17版本 下载地址 xff1a http ftp gnu org gnu glibc glibc 2 17 tar gz 这里可以选择你所需要的版本 2 安装部署 roo
  • u盘启动盘安装centos7.4操作系统

    1 使用UltraISO软件将ISO镜像刻录到U盘 xff0c 然后用u盘安装操作系统 制作好的u盘如下所示 xff1a 2 启动华为h3c服务器 xff0c 出现下面的界面 按照提示按住Ctrl 43 A制作raid 继续点击下一步 xf
  • redis一主一从两台机器高可用

    目录 1 机器规划 2 redis的部署安装 2 1配置文件内容 2 2 启动2台机器上的redis服务 2 3 查看2台机器上redis数据信息 3 redis主从之间手动切换 3 1 停掉22上的redis进程 xff0c 到23从re
  • cumulusclips的部署

    描述 xff1a CumulusClips是一个开源的视频分享 xff08 内容管理 xff09 平台 xff0c 能够提供最佳的视频分享功能之一类似YouTube 在CumulusClips的帮助下 xff0c 您可以开始自己的视频分享网
  • Linux安装nodejs和npm

    最近window系统转向linux系统开发 xff0c linux系统的确适合程序员的开发 作为前端安装了nodejs和npm xff0c 遇到了一些坑 xff0c 赶紧记录下来 第一种安装方法 xff1a 安装nodejs xff1a s
  • python 编写的DHT Crawler 网络爬虫

    1 安装boost依赖和编译环境 yum install y boost boost devel yum install y make gcc gcc c 43 43 kernel devel python devel 2 装 libtor
  • nginx location proxy_pass详解

    在nginx中配置proxy pass时 xff0c 如果在proxy pass后面的url加 xff0c 相当于是绝对根路径 xff0c 则nginx不会把location中匹配的路径部分代理走 如果没有 xff0c 则会把匹配的路径部分
  • hbase代码说明(通话记录查询)

    Hbase的项目 xff08 通话记录查询 xff09 写java的包 导入jar包 Hbase的包 xff0c hadoop的包 xff0c 驱动包 配置文件 xff08 hbase hdfs regionserver backup xf
  • SysTick 定时器详细学习笔记并兼容FreeRTOS

    文章目录 一 xff1a 基础知识二 xff1a SysTick 的时钟频率三 xff1a SysTick 的配置四 xff1a SysTick 实现精准延时并兼容 FreeRTOS五 xff1a 参考 一 xff1a 基础知识 SysTi
  • 无人机项目跟踪记录四十八---角度pid控制模块详解(2)

    角度pid控制模块中函数 xff1a static void PID Postion Cal PID Typedef PID float target float measure int32 t dertT 为PID自整定函数 xff1a
  • 无人机项目跟踪记录四十九----角速度环的pid控制详解

    角速度环的pid控制的函数是void CtrlAttiRate void xff0c 具体解释如下 xff1a 首先初始化变量 xff0c 获取陀螺仪读取的角速度 float yawRateTarget 61 0 期望的偏航角速度 stat
  • 无人机项目跟踪记录五十一----高度融合模块详解

    这个模块的函数是 xff1a void AltitudeCombineThread void 函数有点乱 xff0c 部分没有看懂 xff0c 加上了注释 以后再详细搞清楚吧 xff01 timeStamp in us Thread sho
  • 无人机项目跟踪记录五十八--原理图控制部分分析

    下图为控制部分的电路图 xff1a 左上角电路是3 3v的供电电源 xff0c 附近的两个电容起到滤波作用 其下的J1是接仿真器的接口 xff0c 这里用的是SW模式 右边的U1为核心控制芯片arm xff0c 是整个电路的控制核心 Y1是

随机推荐