大家好,我是專注分享職業(yè)規(guī)劃/技術(shù)科普/智能生活有關(guān)原創(chuàng)文章的allen康哥。
今天分享10個應(yīng)用PID控制算法做的黑科技產(chǎn)品
在嵌入式開發(fā)領(lǐng)域,PID控制算法是非常常用且高效的一個控制算法??梢酝ㄟ^今天的文章有個概念。
三大經(jīng)典應(yīng)用
1.電機(jī)轉(zhuǎn)速與位置控制(工業(yè)機(jī)械臂應(yīng)用)
應(yīng)用背景
機(jī)械臂關(guān)節(jié)的精準(zhǔn)定位和速度控制是工業(yè)自動化中的核心需求。通過STM32的編碼器采集電機(jī)位置反饋,采用雙閉環(huán)控制結(jié)構(gòu)(外環(huán)位置環(huán)+內(nèi)環(huán)速度環(huán))實(shí)現(xiàn)毫米級定位精度。
代碼實(shí)現(xiàn)(位置式PID)
// 位置式PID結(jié)構(gòu)體
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;
}
調(diào)參技巧:
典型參數(shù)范圍:Kp(0.1-1.0)、Ki(0.01-0.1)、Kd(0-0.05)
出現(xiàn)震蕩時(shí)降低Kp,穩(wěn)態(tài)誤差增大Ki,超調(diào)過大增加Kd
2.溫度恒溫控制(3D打印機(jī)熱床)
應(yīng)用背景
在3D打印過程中,熱床需要快速升溫至設(shè)定溫度(如60℃)并保持±0.5℃波動。采用NTC熱敏電阻采集溫度,通過PWM控制加熱膜功率。
代碼實(shí)現(xiàn)(積分分離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;
? ? }
? ??
? ??// 微分項(xiàng)低通濾波
? ??staticfloat?prev_error =?0;
? ??float?d_filter =?0.3*(error - prev_error) +?0.7*d_filter;
? ??
? ??return?Kp*error + Ki*integral + Kd*d_filter;
}
調(diào)參技巧:
加入PWM占空比漸變算法,防止加熱膜頻繁通斷
采樣周期建議1-2秒,避免傳感器噪聲干擾
3.平衡車直立控制(兩輪自平衡小車)
采用串級PID控制:
內(nèi)環(huán)(電機(jī)轉(zhuǎn)速環(huán)):增量式PI控制
外環(huán)(車身姿態(tài)環(huán)):PD控制
核心代碼段
// 增量式速度環(huán)
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);
}
// 姿態(tài)環(huán)PD控制
float?Attitude_PD(float?angle,?float?gyro)?{
? ??return?KP_ANGLE*(angle - setpoint) + KD_ANGLE*gyro;
}
調(diào)參技巧:
角度環(huán)KP建議6.0-8.0,KD取0.5-1.2
采用互補(bǔ)濾波融合MPU6050的加速度計(jì)與陀螺儀數(shù)據(jù)
更多應(yīng)用場景
4.無人機(jī)懸??刂疲ㄋ男盹w行器)
應(yīng)用背景
通過MPU6050獲取飛行器姿態(tài)角,采用串級PID控制實(shí)現(xiàn)懸停穩(wěn)定:
外環(huán)高度環(huán)(氣壓計(jì)數(shù)據(jù))
內(nèi)環(huán)姿態(tài)環(huán)(陀螺儀+加速度計(jì)數(shù)據(jù))
代碼實(shí)現(xiàn)(姿態(tài)環(huán)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)?{
? ??// 角度偏差計(jì)算
? ??float?error =?0?- current_angle;?// 目標(biāo)角度為0(水平)
? ??
? ??// PD控制輸出
? ??return?pid->Kp_roll * error + pid->Kd_roll * gyro_rate;
}
// 定時(shí)器中斷調(diào)用示例(100Hz)
void?TIM3_IRQHandler()?{
? ??static?AttitudePID pid = {6.0,?0.8,?6.0,?0.8,?3.0,?0.5};
? ??float?angle = Get_IMU_Angle();?// 獲取當(dāng)前姿態(tài)角
? ??float?gyro = Get_IMU_Gyro(); ?// 獲取角速度
? ??float?output = Attitude_Control(&pid, angle, gyro);
? ? Set_Motor_Power(output);
}
調(diào)參技巧:
典型參數(shù)范圍:Kp(5.0-8.0)、Kd(0.5-1.5)
采用互補(bǔ)濾波器融合傳感器數(shù)據(jù)
5.智能家居恒濕控制(加濕器系統(tǒng))
應(yīng)用背景
維持室內(nèi)濕度在設(shè)定值±3%RH范圍內(nèi),通過DHT22傳感器采集濕度數(shù)據(jù),控制超聲波霧化片工作頻率。
代碼實(shí)現(xiàn)(帶死區(qū)PID)
#define?DEAD_ZONE 2.0?// 濕度死區(qū)范圍
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;
? ? }
? ??
? ??// 死區(qū)處理
? ??if(fabs(set_hum - curr_hum) < DEAD_ZONE)?
? ? ? ??return0;
? ? ? ??
? ??return?PID_Calculate(&pid, set_hum, curr_hum);
}
調(diào)參技巧:
加入PWM軟啟動防止冷凝水積聚
采用滑動平均濾波處理傳感器噪聲
6.汽車定速巡航控制
采用速度-油門雙閉環(huán):
外環(huán)速度環(huán)(GPS/編碼器測速)
內(nèi)環(huán)油門環(huán)(節(jié)氣門位置傳感器)
核心算法
// 增量式速度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%
}
調(diào)參技巧:
剎車信號觸發(fā)時(shí)立即清零積分項(xiàng)
車速突變時(shí)自動切換為PI控制
7.工業(yè)壓力容器控制
應(yīng)用背景
在化工生產(chǎn)線中維持反應(yīng)釜壓力在5MPa±0.02MPa,通過壓力變送器采集數(shù)據(jù),調(diào)節(jié)進(jìn)氣閥開度。
代碼實(shí)現(xiàn)(帶前饋補(bǔ)償)
float?Pressure_Control(float?set_press,?float?curr_press,?float?flow_rate)?{
? ??static?PID_Controller pid;
? ??static?float?feedforward =?0;
? ??
? ??// 前饋補(bǔ)償(根據(jù)流量預(yù)測)
? ? feedforward = flow_rate *?0.15;
? ??
? ??// PID計(jì)算
? ??float?pid_out = PID_Calculate(&pid, set_press, curr_press);
? ??
? ??return?pid_out + feedforward;
}
調(diào)參技巧:
對微分項(xiàng)進(jìn)行一階低通濾波(截止頻率10Hz)
采用Smith預(yù)估器補(bǔ)償閥門延遲
8.智能車巡線控制(機(jī)器人路徑跟蹤)
應(yīng)用背景
通過紅外傳感器陣列檢測賽道黑線,采用多傳感器融合PID算法實(shí)現(xiàn)路徑跟蹤。典型應(yīng)用于智能物流AGV、競賽機(jī)器人等場景。
代碼實(shí)現(xiàn)(帶傳感器濾波)
// 五路巡線傳感器處理
#define?SENSOR_NUM 5
uint8_t?sensor_values[SENSOR_NUM];
float?LineTracking_PID()?{
? ??static?PID_Controller pid;
? ??staticfloat?position =?0;
? ??
? ??// 傳感器數(shù)據(jù)加權(quán)計(jì)算偏差
? ??for(int?i=0; i<SENSOR_NUM; i++) {
? ? ? ? position += (i-2) * sensor_values[i];?// -2,-1,0,1,2權(quán)重
? ? }
? ??
? ??// 一階低通濾波(α=0.3)
? ??staticfloat?last_pos =?0;
? ? position =?0.7*last_pos +?0.3*position;
? ? last_pos = position;
? ??
? ??return?PID_Calculate(&pid,?0, position);?// 目標(biāo)位置為0
}
調(diào)參技巧:
傳感器布局間距建議15-20mm
典型參數(shù):Kp=0.8, Ki=0.01, Kd=0.05
加入轉(zhuǎn)向死區(qū)防止高頻抖動
9.相機(jī)云臺穩(wěn)定控制(無人機(jī)航拍)
應(yīng)用背景
抵消飛行器抖動,保持相機(jī)俯仰/橫滾軸±0.1°精度。采用MPU6050獲取姿態(tài)角,通過BLDC電機(jī)驅(qū)動云臺。
核心算法
// 串級PID實(shí)現(xiàn)(姿態(tài)環(huán)+角速度環(huán))
typedef?struct?{
? ? PID outer;?// 姿態(tài)環(huán)PID
? ? PID inner;?// 角速度環(huán)PID
} CascadePID;
float?Gimbal_Control(CascadePID *cpid,?float?angle,?float?gyro)?{
? ??// 外環(huán)計(jì)算目標(biāo)角速度
? ??float?target_gyro = PID_Calculate(&cpid->outer,?0, angle);
? ??
? ??// 內(nèi)環(huán)計(jì)算電機(jī)輸出
? ??return?PID_Calculate(&cpid->inner, target_gyro, gyro);
}
調(diào)參技巧:
外環(huán):Kp=8.0, Ki=0, Kd=1.2
內(nèi)環(huán):Kp=0.5, Ki=0.01, Kd=0.05
采用互補(bǔ)濾波融合加速度計(jì)與陀螺儀數(shù)據(jù)
10.火箭姿態(tài)控制(航空航天)
三軸PID控制:
俯仰軸:控制發(fā)動機(jī)矢量噴管
偏航軸:控制側(cè)向推力器
滾轉(zhuǎn)軸:控制RCS噴氣系統(tǒng)
代碼片段(抗飽和設(shè)計(jì))
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;
? ? }
? ??
? ??// 微分項(xiàng)低通濾波
? ??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;
}
調(diào)參技巧:
執(zhí)行周期1ms級實(shí)時(shí)性要求
采用冗余PID控制器實(shí)現(xiàn)故障容錯
你好,我是Allen,CSDN博客專家,博客訪問超千萬。現(xiàn)任世界500強(qiáng)外企高級開發(fā)工程師,有多年國企和外企工作經(jīng)驗(yàn),擅長電子及嵌入式方向?qū)W習(xí)規(guī)劃,簡歷優(yōu)化及offer咨詢,高考/考研咨詢等,歡迎留言與我交流!