一、項目概述
本文基于 STM32F103C8T6 單片機,設計了一個高精度溫度控制系統。通過 DS18B20 采集溫度,采用位置型 PID 算法控制 PWM 輸出驅動 MOS 管加熱Pi膜,配合 OLED 實時顯示溫度數據。系統可穩定將 PI 膜加熱至 40℃,適用于實驗室加熱裝置、小型溫控設備等場景(可以換加熱模塊)。
二、硬件方案
模塊 | 型號/參數 | 功能描述 |
---|---|---|
主控芯片 | STM32F103C8T6 | 核心控制單元 |
溫度傳感器 | DS18B20 | 溫度采集(-55℃~+125℃) |
顯示模塊 | SSD1306 0.96寸OLED | 實時顯示溫度和系統狀態 |
驅動電路 | IRF540N MOS管+續流二極管 | 加熱膜功率控制 |
加熱裝置 | PI膜(12V/50W) | 電加熱執行器 |
三、軟件架構
/* 系統流程示意圖 */
主循環:
初始化 → OLED顯示 → DS18B20讀取溫度 → PID計算 → PWM輸出 → 延時刷新
1. DS18B20 驅動優化
c
// 溫度讀取函數優化(去除冗余代碼)
float DS18B20_Get_Temp(void)
{u8 data[2];short raw;DS18B20_Start();DS18B20_Read_Byte(); // 跳過溫度值高位data[0] = DS18B20_Read_Byte(); // 讀取溫度值低位data[1] = DS18B20_Read_Byte(); // 讀取溫度值高位raw = (data[1] << 8) | data[0];return (float)raw * 0.0625; // 精度優化,直接計算0.0625℃/LSB
}
- 位置型 PID 算法實現
// PID結構體定義
typedef struct {float Kp, Ki, Kd; // 控制參數float err[3]; // 誤差隊列 [e(k), e(k-1), e(k-2)]float integral; // 積分累加值
} PIDController;// PID計算函數(增加限幅保護)
float PID_Compute(PIDController *pid, float setpoint, float feedback)
{pid->err[0] = setpoint - feedback;pid->integral += pid->err[0];// 積分限幅(防止積分飽和)if(pid->integral > 1000) pid->integral = 1000;else if(pid->integral < -1000) pid->integral = -1000;float output = pid->Kp * pid->err[0] +pid->Ki * pid->integral +pid->Kd * (pid->err[0] - 2*pid->err[1] + pid->err[2]);// 輸出限幅(0~100%占空比)if(output > 100) output = 100;else if(output < 0) output = 0;// 更新誤差隊列pid->err[2] = pid->err[1];pid->err[1] = pid->err[0];return output;
}
- 顯示優化方案
// OLED顯示函數重構
void OLED_Update(float temp, float pwm)
{static char buf[20];// 溫度顯示sprintf(buf, "Temp: %.1f C", temp);OLED_ShowString(0, 0, (u8*)buf, 16, 1);// PWM輸出顯示sprintf(buf, "PWM: %.0f %%", pwm);OLED_ShowString(0, 24, (u8*)buf, 16, 1);// 狀態指示OLED_ShowChinese(0, 48, 0, 16, 1); // 溫OLED_ShowChinese(16, 48, 1, 16, 1); // 控OLED_ShowChinese(32, 48, 2, 16, 1); // 系OLED_ShowChinese(48, 48, 3, 16, 1); // 統
}
四、主函數核心邏輯
主函數是整個溫控系統的調度中心,負責初始化配置、循環采集數據、執行控制算法并更新顯示。其核心邏輯如下:
int main(void)
{// 1. 系統初始化PID_Init(&pid, 55, 0.1, 0.8); // 初始化PID參數DS18B20_Init(); // 溫度傳感器初始化OLED_Init(); // OLED顯示初始化PWM_Init(); // PWM輸出初始化// 2. 主控制循環while (1){// 2.1 溫度采集與處理float current_temp = DS18B20_Get_Temp();current_temp = Filter_Temp(current_temp); // 滑動平均濾波// 2.2 PID控制算法float pwm_value = PID_Compute(&pid, 40.0, current_temp);// 2.3 輸出控制PWM_SetCompare1(pwm_value);// 2.4 數據顯示OLED_Update(current_temp, pwm_value);// 2.5 系統延時(建議100ms周期)Delay_ms(100);}
}
四、調試優化
PID 參數整定:
初始參數:Kp=55, Ki=0, Kd=0.8
現象:溫度上升較快但存在超調
優化:增加積分項(Ki=0.1)并降低微分作用
抗干擾措施:
// 溫度濾波算法(滑動平均濾波)
float Filter_Temp(float new_temp)
{static float temp_buf[5] = {0};static u8 index = 0;temp_buf[index++] = new_temp;if(index >= 5) index = 0;float sum = 0;for(u8 i=0; i<5; i++) sum += temp_buf[i];return sum / 5;
}
五、測試結果
時間 (s) | 實測溫度 (℃) | PWM 輸出 (%) | 狀態描述 |
---|---|---|---|
0 | 25.0 | 100 | 快速加熱 |
30 | 38.5 | 85 | 接近目標值 |
60 | 40.2 | 15 | 超調后穩定 |
120 | 40.0 | 20 | 穩定維持 |
有問題歡迎評論區留言,需要資料滴滴,或者觀看b站視頻:小陳學長的電子實驗室