问题标签 [pid-controller]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
matlab - 我正在尝试在 matlab 中为内部电流控制回路编写代码,我的目标是最大限度地减少错误,需要代码验证
我正在尝试在 MATLAB 中编写以下内部电流控制循环结构。这两个图是相互关联的,使用这些图我制作了以下代码,我在此代码中的目标是最小化 id*-id,我通过使用 ITEA 来做到这一点。请帮助我验证此代码。该图在下面的图片链接中。我已经在下面的代码中实现了该链接。
`
simulation - 使用 PID 控制器计算四轴飞行器力
我是 PID 控制器和四轴飞行器的新手,我正在尝试为四轴飞行器编写一个非常简单(但现实)的模拟。我不是想构建一个实际的四轴飞行器控制器。
我大致了解 PID 的工作原理,但我不太了解如何使用它们。我知道我至少需要三个 PID,每个旋转轴一个,但我不确定这是否足够。
我的模拟以每秒 60 个滴答的速度运行,每个滴答都会更新 PID 并模拟无人机。
情况1)
这个案例与无人机模拟没有直接关系,只是我试图理解和感受PID。假设无人机在世界坐标(0 -60 0)(Y 为上轴),我希望它在世界原点(0 0 0)保持水平,所以它需要向上加速。对于这种情况,让我们完全忽略转子,我可以神奇地直接对无人机施加力。无人机也是直立的,只能上下移动。
为了平稳地加速到原点,我假设我需要一个 PID(我们称之为PID0)并使用设定值0(世界原点的 y 坐标)来计算它,过程变量是 y 坐标无人机。但是,输出不是力量。我可以将输出直接作为速度应用,效果很好,但这不是我想要的。我是否需要一个额外的PID ( PID1 )来计算力?
这意味着我需要 6 个 PID(除了 3 个旋转 PID)来在所有轴上移动?这对我来说似乎不对。
如何根据PID0的结果计算我需要施加的力?
案例2)
对于这种情况,我们假设无人机可以自由运动,无人机的线速度和角速度由旋翼升力和旋翼扭矩决定。假设无人机的角度pitch = 20,yaw = 0和roll = 0(正俯仰向下,意味着无人机向前飞行),我希望它在pitch = 0,yaw = 0和滚动= 0。
要旋转无人机,我需要增加前转子的 RPM(和/或降低后转子的 RPM)。
如果我计算俯仰轴的 PID输出,设定值为 0,过程变量为 20,我会得到另一个角度。我如何使用它来改变转子的功率?
我不需要任何这些问题的切实解决方案,我只需要一些提示/朝着正确的方向轻推。
matlab - MATLAB的lsim() vs for-loop Simulation // 同一个系统的不同结果
我花了很长时间尝试使用两种方法模拟一个简单的 SISO 系统:
1) 在 MATLAB 中使用 lsim() 2) 通过自己写下差分方程并在循环中迭代它们。
我永远无法从这两种方法中获得相同的模拟结果,而且我不知道我做错了什么。
我将我的代码堆叠在一个 m 文件中,这样更容易理解。这是代码:
我从这个P
页面获得了工厂模型及其 PID 控制器(参见方程 10),其中系统根据步进参考进行仿真,结果看起来与结果非常相似(仅针对单步峰值)。lsim()
但是,模拟系统使用的结果lsim()
是这样的:
而使用 for 循环,我得到了这个性能:
我非常感谢任何帮助或澄清为什么我得到不同的结果。
c - 电机PI调节器结构代号
我实际上正在开发一个基于 freeRTOS 的机器人项目。我在控制机器人车轮速度的 PI 控制器上遇到了一些问题。
问题是当误差达到0.0而不是稳定时开始振荡。
arduino - Arduino PID Autotune 未调整
我正在构建一个代码来控制一个加热器,它使用Arduino-PID-AutoTune-Library连接到一个 SSR 的 PWM 输出。在使用正常模式(不是模拟,而是使用热电偶的实际模拟输入)操作时,我目前在使用上述库时面临两个问题。
开始操作时温度过冲。
我为常量尝试了几个值
- kp=2, ki=0.5, kd=2
- kp=1, ki=0.8, kd=0.8
- kp=1, ki=0.5, kd=0
- ETC
但温度仍然大幅过冲。
例如,如果设定点为 100°C,则过程值上升到 130-140;°C,然后回到 95 到 110°C 之间的稳定状态。
当我使用自动调谐功能时,Arduino 进入调谐模式,但 PWM 输出计数只是在 50 和 150 之间切换,它永远不会退出自动调谐模式,即使设定点超过 200°C,温度也会持续升高为 100°C。
c++ - C++中的PID控制器和传递函数
我有一个在 simulink 中工作的 PID 控制器,但我想将它传递给 C++ 代码。我发现了如何使用代码制作 PID,如下所示:
但是,这是我在研究中得到的唯一明确的东西。
我需要知道下一步是什么,我已经离散化了传递函数,但我不确定我应该如何处理“z”参数、时间、......
是否可以手动将 PID 控制器传递给 C++?如何?
linear-algebra - 应用 PID 控制器进行轨迹规划算法
我正在为 Segway 机器人开发路径规划算法。(x, y, theta)
运行算法后,以坐标的形式获得目标路径。硬件和传感器噪声在跟踪路径中造成了很大的麻烦,并且错误正在累积。我想应用PID控制。我需要通过计算交叉轨迹误差来将转向角设置为运动方向。
1)如何计算原始坐标(x1, y1, theta1)
和当前位置的CTE (x1', y1', theta1')
?
2) 如何为这种情况选择K p、K i和K d的值?
附加信息:开发环境是Android studio。
matlab - PID 命令的数字答案
我使用了 Simulink PD 模型并使用了值:
我给出的输入是
我从模拟中得到数值。
我正在尝试在脚本文件中实现相同的功能,但我得到了传递函数格式的答案。我希望答案是像 Simulink 这样的数字形式,这是我的 MATLab 代码:
请在这方面帮助我。
matlab - Simulink 模型“到工作区”输出
我正在尝试控制电机扭矩并在 Simulink 中使用工作区变量,并希望将类似的变量输出到工作区。
我有 size(T_u)=[3, 91] 而我从模拟中得到的输出有大小 [91, 90]
我无法理解为什么会这样。
我正在使用的代码:
.mat 和 .slx 文件的链接是:https ://drive.google.com/open?id=1kGeA4Cmt8mEeM3ku_C4NtXclVlHsssuw
matlab - Workspace 和 Simulink 阶跃响应的差异。为什么会有这种差异?
我的主要目标是为传递函数 (5.551* s^2) 制作一个控制器,使用根轨迹我制作了如下所示的控制器。使用 step () 函数分析工作区中的阶跃响应我得到了一个令人满意的答案,但是当我尝试将此答案传输到 Simulink 时,响应的行为不同,例如在稳定状态下,我希望获得尽可能小的错误在 Workspace 但在 Simulink 中有一个很大的错误,由于某种原因,在 8 秒时间(Simulink 仿真时间)有一个“跳跃”,如显示屏上所示,当我更改仿真时间时,这个“跳跃”发生了变化我也不知道为什么在一种环境和另一种环境之间会发生这些变化。
Workspace 中的阶跃响应
Simulink 中的阶跃响应,仿真时间为 8 秒
Simulink 中的阶跃响应,仿真时间为 12 秒
Simulink 控制器
Simulink 传递函数
我希望制作一个误差小于 5% 且超调小于 25% 的控制器,所以我首先制作了一个带有两个积分器的控制器,以消除零对源的影响,然后我在控制器上添加了两个积分器源尝试减少误差,零在 -0.652 我为此使用了角度条件和 0.240251 的增益我使用了模块化条件。
我没想到会出现最优化的行为,只是它具有满足强加条件的最小条件,所以我并不担心源头上的四个积分器。
我尝试使用 sisotool() 命令,以为我做错了什么,但是当我模拟 Simulink 时结果发生了很大变化,所以我放弃了这个选项并保留了我使用根轨迹制作的控制器。