PID控制算法,带C语言源码实现

这篇具有很好参考价值的文章主要介绍了PID控制算法,带C语言源码实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 PID简介

PID即:Proportional(比例)、Integral(积分)、Differential(微分)的缩写。PID控制算法是结合比例、积分和微分三种环节于一体的控制算法。PID算法是连续系统中技术最为成熟、应用最为广泛的一种控制算法。
PID控制算法出现于20世纪30至40年代,适用于对被控对象模型了解不清楚的场合。实际运行的经验和理论的分析都表明,运用这种控制规律对许多工业过程进行控制时,都能得到比较满意的效果。
PID控制的实质就是根据输入的偏差值,按照比例、积分、微分的函数关系进行运算,运算结果用以控制输出。

pid算法代码,日常笔记,c语言,开发语言

2 PID控制原理

       PID控制是基于反馈的闭环控制,根据控制对象输出反馈来进行校正。在测量出实际与计划发生偏差时,按定额或标准来进行纠正。比如控制一个电机的转速,就得有一个测量转速的传感器,并将结果反馈到控制路线上。
PID是比例 (Proportion) 积分 ,(Integral) 微分 ,(Differential coefficient) 的缩写,分别代表了三种控制算法。通过这三个算法的组合可有效地纠正被控制对象的偏差,从而使其达到一个稳定的状态。
        比例KP
        KP成比例的反应控制系统的偏差信号,一旦产生偏差,立即会产生控制作用,减小偏差。比例控制器的输出u(t)与输入偏差e(t)成正比,能迅速反映偏差,从而减小偏差,但不能消除静差。静差是指系统控制过程趋于稳定时,给定值与输出量的实测值之差。偏差存在,才能使控制器维持一定的控制量输出,因此比例控制器必然存在着静差。由偏差理论知,增大虽然可以减小偏差,但不能彻底消除偏差。比例控制作用的大小除与偏差e(t)有关之外,还取决于比例系数Kp的大小。比例系数Kp越小,控制作用越小,系统响应越慢;反之,比例系数Kp越大,控制作用也越强,则系统响应越快。但是,Kp过大会使系统产生较大的超调和振荡,导致系统的稳定性能变差。因此,不能将Kp选取过大,应根据被控对象的特性来折中选取Kp,使系统的静差控制在允许的范围内,同时又具有较快的响应速度。
        积分KI
        积分KI主要用于消除静态误差,提高系统的无差度。积分作用的强弱,取决于积分时间常数Ti,Ti越大积分作用越弱,反之则越强。积分控制作用的存在与偏差e(t)的存在时间有关,只要系统存在着偏差,积分环节就会不断起作用,对输入偏差进行积分,使控制器的输出及执行器的开度不断变化,产生控制作用以减小偏差。在积分时间足够的情况下,可以完全消除静差,这时积分控制作用将维持不变。Ti越小,积分速度越快,积分作用越强。但是,积分作用太强会使系统超调加大,甚至使系统出现振荡。
        微分KD
        微分KD能反映偏差信号的变化趋势(变化速率),并能在偏差信号的值变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减小调节时间。积分控制作用的引入虽然可以消除静差,但是降低了系统的响应速度,特别是对于具有较大惯性的被控对象,用PI控制器很难得到很好的动态调节品质,系统会产生较大的超调和振荡,这时可以引入微分作用。在偏差刚出现或变化的瞬间,不仅根据偏差量作出及时反应(即比例控制作用),还可以根据偏差量的变化趋势(速度)提前给出较大的控制作用(即微分控制作用),将偏差消灭在萌芽状态,这样可以大大减小系统的动态偏差和调节时间,使系统的动态调节品质得以改善。微分环节有助于系统减小超调,克服振荡,加快系统的响应速度,减小调节时间,从而改善了系统的动态性能,但微分时间常数过大,会使系统出现不稳定。微分控制作用一个很大的缺陷是容易引入高频噪声,所以在干扰信号比较严重的系统中不宜引入微分控制作用。微分控制作用的阶跃响应特性对于一个恒定的偏差量,不管其数值有多大,微分控制作用均为零。因此,微分作用不能消除静差,单独使用意义不大,一般需要与比例、积分控制作用配合使用,构成PD或PID控制。
对于PID控制,在控制偏差输入为阶跃信号时,立即产生比例和微分控制中作用。由于在偏差输入的瞬时,变化率非常大,微分控制作用很强,此后微分控制作用迅速衰减,但积分作用越来越大,直至最终消除静差。PID控制综合了比例、积分、微分3种作用,既能加快系统响应速度、减小振荡、克服超调,亦能有效消除静差,系统的静态和动态品质得到很大改善,因而PID控制器在工业控制中得到了最为广泛的应用。

