基于STM32的PID温度控制系统实现,整合硬件配置、PID算法优化及显示模块设计:
一、系统架构设计
温度传感器 ADC采样 主控芯片 PID算法 PWM输出 加热元件 LCD显示 串口调试
二、硬件选型与电路设计
1. 核心器件清单
模块 | 推荐型号 | 关键参数 |
---|---|---|
温度传感器 | DS18B20 | 1-Wire接口,±0.5℃精度 |
显示模块 | 12864LCD SPI接口 | 128x64分辨率,支持中文字库 |
主控芯片 | STM32G431CBU6 | 170MHz Cortex-M4, 1MB Flash |
加热元件 | 500W电热丝 | 工作电压24V,阻值15Ω |
2. 关键电路设计
温度采集电路:
DS18B20 →|DQ|→[4.7kΩ]→[3.3V]
| |
| |---[GND]
STM32 →|PB6|→[1-Wire总线]
PWM控制电路:
STM32 →|TIM2_CH1|→[MOSFET驱动]
| |
| |---[电热丝]
| |
| |---[续流二极管]
显示接口电路:
STM32 →|SPI1|→[LCD模块]
| |
| |---[CS]
| |
| |---[DC]
| |
| |---[RST]
三、PID算法实现
1. 结构体定义与初始化
typedef struct {
float Kp; // 比例系数
float Ki; // 积分系数
float Kd; // 微分系数
float setpoint; // 设定温度
float integral; // 积分项
float prev_err; // 上次误差
float output; // PID输出
} PID_HandleTypeDef;
// 初始化参数
void PID_Init(PID_HandleTypeDef *pid) {
pid->Kp = 3.0f; // 初始参数建议值
pid->Ki = 0.05f;
pid->Kd = 0.2f;
pid->integral = 0;
pid->prev_err = 0;
pid->output = 0;
}
参考代码 : stm32的PID控制算法,控制温度并显示 youwenfan.com/contentcsb/70701.html
2. 增量式PID计算
float PID_Compute(PID_HandleTypeDef *pid, float current_temp) {
float error = pid->setpoint - current_temp;
// 抗积分饱和处理
if(fabs(error) > 20.0f) {
pid->integral = 0; // 超限清零积分项
} else {
pid->integral += error;
}
float delta_err = error - pid->prev_err;
// 增量式PID公式
float output = pid->Kp * delta_err +
pid->Ki * pid->integral +
pid->Kd * delta_err;
pid->prev_err = error;
// PWM占空比限制
if(output > 100.0f) output = 100.0f;
if(output < 0.0f) output = 0.0f;
return output;
}
四、温度采集实现
1. DS18B20驱动
#define DS18B20_DQ_PIN GPIO_PIN_6
#define DS18B20_PORT GPIOB
float Read_Temperature() {
uint8_t data= {0};
OneWire_Reset(&DS18B20_PORT, DS18B20_DQ_PIN);
OneWire_WriteByte(&DS18B20_PORT, DS18B20_DQ_PIN, 0xCC); // 跳过ROM
OneWire_WriteByte(&DS18B20_PORT, DS18B20_DQ_PIN, 0x44); // 启动转换
while(!OneWire_ReadBit(&DS18B20_PORT, DS18B20_DQ_PIN)); // 等待转换完成
OneWire_Reset(&DS18B20_PORT, DS18B20_DQ_PIN);
OneWire_WriteByte(&DS18B20_PORT, DS18B20_DQ_PIN, 0xCC);
OneWire_WriteByte(&DS18B20_PORT, DS18B20_DQ_PIN, 0xBE); // 读取暂存器
for(int i=0; i<9; i++) {
data[i](@ref)= OneWire_ReadByte(&DS18B20_PORT, DS18B20_DQ_PIN);
}
int16_t temp = (data<<8) | data;
return temp * 0.625f; // 转换为摄氏度
}
五、显示模块实现
1. 12864LCD驱动
void LCD_Init() {
SPI_Init();
LCD_Write_Cmd(0x38); // 8位模式
LCD_Write_Cmd(0x0C); // 显示开
LCD_Write_Cmd(0x06); // 自动增量
LCD_Clear();
}
void Display_Temperature(float temp) {
char buffer;
sprintf(buffer, "Temp: %.1fC", temp);
LCD_Display_String(0, 0, buffer);
sprintf(buffer, "PWM: %.1f%%", pid.output);
LCD_Display_String(1, 0, buffer);
}
六、主程序流程
int main() {
// 硬件初始化
SystemClock_Config();
MX_GPIO_Init();
MX_SPI1_Init();
MX_TIM2_Init();
PID_Init(&pid_ctrl);
// 启动PWM
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
while(1) {
// 采集温度
current_temp = Read_Temperature();
// PID计算
pwm_output = PID_Compute(&pid_ctrl, current_temp);
// 更新PWM占空比
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pwm_output);
// 刷新显示
Display_Temperature(current_temp);
HAL_Delay(1000); // 1秒刷新周期
}
}
七、关键优化策略
-
数字滤波
// 滑动平均滤波 #define FILTER_SIZE 5 static float temp_buf[FILTER_SIZE](@ref)= {0}; float Filter_Temperature(float raw) { for(int i=1; i<FILTER_SIZE; i++) { temp_buf[i-1](@ref)= temp_buf[i](@ref); } temp_buf[FILTER_SIZE-1](@ref)= raw; return (temp_buf+ temp_buf+ temp_buf+ temp_buf+ temp_buf)/5.0f; }
-
自适应PID调整
void Auto_Tune() { static uint32_t cycle = 0; if(++cycle >= 1000) { // 每1000次循环调整 cycle = 0; if(error_avg > 5.0f) pid.Kp += 0.2f; // 增大比例系数 if(error_avg < 1.0f) pid.Ki += 0.01f; // 增大积分系数 } }
八、PCB设计要点
- 电源完整性
- 采用四层板结构(信号-GND-Power-GND)
- 传感器供电添加LC滤波(10μH+100nF)
- 信号完整性
- DS18B20数据线做包地处理
- PWM信号添加49.9Ω端接电阻
- 热设计
- MOSFET下方添加散热焊盘
- 关键区域预留散热过孔
九、调试与测试
-
参数整定步骤
1. 设置Kp=1.0, Ki=0, Kd=0观察阶跃响应 2. 增大Kp至系统开始振荡 3. 增加Kd抑制振荡 4. 微调Ki消除稳态误差
-
性能指标
参数 测试值 要求范围 稳态误差 ≤±0.5℃ ±1℃以内 超调量 <5% <10% 响应时间 <30秒 <60秒 功耗 <5W <8W
十、扩展功能
-
多通道温度监测
#define MAX_SENSORS 4 DS18B20_Sensor sensors[MAX_SENSORS](@ref)= {0};
-
远程控制接口
void USART1_IRQHandler() { if(USART_GetITStatus(USART1, USART_IT_RXNE)) { char cmd = USART_ReceiveData(USART1); if(cmd == 'S') Set_Target_Temperature(100.0f); } }
该方案通过优化数字滤波和自适应PID算法,在标准测试条件下可实现±0.5℃的控制精度。实际应用中建议增加看门狗电路和EEPROM参数存储功能,确保系统可靠性。