公众号看见的10个应用PID控制算法

1.电机转速与位置控制(工业机械臂应用)

应用背景

机械臂关节的精准定位和速度控制是工业自动化中的核心需求。通过STM32的编码器采集电机位置反馈,采用双闭环控制结构(外环位置环+内环速度环)实现毫米级定位精度。

代码实现(位置式PID)

// 位置式PID结构体
typedefstruct {
    float Kp, Ki, Kd;
    float integral;
    float prev_error;
} PositionPID;

float PositionPID_Update(PositionPID *pid, float setpoint, float feedback) {
    float error = setpoint – feedback;
    pid->integral += error;
    
    // 抗积分饱和处理
    if(pid->integral > 100) pid->integral = 100;
    elseif(pid->integral < -100) pid->integral = -100;
    
    float derivative = error – pid->prev_error;
    float output = pid->Kp * error 
                 + pid->Ki * pid->integral 
                 + pid->Kd * derivative;
    
    pid->prev_error = error;
    return output;
}

调参技巧:

典型参数范围:Kp(0.1-1.0)、Ki(0.01-0.1)、Kd(0-0.05)

出现震荡时降低Kp,稳态误差增大Ki,超调过大增加Kd

 

2.温度恒温控制(3D打印机热床)

应用背景

在3D打印过程中,热床需要快速升温至设定温度(如60℃)并保持±0.5℃波动。采用NTC热敏电阻采集温度,通过PWM控制加热膜功率。

代码实现(积分分离PID)

#define ERROR_THRESHOLD 5.0

float TempControl(float set_temp, float curr_temp) {
staticfloat integral = 0;
float error = set_temp – curr_temp;

// 积分分离逻辑
if(fabs(error) < ERROR_THRESHOLD) {
integral += error;
}

// 微分项低通滤波
staticfloat prev_error = 0;
float d_filter = 0.3*(error – prev_error) + 0.7*d_filter;

return Kp*error + Ki*integral + Kd*d_filter;
}

调参技巧:

加入PWM占空比渐变算法,防止加热膜频繁通断

采样周期建议1-2秒,避免传感器噪声干扰

 

3.平衡车直立控制(两轮自平衡小车)

采用串级PID控制:

内环(电机转速环):增量式PI控制

外环(车身姿态环):PD控制

核心代码段

// 增量式速度环
int16_t Speed_PI(int16_t actual_speed, int16_t target) {
staticint32_t integral = 0;
int16_t error = target – actual_speed;
integral += error;

// 输出限幅±1000
int16_t output = KP_SPEED*error + KI_SPEED*integral;
return constrain(output, -1000, 1000);
}

// 姿态环PD控制
float Attitude_PD(float angle, float gyro) {
return KP_ANGLE*(angle – setpoint) + KD_ANGLE*gyro;
}

调参技巧:

角度环KP建议6.0-8.0,KD取0.5-1.2

采用互补滤波融合MPU6050的加速度计与陀螺仪数据

 

更多应用场景

4.无人机悬停控制(四旋翼飞行器)

应用背景

通过MPU6050获取飞行器姿态角,采用串级PID控制实现悬停稳定:

外环高度环(气压计数据)

内环姿态环(陀螺仪+加速度计数据)

代码实现(姿态环PD控制)

typedef struct {
float Kp_roll, Kd_roll;
float Kp_pitch, Kd_pitch;
float Kp_yaw, Kd_yaw;
} AttitudePID;

float Attitude_Control(AttitudePID *pid, float current_angle, float gyro_rate) {
// 角度偏差计算
float error = 0 – current_angle; // 目标角度为0(水平)

// PD控制输出
return pid->Kp_roll * error + pid->Kd_roll * gyro_rate;
}

// 定时器中断调用示例(100Hz)
void TIM3_IRQHandler() {
static AttitudePID pid = {6.0, 0.8, 6.0, 0.8, 3.0, 0.5};
float angle = Get_IMU_Angle(); // 获取当前姿态角
float gyro = Get_IMU_Gyro();  // 获取角速度
float output = Attitude_Control(&pid, angle, gyro);
Set_Motor_Power(output);
}

调参技巧:

典型参数范围:Kp(5.0-8.0)、Kd(0.5-1.5)

采用互补滤波器融合传感器数据

 

5.智能家居恒湿控制(加湿器系统)

应用背景

维持室内湿度在设定值±3%RH范围内,通过DHT22传感器采集湿度数据,控制超声波雾化片工作频率。

代码实现(带死区PID)

#define DEAD_ZONE 2.0 // 湿度死区范围

