根據代碼分析,以下是針對PID算法和光敏傳感器系統的優化建議,分為算法優化、代碼結構優化和系統級優化三部分:
一、PID算法優化
1. 增量式PID + 輸出平滑
// 修改PID計算函數
uint16_t PID_calculation_fun(void) {if(PID_Str_Val.Tdata >= PID_Str_Val.T) {// 增量式PID計算float delta = PID_Str_Val.Kp * (PID_Str_Val.En - PID_Str_Val.En_1) +PID_Str_Val.Ki * PID_Str_Val.En + PID_Str_Val.Kd * (PID_Str_Val.En - 2*PID_Str_Val.En_1 + PID_Str_Val.En_2);// 輸出變化率限制(避免突變)if (delta > PID_Str_Val.max_delta) delta = PID_Str_Val.max_delta;else if (delta < -PID_Str_Val.max_delta) delta = -PID_Str_Val.max_delta;// 低通濾波平滑輸出PID_Str_Val.Dout = PID_Str_Val.output_alpha * delta + (1 - PID_Str_Val.output_alpha) * PID_Str_Val.Dout;PID_Str_Val.currpwm += PID_Str_Val.Dout;// ...限幅和狀態更新}return (uint16_t)PID_Str_Val.currpwm;
}
優化點:
- 增量式算法減少階躍響應超調。
- 輸出變化率限制(
max_delta
)避免劇烈波動。 - 低通濾波(
output_alpha
)平滑最終輸出。
2. 動態參數調整
// 根據光照變化動態調整PID參數
if (fabs(PID_Str_Val.En) > 500) { // 大誤差時增強響應PID_Str_Val.Kp = 0.8;PID_Str_Val.Ki = 0.05;
} else { // 小誤差時抑制振蕩PID_Str_Val.Kp = 0.3;PID_Str_Val.Ki = 0.01;
}
二、輸入信號處理優化
1. 改進滑動平均濾波
// 使用加權滑動平均(近期數據權重更高)
float sum = 0, weight_total = 0;
for(int i=0; i<FILTER_WINDOW_SIZE; i++) {float weight = 1.0f / (i + 1); // 權重遞減sum += filter_buffer[i] * weight;weight_total += weight;
}
PID_Str_Val.curr = sum / weight_total;
2. 死區處理
// 忽略微小誤差(避免頻繁調節)
if (fabs(PID_Str_Val.En) < PID_Str_Val.dead_zone) {PID_Str_Val.En = 0;
}
三、系統級優化
1. 自適應采樣周期
// 根據光照變化速度動態調整采樣周期
if (fabs(PID_Str_Val.En - PID_Str_Val.En_1) > 200) { // 快速變化時加速采樣PID_Str_Val.T = 20; // 20ms
} else {PID_Str_Val.T = 50; // 50ms
}
2. 硬件優化
- ADC配置:提高ADC采樣率(修改
config.clk
),減少軟件濾波壓力。 - GPIO抗干擾:在光敏傳感器輸入端添加RC低通濾波(如100Ω電阻 + 100nF電容)。
四、代碼結構優化
1. 模塊化PID參數
typedef struct {float Kp, Ki, Kd;float T, Ti, Td;float dead_zone;float max_delta;float output_alpha;
} PID_Params;PID_Params fast_params = {0.8, 0.05, 0.1, 20, 30, 0.2, 10, 5, 0.3};
PID_Params slow_params = {0.3, 0.01, 0.05, 50, 50, 0.1, 5, 2, 0.5};
2. 狀態機管理
typedef enum {PID_STATE_INIT,PID_STATE_STEADY,PID_STATE_TRACKING
} PID_State;// 根據狀態切換參數
switch (current_state) {case PID_STATE_TRACKING:apply_params(fast_params);break;case PID_STATE_STEADY:apply_params(slow_params);break;
}
五、參數調試建議
-
調試順序:
- 先調 P(
Kp
)至系統開始振蕩,然后減半。 - 再調 I(
Ki
)至穩態誤差消除,但避免積分飽和。 - 最后調 D(
Kd
)抑制超調。
- 先調 P(
-
典型參數參考:
PID_Str_Val.Kp = 0.5; // 比例(根據實際響應調整) PID_Str_Val.Ki = 0.02; // 積分(較小值防飽和) PID_Str_Val.Kd = 0.1; // 微分(抑制高頻噪聲) PID_Str_Val.dead_zone = 20; // 死區(約2%量程) PID_Str_Val.max_delta = 10; // 單步最大變化量
六、驗證與測試
- 階躍響應測試:
- 突然遮擋光源,觀察輸出是否平穩跟蹤。
- 抗干擾測試:
- 手動制造光照波動,檢查恢復速度。
- 長期穩定性:
- 連續運行24小時,確認無漂移或振蕩。
通過上述優化,系統將具有更平滑的響應、更低的抖動和更好的適應性。