基于LabVIEW的PID算法解读

2023-11-08

记录一下,方便以后翻阅~

下图是基本的PID算法实现方式,以及实现PID控制器所需的假设和转换。为实现PID控制器,LabVIEW要求算法对输入信号进行采样并离散积分和微分操作。
在这里插入图片描述
一、误差计算

e(k)=SP(k)-PV(k)
上式中:e(k)表示当前(第k时刻)误差;SP表示设定值;PV表示过程变量。

二、比例操作

Up(k)=Kc × e(k)
上式中:Kc表示控制器增益。

三、积分操作(梯形积分)
离散积分操作有几种方式,如前向差分、后向差分和梯形逼近(也称突斯汀或双线性变换)。本PID算法使用梯形积分避免PV或SP的突然改变引起积分操作的剧烈变动,等式如下所示:

UI(k)=UI(k-1)-+((Kc/Ti)×(e(k)+e(k-1))×△t)/2
上式中:△T是控制器的采样时间。

四、微分操作
SP的突然变化会引起误差e的微分操作,因而会造成控制器输出振荡。这些振荡被称为微分冲击。为避免微分冲击,可仅向PV应用微分操作,不要向误差e应用微分操作。下列等式表示本PID算法实现的避免微分冲击的微分操作:

Ud(k)=-Kc×(Td/△t)×(PV(k)-PV(k-1))

五、控制器输出
控制器输出是比例、积分和微分操作的总和,公式如下:

U(k)=Up(k)+UI(k)+Ud(k)

六、输出限制和抗饱和算法
实际控制器输出限制在控制器输出指定的范围内。
如:

U(k)≥Umax
则:
U(k)=Umax
如:
U(k)≤Umin
则:
U(k)=Umin
本PID算法使用的积分和更正算法有助于抗饱和。饱和发生在控制器输出上限。误差e降低时,控制器输出也会随之降低,因而移除饱和区域。积分和更正算法可在手动/自动模式切换或修改任何其他参数时,阻止控制器输出的突然变动。积分和更正原理如下: 如:
|Up(k)+UI(k)|>限值
则:
UI(k)=限值-Up(k)

七、案例分享
在LabVIEW的Examples库里,有一个名为General PID Simulator.vi文件,前面板大致如下图所示:
在这里插入图片描述
程序框图本人进行了简单修改,前面介绍的那些PID公式,其实都封装在了下图红圈的那个VI里:
在这里插入图片描述
仿真运行时,PV值(过程变量)会不断逼近SP值(设定值),效果如下图所示:
在这里插入图片描述
这时,如果改变SP值,那么PV值会朝的新的SP值方向逼近。

八、经验分享
从上面的案例可以发现,当PV值与SP值差值大时,收敛速度很快,并随着PV值与SP值接近而放慢收敛速度。利用这种思想,可以实时追踪一些变化的目标。不过,PID的性能与时间间隔长度有关,ANC(主动降噪)恐怕是不适用了。
在这里插入图片描述

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