3 PID控制的公式:

pid算法代码,日常笔记,c语言,开发语言

在实际应用中,就需要离散化,因为时间t不可能无限小。
位置式PID:(输出的是实际控制值)
pid算法代码,日常笔记,c语言,开发语言

增量式PID:(输出的是变化值,需要加上原来的值才是实际控制值)
pid算法代码,日常笔记,c语言,开发语言

4 PID调参

在确定PID控制器参数时,可以根据控制器的参数与系统动态性能和稳态性能之间的定性关系,用实验的方法来调节控制器的参数。
PID调试一般原则:
a.在输出不振荡时,增大比例增益P。
b.在输出不振荡时,减小积分时间常数Ti。
c.在输出不振荡时,增大微分时间常数Td。
参数调整一般步骤
由于自动控制系统被控对象的千差万别,PID的参数也必须随之变化,调试PID参数的一般步骤:
a.确定比例增益
确定比例增益P时,首先去掉PID的积分项和微分项,一般是令Ti=0、Td=0,PID为纯比例调节。输入设定为系统允许的最大值的60%70%,由0逐渐加大比例增益P,直至系统出现振荡;再反过来,从此时的比例增益P逐渐减小,直至系统振荡消失,记录此时的比例增益P,设定PID的比例增益P为当前值的60%70%。比例增益P调试完成。
b.确定积分时间常数
比例增益P确定后,设定一个较大的积分时间常数Ti的初值,然后逐渐减小Ti,直至系统出现振荡,之后在反过来,逐渐加大Ti,直至系统振荡消失。记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。积分时间常数Ti调试完成。
c.确定微分时间常数
微分时间常数Td一般不用设定,为0即可。若要设定,与确定P和Ti的方法相同,取不振荡时的30%。
d.系统空载、带载联调,再对PID参数进行微调,直至满足要求。

PID常用口诀
参数整定寻最佳,从大到小顺次查。
先是比例后积分,最后再把微分加。
曲线振荡很频繁,比例度盘要放大。
曲线漂浮绕大弯,比例度盘往小扳。
曲线偏离回复慢,积分时间往下降。
曲线波动周期长,积分时间再加长。
理想曲线两个波,调节过程高质量。文章来源地址https://www.toymoban.com/news/detail-861838.html

5 C语言代码实现:

5.1位置式PID控制算法,Kp,Ki,Kd三个参数,调试过程当中,对于要求的控制效果,可以通过调节这三个量直接进行调节。

// 位置式PID控制算法
struct _pid
{
    float SetSpeed;           //定义设定值
    float ActualSpeed;        //定义实际值
    float err;                //定义偏差值
    float err_last;           //定义上一个偏差值
    float Kp;                 //定义比例系数
    float Ki;                 //定义积分系数
    float Kd;                 //定义微分系数
    float voltage;            //定义电压值(控制执行器的变量)
    float integral;           //定义积分值
}pid;
void 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.2;
    pid.Ki=0.015;
    pid.Kd=0.2;
}
float PID_realize(float speed)
{
    pid.SetSpeed=speed;
    pid.err=pid.SetSpeed-pid.ActualSpeed;
    pid.integral+=pid.err;
    pid.voltage=pid.Kp*pid.err+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;
}

int main()
{
    PID_init();
    int count=0;
    while(count<1000)
    {
        float speed=PID_realize(100.0);
        printf("%f\n",speed);
        count++;
    }
    return 0;
}

5.2 增量型PID控制算法

struct _pid{
    float SetSpeed;            //定义设定值
    float ActualSpeed;        //定义实际值
    float err;                //定义偏差值
    float err_next;            //定义上一个偏差值
    float err_last;            //定义最上前的偏差值
    float Kp;                 //定义比例系数
    float Ki;                 //定义积分系数
    float Kd;                 //定义微分系数
}pid;

void PID_init()
{
    pid.SetSpeed=0.0;
    pid.ActualSpeed=0.0;
    pid.err=0.0;
    pid.err_last=0.0;
    pid.err_next=0.0;
    pid.Kp=0.15;
    pid.Ki=0.20;
    pid.Kd=0.25;
}
float PID_realize(float speed)
{
    pid.SetSpeed=speed;
    pid.err=pid.SetSpeed-pid.ActualSpeed;
    float incrementSpeed=pid.Kp*(pid.err-pid.err_next)+pid.Ki*pid.err+pid.Kd*(pid.err-2*pid.err_next+pid.err_last);
    pid.ActualSpeed+=incrementSpeed;
    pid.err_last=pid.err_next;
    pid.err_next=pid.err;
    return pid.ActualSpeed;
}
int main()
{
    PID_init();
    int count=0;
    while(count<1000)
    {
        float speed=PID_realize(100.0);
        printf("%f\n",speed);
        count++;
    }
    return 0;
}

