-
目前网上流传的一些关于双闭环的资料有很多我觉得是不对或者不够清楚的,在这边分享一下自己的理解,希望大家也能指点一下。
双闭环的作用
串级控制系统是改善控制质量的有效方法之一,在过程控制中得到了广泛的应用。所谓串级控制,就是采用两个控制器串联工作,外环控制器的输出作为内环控制器的设定值,由内环控制器的输出去操纵控制阀,从而对外环被控量具有更好的控制效果。这样的控制系统被称为串级系统。PID串级控制就是串级控制中的两个控制器均为PID控制器,
它增强了系统的抗干扰性(也就是增强稳定性)
。
-
1. 增加系统的稳定性这点是正确的,因为电机转速电流双闭环的电流换增加了对电流的反馈控制,不至于使得电流过分超调。
-
2. 但有观点认为电机双闭环可以加速启动,其实这点是不完全正确的,对于单闭环系统,只要允许较大的超调量,其实启动速度是足够快的。其实原观点表达的意思应该是加快系统启动到稳态的时间,也就是缩小调节时间。
单双闭环区别
-
双闭环比单闭环多了电流内环,用于控制电流的稳定性保证较小超调量和较好的稳定性,实际常用的简单单闭环控制系统中,为保证电流不超过电机承受极限,往往需要进行
电流截止控制
,另一方便未避免积分深度饱和,也需要对
积分进行限幅
,而为了达到快速启动的效果会给定较大的积分初值,如此一来,虽然可以勉强满足控制,但其实电流
超调严重
,而且稳定性较差。为此,双闭环可以减小电流的超调和过饱和现象,得到更加良好的控制效果。
-
图一是双闭环控制下的启动电流
-
图二是双闭环控制下的转速波形
-
图三是单闭环控制下的电流波形
双闭环内环的输入问题
-
我们知道在单闭环系统中,输入转速差,转速控制器会输出对应的PWM来使得电机转速达到期望转速,其实我们已经默认了PWM和转速呈正相关关系。但在双闭环系统中,输入转速差,转速控制器会输出对应的电流大小,然后该电流与实际电流大小之差作为电流控制器的输入,再输出对应的PWM。这里面的疑问就是,
我们怎么知道转速控制器对应特定转速差输出的对应电流大小应该是多少
。(实际操作上我们其实就是瞎调pid而已,但其蕴含的原理是什么呢)
答:输出=速度误差
转动惯量/(采样时间
转矩系数)=(速度误差/采样时间)
转动惯量/转矩系数=加速度
转动惯量/转矩系数=转矩/转矩系数=转矩电流。
即转矩最适电流=速度差*p,由于该过程不一定线性,因此需要积分环节控制存在。
-
在解答中,我们揭示了在一定程度上,转矩电流与转矩成正比,进而与转速差成正比,这样一来确定了输入转速差,我们应该输出多少电流,就好像单闭环系统中,输入转速差,我们知道应该输出多少PWM一样,这里面同样有对应关系,但往往我们都将其当作黑箱操作,而事实上双闭环在调参的过程中也是当作黑箱操作的,这边只是在原理上为大家弄清楚电流和转速差的对应关系。
双闭环结构目前网上流传的一些关于双闭环的资料有很多我觉得是不对或者不够清楚的,在这边分享一下自己的理解,希望大家也能指点一下。双闭环的作用串级控制系统是改善控制质量的有效方法之一,在过程控制中得到了广泛的应用。所谓串级控制,就是采用两个控制器串联工作,外环控制器的输出作为内环控制器的设定值,由内环控制器的输出去操纵控制阀,从而对外环被控量具有更好的控制效果。这样的控制系统被称为串级系统。PID串
在PID算法中,我们如果只是使用单个
闭环
PID控制会出现很多的不足。例如我们在单独使用位置环时,在
电机
未能达到预设位置时,
电机
的运行状态是100%PWM满偏运行的,这样在我们实际运用时,如果我们使用的
电机
功率很高就会造成速度过快的现象。所以在
电机
的控制过程中,最好是多环控制。
在设计过程中,我是不断地尝试得出的结果。最终得出将位置环和速度环的输出叠加的方法,在位置没有到达预设位置时虽然位置环的输出会是满偏,但满偏会让速度出现偏差,速度环就会输出负值反过来抑制总的输出,这样我们就可以在实现位置环的同时也有了速度环的控制。但注意的是在快达到预设位置时需要将速度环关闭。
串级控制系统是改善控制质量的有效方法之一,在过程控制中得到了广泛的应用。所谓串级控制,就是采用两个控制器串联工作,外环控制器的输出作为内环控制器的设定值,由内环控制器的输出去操纵控制阀,从而对外环被控量具有更好的控制效果。这样的控制系统被称为串级系统。
PID
串级控制就是串级控制中的两个控制器均为
PID控制
器。
.........
1.速度
闭环控制
我们一般在速度
闭环控制
系统里面,使用增量式PI控制。而在我们的微处理器里面,因为控制器是通过软件实现其控制算法的,所以必须对模拟调节器进行离散化处理,这样它只需根据采样时刻的偏差值计算控制量。因此,我们需要使用离散的差分方程代替连续的微分方程。
假定采样时间很短时(我们的代码中是10ms),可做如下处理:
① 用一介差分代替一介微分;
② 用累加代替积分。
根据增量式离散
PID
公...
// 设置目标速度和位置
double targetSpeed = 100; // 以某种单位表示的目标速度
double targetPosition = 500; // 以某种单位表示的目标位置
// 定义
PID
对象
PID
speed
PID
(¤tSpeed, &output, &targetSpeed, Kp, Ki, Kd, DIRECT);
PID
position
PID
(¤tPosition, &output, &targetPosition, Kp, Ki, Kd, DIRECT);
void setup() {
// 初始化
电机
相关的引脚
pinMode(enablePin, OUTPUT);
pinMode(forwardPin, OUTPUT);
pinMode(backwardPin, OUTPUT);
// 设置
PID
的相关参数
speed
PID
.SetOutputLimits(-255, 255); // 设置输出范围
speed
PID
.SetSampleTime(50); // 设置采样时间
speed
PID
.SetMode(AUTOMATIC); // 设置为自动模式
position
PID
.SetOutputLimits(-255, 255);
position
PID
.SetSampleTime(100);
position
PID
.SetMode(AUTOMATIC);
void loop() {
// 获取当前速度和位置
int currentSpeed = getCurrentSpeed(); // 通过某种方式获取当前速度
int currentPosition = getCurrentPosition(); // 通过某种方式获取当前位置
// 运行速度和位置
PID控制
speed
PID
.Compute();
position
PID
.Compute();
// 根据输出控制
电机
if (output > 0) {
analogWrite(enablePin, output);
digitalWrite(forwardPin, HIGH);
digitalWrite(backwardPin, LOW);
} else if (output < 0) {
analogWrite(enablePin, -output);
digitalWrite(forwardPin, LOW);
digitalWrite(backwardPin, HIGH);
} else {
digitalWrite(enablePin, LOW);
digitalWrite(forwardPin, LOW);
digitalWrite(backwardPin, LOW);
delay(50); // 设置控制周期
这是一个使用Arduino库中的`
PID
_v1`库实现的
电机
PID
速度位置
闭环控制
代码示例。具体的
电机
和控制器接口等可能需要根据实际情况进行相应的修改。
如果你需要更详细的教程,可以参考一些相关的书籍或在线教程,例如《Arduino编程从零基础到精通》等。这些教程会涵盖更多的
电机
控制理论和实践,帮助你更好地
理解
和应用
PID控制
算法。
### 回答2:
电机
PID
(Proportional-Integral-Derivative)速度和位置
闭环控制
代码和教程可以根据具体的硬件平台和编程语言来编写。以下是一个基本的示例用于 Arduino 平台上的直流
电机
速度控制。
首先,你需要将
电机
与 Arduino 板连接。将
电机
的正极(通常是红色线)连接到驱动器或 H 桥的 VCC/VIN 引脚,并将
电机
的负极(通常是黑色线)连接到驱动器的 GND 引脚。随后,将驱动器与 Arduino 板连接。将驱动器的控制引脚连接到 Arduino 板的数字引脚上。
接下来,你可以使用 Arduino 编程软件创建一个新的项目,并添加如下代码:
#include <
PID
_v1.h>
// 定义
电机
引脚
#define MOTOR_PIN 3
//
PID
参数
double Setpoint, Input, Output;
double Kp = 1, Ki = 1, Kd = 1;
PID
motor
PID
(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
// 设置初始变量
void setup() {
pinMode(MOTOR_PIN, OUTPUT);
// 设置
PID
控制器
Setpoint = 100; // 目标速度
motor
PID
.SetMode(AUTOMATIC);
// 设置串口通信(调试用)
Serial.begin(9600);
void loop() {
// 获取输入值(例如
电机
的旋转速度)
Input = analogRead(A0);
// 使用
PID
计算输出值
motor
PID
.Compute();
// 将输出值作为 PWM 信号发送到
电机
analogWrite(MOTOR_PIN, Output);
// 输出调试信息
Serial.print("Input: ");
Serial.print(Input);
Serial.print(", Output: ");
Serial.println(Output);
delay(100);
在这个示例中,我们使用了名为
PID
_v1 的库来实现
PID
控制器。首先,我们将
电机
的引脚定义为数字引脚3(可根据实际情况更改)。然后,我们设置了
PID
的参数和目标速度(Setpoint)。接下来,我们将
电机
的输入值读取到 Input 变量中,并使用 motor
PID
.Compute() 计算输出值。最后,我们将输出值作为 PWM 信号发送到
电机
,并通过串口输出调试信息。
这个示例只是一个简单的示范,实际应用中可能需要根据具体要求进行更改和优化。你可以参考 Arduino 官方网站、各种开发社区和教程来获取更详细的信息和示例代码。
### 回答3:
电机
PID
速度位置
闭环控制
是一种常用的
电机
控制方法。下面是一个简单的示例代码,以及一个简化的教程。
代码示例:
#include <
PID
_v1.h>
// 定义
电机
控制引脚
int motorPinA = 9;
int motorPinB = 10;
// 定义
PID
参数
double Setpoint, Input, Output;
double Kp = 1, Ki = 1, Kd = 1;
PID
my
PID
(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
void setup()
// 初始化串口通信
Serial.begin(9600);
// 设置
电机
引脚为输出模式
pinMode(motorPinA, OUTPUT);
pinMode(motorPinB, OUTPUT);
// 设置
PID
参数
Setpoint = 100; // 设置目标速度或位置
Input = 0;
my
PID
.SetMode(AUTOMATIC);
void loop()
// 读取当前速度或位置
Input = readEncoder(); // 替换为你自己的读取速度或位置的函数
// 计算
PID
输出
my
PID
.Compute();
// 输出控制信号到
电机
if (Output > 0) {
analogWrite(motorPinA, Output); // 正转
analogWrite(motorPinB, 0);
} else {
analogWrite(motorPinA, 0);
analogWrite(motorPinB, abs(Output)); // 反转
// 打印
PID
参数和输出
Serial.print("Kp:"); Serial.print(Kp);
Serial.print(", Ki:"); Serial.print(Ki);
Serial.print(", Kd:"); Serial.print(Kd);
Serial.print(", Output: "); Serial.println(Output);
delay(100);
1. 在代码中定义了一个
电机
控制引脚(例如9和10),以及一个
PID
对象。
2. 在`setup()`函数中,设置了串口通信,初始化
电机
引脚为输出模式,并设置了
PID
参数和目标值。
3. 在`loop()`函数中,首先读取当前速度或位置(通过`readEncoder()`函数来实现),然后使用
PID
对象计算输出控制信号。
4. 根据输出控制信号,分别控制两个
电机
引脚,使
电机
正转或反转。
5. 最后,使用串口通信打印
PID
参数和输出控制信号。
6. 在`delay()`函数中添加适当的延迟。
这只是一个简化的示例,实际应用中可能需要根据具体情况进行适当的修改和扩展。可以根据具体的项目需求,调整
PID
参数、目标值和控制方式,以实现所需的
电机
控制效果。