基于LabVIEW的PID算法解读 的相关文章

  • 1_simulink简单入门_simulink仿真PID控制

    1 simulink简单入门 simulink仿真PID控制 2 simulink搭建RCL 电阻电感电容模块 毕业前想去做物联网还是或者linux 结果玩了一年多的电机控制 早就深知matlab simulink绕不过的 拖到现在 下班晚
  • # Arduino小车PID调速——整定参数初试水

    Arduino小车PID调速 整定参数初试水 在实现了小车较为可靠的测速基础上 便可以正式开展PID调速实验了 本文是基于使用Arduino平台上由Brett Beauregard大神写的PID库进行参数整定的 侧重于在对PID算法有基本了
  • LabVIEW 读写和缩放音频文件

    LabVIEW 提供了多种方式来读取和写入 WAV 格式的音频文件 完成本模块后 您将能够使用位于 Programming Graphics Sound Sound Files 中的 Simple Read 和 Simple Write 用
  • C++ 在 Windows 中发送简单信号

    Windows 上是否有相当于kill 的函数 int kill pid t pid int sig 如果没有 是否可以根据进程的 PID 来测试进程是否正在运行 Thanks Windows 没有 Unix 意义上的信号 您可以使用Ope
  • 有人可以解释一下 Erlang 中 Pid(进程标识符)的结构吗?

    有人能解释一下 Erlang 中 Pid 的结构吗 Pids 看起来像这样
  • Python 列表到 XML,反之亦然

    我编写了一些将 python 列表转换为 XML 元素的 python 代码 它用于与 LabVIEW 交互 因此采用了奇怪的 XML 数组格式 无论如何 这是代码 def pack data create the result eleme
  • C - 获取用popen打开的进程的PID

    我有一个用 C 编写的程序 它使用 popen 打开另一个程序 我想获取该程序的 pid 或某种处理程序 以便在一定时间限制后 或者在它超出某些 ram 和 stdout 限制时杀死它 我认为这必须用ptrace来完成 它需要PID 但我不
  • 使用或不使用 NI Vision 从二进制缓冲区/文件创建 LabVIEW IMAQ 图像

    假设您有一个表示二维图像的二进制缓冲区或文件 如何使用 LabVIEW 将二进制数据转换为 IMAQ 图像以便进一步处理 借助 NI 视觉 对于 LabVIEW 用户已安装 NI 视觉库的人 有一些 VI 允许从 2D 数组复制 IMAQ
  • IIS应用程序池PID

    有谁熟悉获取与进程 ID 关联的应用程序池的方法吗 我正在使用 Win32 Process 查询 W3WP 服务并返回 PID 现在我正在尝试获取与其关联的应用程序池 在 Windows Server 2008 上 情况发生了变化 in s
  • Bash:是否可以阻止 PID 被重复使用?

    是否可以阻止 PID 被重复使用 例如 如果我运行一份工作myjob在背景中myjob 并使用获取PIDPID 是否可以阻止 linux 系统重新使用该 PID 直到我检查该 PID 不再存在 进程已完成 换句话说 我想做类似的事情 myj
  • 检查给定 pid 的进程是否存在

    给定 Linux 进程的 pid 我想从 C 程序检查该进程是否仍在运行 Issue a kill 2 http linux die net man 2 kill系统调用0作为信号 如果调用成功 则说明存在该pid的进程 如果呼叫失败并且e
  • 如何在 LabVIEW 中的文本框指示器和滑块中显示值?

    有没有办法连接 LabVIEW 前面板上的两个指示器 使它们始终具有相同的值 现在我每次都将两者设置为相同的值 但如果有一种方法可以设置一个来镜像另一个 那就容易多了 您可以使数字显示可见 右键单击滑块并从可见项目中选择 数字显示
  • 如何查看linux中特定进程每5秒的内存消耗情况

    我只是想知道如何找到特定进程在特定时间 比如5秒 的内存消耗 我是linux新手 因此 详细的步骤将不胜感激 Use top p PID其中 PID 是进程 ID 应显示有关进程的信息 包括使用的系统内存百分比 类型d以及一个以秒为单位的整
  • 查看用户最近执行的Android任务

    我想查看我的 Android 手机最近的任务 我尝试了一些来自互联网的代码 但没有一个能正常工作 我只想获取用户最后执行的应用程序的PID和名称 例如 如果我执行计算器应用程序 然后执行我创建的最近任务应用程序 则该应用程序应该能够告诉我类
  • PID和TID的区别

    PID和TID有什么区别 标准答案是 PID 用于进程 而 TID 用于线程 然而 我发现有些命令可以互换使用它们 例如 htop有一个 PID 列 其中显示同一进程的线程的 PID 具有不同的值 那么PID什么时候代表线程或进程呢 这很复
  • 跟踪 Zaber 设备移动时的位置

    我正在编写一个 LabVIEW VI 来移动 Zaber 线性执行器 并且我想在设备移动时每隔几毫秒记录一次设备的位置 我已经安装了Zaber 的 LabVIEW 驱动程序 http www zaber com wiki Software
  • 在 python 中,是否有跨平台的方法来确定哪个进程正在侦听给定端口?

    在linux下 我可以使用lsof i如以下函数所示 def FindProcessUsingPort portnum import os fp os popen lsof i s portnum lines fp readlines fp
  • 是否可以在 git-extensions 中为特定文件扩展名设置 diff/merge-tool ?

    我刚刚开始使用 LabView 进行开发 这对我来说是全新的 我想使用 git 扩展来处理我的版本控制 由于源位于 vi格式 我无法使用普通的 diff 工具 源是二进制的 幸运的是 LabView 附带了专用的差异和合并工具 这似乎非常有
  • LVDiff 在 Git 中不起作用

    我正在尝试从元差异套件中获取 lvdiff 以与 Git 一起使用 我的 gitconfig 看起来像这样 gui recentrepo C Users Tanner Desktop FIRST 2010 Beta Java LoganRo
  • Python UDP广播不发送

    我正在尝试从 Python 程序到两个 LabView 程序进行 UDP 广播 我似乎无法发送广播 我不确定我的套接字初始化错误在哪里 广播似乎足够简单 据我所知 其他电脑没有收到任何数据 另外 我将来还需要这个程序来接收来自其他电脑的数据

随机推荐