到了这里,关于PID控制算法,带C语言源码实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 电赛控制类PID算法实现

    一、什么是PID 学过自动控制原理的对PID并不陌生,PID控制是对偏差信号e(t)进行比例、积分和微分运算变换后形成的一种控制规律。PID 算法的一般形式: PID控制系统原理框图 二、PID离散化 对PID连续系统离散化,从而方便在处理器上实现,PID 离散表示形式: 离散化后最终得

    2024年02月06日
    浏览(33)
  • FPGA实现PID控制算法(含仿真)

    相信大家对于PID控制算法,都不感到陌生了,平衡车就是靠它平衡起来的,还有飞控的平衡算法也是它,以及FOC中的闭环控制中也是用的它,它不仅简单,而且易于理解。那么本篇文章将简要介绍一下算法的原理,然后带大家使用FPGA来实现(C语言实现过程特别简单)。 PID取自

    2024年02月15日
    浏览(35)
  • 智能算法实现PID智能车控制系统

    PID控制是自动控制领域中产生最早,应用最广的一种控制方法。本文以论述PID参数先进整定方法开始,介绍了近几年得到的最新研究成果。接下来,从PID控制的结构形式实际控制工程需求和实现条件分析了PD控制的独特优点和理论依据。在众多的PID调整方法中,本文选择了内

    2024年02月08日
    浏览(44)
  • 电流电压双闭环PID控制以及C语言实现

    对于电流电压双闭环PID控制,我们需要先了解一下PID控制的原理。PID控制器是由比例(P),积分(I)和微分(D)三个部分组成的控制器,用于控制具有惯性和滞后响应的过程。PID控制器需要通过测量误差,计算出控制输出,以便实现系统稳定。 在电流电压双闭环PID控制中,

    2024年02月12日
    浏览(38)
  • 【智能车】模糊PID控制原理详解与代码实现

    本文主要由三部分构成:模糊PID控制器的原理,模糊PID控制器C++的实现与测试。 模糊PID控制流程如下图所示,把目标值 Xtarget 与输出值 Xout 的误差 e 与 e 的变化率 de/dt 作为模糊控制器的输入,模糊控制器先对输入进行模糊化处理,接着进行模糊推理,最后把模糊推理的结果

    2024年02月02日
    浏览(40)
  • Matlab实现PID控制仿真(附上30个完整仿真源码+数据)

    本文介绍了如何使用Matlab实现PID控制器的仿真。首先,我们将简要介绍PID控制器的原理和控制算法。然后,我们将使用Matlab编写一个简单的PID控制器,并使用仿真环境来验证其性能。最后,我们将通过调整PID控制器的参数来优化控制系统的响应。 PID控制器是一种经典的控制算

    2024年02月07日
    浏览(82)
  • tb6612电机驱动软件开发(代码pid实现,调试,控制实现)

    代码工程 https://download.csdn.net/download/weixin_52849254/87879043?spm=1001.2014.3001.5501 这段代码是一个PID算法的实现,用于控制电机的位置和速度。代码中包含了以下主要内容: 定义了全局变量,包括四个PID结构体变量,分别用于左电机的位置控制、左电机的速度控制、右电机的速度控

    2024年02月08日
    浏览(52)
  • 增强型PID-自适应-前馈-神经网络控制研究(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 2.1 RBFNN_Optimized_hideen_node_20 ​2.2 RBFNN_Lat

    2024年02月01日
    浏览(54)
  • 超维空间S2无人机使用说明书——55、代码详解:基础PID算法控制无人机的跟随代码详解

    PID,即比例 Proportion、积分 Integral 和微分 Derivative 三个单词的缩写;比例积分微分控制,简称PID控制。 简单讲,根据给定值和实际输出值构成控制偏差,将偏差按比例、积分和微分通过线性组合构成控制量,对被控对象进行控制。 常规 PID 控制器作为一种线性控制器。 步骤

    2024年01月21日
    浏览(64)
  • 【PID控制与模糊PID控制的比较】(带仿真和代码链接)

    目  录 一、序言 二、PID控制器的设计         1.PID控制原理图         2.PID控制器传递函数的一般表达式 三、模糊控制器的设计         1.模糊控制原理图         2.模糊控制器传递函数一般表达形式 四、系统仿真 五、总结 ——————————————

    2024年02月03日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包