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控制器实现故障容错