PID概述
PID(Proportional-Integral-Derivative)控制器是一种广泛应用于工程领域的控制算法,它包含三个主要部分:比例(P)、积分(I)和微分(D)。通过调整这三个部分来使系统的实际输出更接近期望输出。
比例(P)
比例控制根据误差(期望输出与实际输出之差)的大小来调整控制量。误差越大,控制量越大;误差越小,控制量越小。比例控制有助于快速减小误差,但可能导致稳态误差(静态误差)。
积分(I)
积分控制对误差进行积分,累积误差值。这有助于消除稳态误差,提高系统的精确度。但积分环节可能导致系统响应过慢和超调(当实际输出超过期望输出时)。
微分(D)
微分控制根据误差变化的速度来调整控制量。微分环节有助于减小超调现象,提高系统响应速度和稳定性。
实际应用中,通过调整PID控制器中的比例、积分和微分系数,可以使系统在不同场景下达到更好的控制效果。PID控制器被广泛应用于各种领域,如工业过程控制、航天器姿态控制、机器人运动控制等。
在实际运用中我们常用位置式PID和增量式PID,是两种不同的PID控制器实现方式。这两种方法都能实现PID控制的目标,但它们的计算方法和实际应用中的性能有所不同。
两者的主要区别在于计算方法:位置式PID直接根据误差值计算控制量,而增量式PID根据误差的变化计算控制量的变化。在实际应用中,增量式PID的性能通常更稳定,因为它可以避免积分饱和现象。此外,增量式PID在离散系统中更容易实现。然而,增量式PID对系统的采样时间和计算精度要求较高。在选择具体的实现方法时,需要根据实际应用场景和系统需求来权衡。
1. P控制
单纯P控制:kp = 10
单纯P控制:kp=5
示例代码
void control_p_2(){
while(1){
// 明确输入: 目标624, 当前值
// 获取编码器当前读数
short enc = encoder_get();
// 目标值
short target = 624;
// 计算误差
float error = target - enc;
float kp = 5;
// 控制器:PID算法
int pwm = kp * error;
// 明确输出: pwm
motor_set_pwm(pwm);
delay_1ms(5);
// 将数据显示在图表上
float float_enc = (float)enc;
data_show_push(&float_enc,1);
}
}
2. PI控制
PI : P=5,i=0.1
PI : P=5,i=0.01
示例代码:
void control_PI_2(){
// 误差的累积
float error_integral = 0;
while(1){
// 明确输入: 目标624, 当前值
// 获取编码器当前读数
short enc = encoder_get();
// 目标值
short target = 624;
// 计算误差
float error = target - enc;
// 积分: 误差的累积
error_integral += error;
float kp = 5;
float ki = 0.1;
// 控制器:PID算法
int pwm = kp * error + ki*error_integral;
// 明确输出: pwm
motor_set_pwm(pwm);
delay_1ms(5);
// 将数据显示在图表上
float float_enc = (float)enc;
data_show_push(&float_enc,1);
}
}
3. PD控制
PD控制:P=10 D=10
PD控制:P=10 D=20
PD控制:P=10 D=50
void control_PD_3(){
// 上一次的误差
float error_last = 0;
while(1){
// 明确输入: 目标624, 当前值
// 获取编码器当前读数
short enc = encoder_get();
// 目标值
short target = 624;
// 计算误差
float error = target - enc;
float kp = 10;
float kd = 50;
// 控制器:PID算法
int pwm = kp * error + kd*(error - error_last);
error_last = error;
// 明确输出: pwm
motor_set_pwm(pwm);
delay_1ms(5);
// 将数据显示在图表上
float float_enc = (float)enc;
data_show_push(&float_enc,1);
}
}
4. PID控制
P=10,I=0.02,D=30
示例代码:
#include "config.h"
void control_PID_4(){
// 误差的累积
float error_integral=0;
// 上一次的误差
float error_last = 0;
while(1){
// 明确输入: 目标624, 当前值
// 获取编码器当前读数
short enc = encoder_get();
// 目标值
short target = 624;
// 计算误差
float error = target - enc;
// 误差积分
error_integral+=error;
//g_balanceKP,g_balanceKI,g_balanceKD
float kp = 10;
float ki = 0.02;
float kd = 30;
// 控制器:PID算法
int pwm = kp * error + ki * error_integral+ kd*(error - error_last);
error_last = error;
// 明确输出: pwm
motor_set_pwm(pwm);
delay_1ms(5);
// 将数据显示在图表上
float float_enc = (float)enc;
data_show_push(&float_enc,1);
}
}
实际应用
串级PID控制被广泛应用于各种领域,如工业过程控制、汽车动力系统控制、航空航天器
自动控制系统的性能指标主要有三个方面: 稳定性,快速性,准确性
优势
稳定性: 系统在受到外作用后,若控制系统使其被控变量随时间的增长而最终 与给定期望值一致,则称系统是稳定的,我们一般称为系统收敛。如果被控量随时 间的增长,越来越偏离给定值,则称系统是不稳定的,我们一般称为系统发散。稳 定的系统才能完成自动控制的任务,所以,系统稳定是保证控制系统正常工作的必 要条件。一个稳定的控制系统其被控量偏离给定值的初始偏差应随时间的增长逐渐 减小并趋于零。
快速性: 快速性是指系统的动态过程进行的时间长短。
过程时间越短,说明系统快速性越好,过程时间持续越长,说明系统响应迟钝, 难以实现快速变化的指令信号。 稳定性和快速性反映了系统在控制过程中的性能。系统在跟踪过程中,被控量 偏离给定值越小,偏离的时间越短,说明系统的动态精度偏高。
准确性: 是指系统在动态过程结束后,其被控变量(或反馈量)对给定值的偏差而言,这一偏差即为稳态误差,它是衡量系统稳态精度的指标,反映了动态过程 后期的性能