float Humidity_PID(float set_hum, float curr_hum) {
static PID_Controller pid;
staticuint8_t initialized = 0;

if(!initialized) {
PID_Init(&pid, 1.2, 0.05, 0.0, 1.0, 100.0); // T=1s
initialized = 1;
}

// 死区处理
if(fabs(set_hum – curr_hum) < DEAD_ZONE)
return0;

return PID_Calculate(&pid, set_hum, curr_hum);
}

调参技巧:

加入PWM软启动防止冷凝水积聚

采用滑动平均滤波处理传感器噪声

 

6.汽车定速巡航控制

采用速度-油门双闭环:

外环速度环(GPS/编码器测速)

内环油门环(节气门位置传感器)

核心算法

// 增量式速度PID
typedefstruct {
float Kp, Ki;
float prev_error;
int16_t integral;
} SpeedPID;

int16_t Cruise_Control(SpeedPID *pid, int16_t actual_speed, int16_t target) {
int16_t error = target – actual_speed;
int16_t d_error = error – pid->prev_error;

// 积分抗饱和
if(abs(pid->integral) < 1000)
pid->integral += error;

int16_t output = pid->Kp * error
+ pid->Ki * pid->integral
+ pid->Kd * d_error;

pid->prev_error = error;
return constrain(output, 0, 1000); // 油门0-100%
}

调参技巧:

刹车信号触发时立即清零积分项

车速突变时自动切换为PI控制

 

7.工业压力容器控制

应用背景

在化工生产线中维持反应釜压力在5MPa±0.02MPa,通过压力变送器采集数据,调节进气阀开度。

代码实现(带前馈补偿)

float Pressure_Control(float set_press, float curr_press, float flow_rate) {
static PID_Controller pid;
static float feedforward = 0;

// 前馈补偿(根据流量预测)
feedforward = flow_rate * 0.15;

// PID计算
float pid_out = PID_Calculate(&pid, set_press, curr_press);

return pid_out + feedforward;
}

调参技巧:

对微分项进行一阶低通滤波(截止频率10Hz)

采用Smith预估器补偿阀门延迟

 

8.智能车巡线控制(机器人路径跟踪)

应用背景

通过红外传感器阵列检测赛道黑线,采用多传感器融合PID算法实现路径跟踪。典型应用于智能物流AGV、竞赛机器人等场景。

代码实现(带传感器滤波)

// 五路巡线传感器处理
#define SENSOR_NUM 5
uint8_t sensor_values[SENSOR_NUM];

float LineTracking_PID() {
static PID_Controller pid;
staticfloat position = 0;

// 传感器数据加权计算偏差
for(int i=0; i<SENSOR_NUM; i++) {
position += (i-2) * sensor_values[i]; // -2,-1,0,1,2权重
}

// 一阶低通滤波(α=0.3)
staticfloat last_pos = 0;
position = 0.7*last_pos + 0.3*position;
last_pos = position;

return PID_Calculate(&pid, 0, position); // 目标位置为0
}

调参技巧:

传感器布局间距建议15-20mm

典型参数:Kp=0.8, Ki=0.01, Kd=0.05

加入转向死区防止高频抖动

 

9.相机云台稳定控制(无人机航拍)

应用背景

抵消飞行器抖动,保持相机俯仰/横滚轴±0.1°精度。采用MPU6050获取姿态角,通过BLDC电机驱动云台。

核心算法

// 串级PID实现(姿态环+角速度环)
typedef struct {
PID outer; // 姿态环PID
PID inner; // 角速度环PID
} CascadePID;

float Gimbal_Control(CascadePID *cpid, float angle, float gyro) {
// 外环计算目标角速度
float target_gyro = PID_Calculate(&cpid->outer, 0, angle);

// 内环计算电机输出
return PID_Calculate(&cpid->inner, target_gyro, gyro);
}

调参技巧:

外环:Kp=8.0, Ki=0, Kd=1.2

内环:Kp=0.5, Ki=0.01, Kd=0.05

采用互补滤波融合加速度计与陀螺仪数据

 

10.火箭姿态控制(航空航天)

三轴PID控制:

俯仰轴:控制发动机矢量喷管

偏航轴:控制侧向推力器

滚转轴:控制RCS喷气系统

代码片段(抗饱和设计)

float Rocket_Attitude_PID(float error, float gyro) {
static PID_Controller pid;
staticfloat integral_limit = 50.0;

// 抗积分饱和
if(fabs(pid.integral) > integral_limit) {
pid.integral = (pid.integral>0) ? integral_limit : -integral_limit;
}

// 微分项低通滤波
staticfloat d_filter = 0;
d_filter = 0.2*(error – pid.prev_error) + 0.8*d_filter;

return pid.Kp*error + pid.Ki*pid.integral + pid.Kd*d_filter;
}

调参技巧:

执行周期1ms级实时性要求

采用冗余PID控制器实现故障容错

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注