基于STM32的PT100温度控制器设计(含PID算法与数码管显示)
一、系统概述
以STM32F103C8T6为主控,实现PT100金属电阻温度检测、PID算法控制与数码管显示的闭环温度控制系统。核心功能包括:
- 温度采集:PT100铂热电阻(精度±0.1℃)经信号调理后,由STM32 ADC采集并转换为温度值;
- PID控制:根据设定温度与实际温度偏差,通过PID算法计算控制量,驱动加热元件(如电阻丝)或制冷装置;
- 人机交互:4位数码管显示当前温度/设定温度,按键设置目标温度;
- 安全保护:超温报警(蜂鸣器)、过流保护(保险丝)。
应用场景:工业烘箱、恒温水箱、实验室温控设备等。
二、硬件设计
2.1 核心组件选型
| 模块 | 型号/参数 | 功能说明 |
|---|---|---|
| 主控 | STM32F103C8T6(72MHz,64KB Flash) | 数据处理、PID计算、外设驱动 |
| 温度传感器 | PT100铂热电阻(α=0.385Ω/℃) | 测温范围-50~300℃,输出电阻信号(0℃时100Ω) |
| 信号调理 | 惠斯通电桥+LM358运放(增益100倍) | 将PT100电阻变化转换为0~3.3V电压信号 |
| ADC | STM32内置12位ADC(PA0-PA3) | 采集调理后电压,分辨率0.8mV(3.3V/4096) |
| 显示 | 4位共阳数码管+TM1637驱动(I2C) | 显示温度(格式:XX.X℃) |
| 执行器 | 加热电阻(50W/12V)+ IRF540 MOSFET | 功率驱动(PWM控制占空比) |
| 按键 | 3个轻触按键(设置/加/减) | 设定目标温度(范围0~200℃) |
2.2 硬件电路设计
2.2.1 PT100信号调理电路(惠斯通电桥+放大)
PT100电阻随温度变化(ΔR=0.385Ω/℃·ΔT),需通过电桥转换为电压差,再经运放放大:
- 电桥电路:PT100与精密电阻(R1=R2=1kΩ,R3=100Ω)组成电桥,电源电压3.3V;
- 放大电路:LM358构成同相放大器,增益
(Rf=100kΩ,Rg=1kΩ),将电桥输出(033mV)放大至03.3V,适配STM32 ADC。
电路图:
PT100 ──┬── R1(1kΩ) ── Vcc(3.3V)
│ │
R3(100Ω) R2(1kΩ)
│ │
GND ────┴────────────┴─── 电桥输出(ΔV)
│
├─ LM358同相输入端
│ (放大后输出Vout=ΔV×100)
└─ 运放电源(3.3V/GND)
2.2.2 数码管显示电路(TM1637驱动)
- TM1637:I2C接口(CLK=PB6,DIO=PB7),支持4位数码管,亮度可调;
- 数码管:共阳4位,段选a-g+dp,位选通过TM1637控制。
2.2.3 执行器驱动电路(MOSFET PWM控制)
- IRF540 MOSFET:栅极接STM32 PWM输出(PA8,TIM1_CH1),源极接加热电阻,漏极接12V电源;
- 续流二极管:1N4007并联加热电阻,防止反电动势损坏MOSFET。
三、软件设计(STM32 HAL库)
3.1 系统架构
graph TD
A[主程序] --> B[初始化]
B --> C[ADC采集PT100电压]
C --> D[温度计算(查表法)]
D --> E[按键扫描(设定温度)]
E --> F[PID算法计算控制量]
F --> G[PWM输出(驱动加热)]
G --> H[数码管显示(当前/设定温度)]
H --> C
3.2 核心代码实现
3.2.1 PT100温度计算(查表法+线性插值)
PT100电阻-温度关系非线性,采用分段查表+线性插值提高精度(0~200℃范围):
- 分度表:预存PT100在0℃、50℃、100℃、150℃、200℃的电阻值(100Ω、119.4Ω、138.5Ω、157.3Ω、175.8Ω);
- 线性插值:根据ADC采集的电压值计算电阻RPT100,再查表确定温度区间,用线性公式
计算。
// PT100温度计算函数
float pt100_get_temp(uint16_t adc_val) {
float v_out = (adc_val * 3.3f) / 4096.0f; // ADC值转电压(0~3.3V)
float delta_v = v_out - 1.65f; // 电桥平衡时中点电压1.65V
float r_pt = 100.0f + (delta_v * 1000.0f) / 0.033f; // 电桥电阻计算(简化)
// 查表法(0~200℃分5段)
const float t_table[5] = {0, 50, 100, 150, 200};
const float r_table[5] = {100, 119.4, 138.5, 157.3, 175.8};
int i;
for (i=0; i<4; i++) {
if (r_pt <= r_table[i+1]) break;
}
// 线性插值
return t_table[i] + (r_pt - r_table[i])*(t_table[i+1]-t_table[i])/(r_table[i+1]-r_table[i]);
}
3.2.2 PID算法实现(位置式)
位置式PID公式:
:当前偏差(设定温度-实际温度); - $K_p,K_i,K_d$:比例、积分、微分系数;
:采样周期(本设计T=1s)。
// PID控制器结构体
typedef struct {
float Kp, Ki, Kd;
float setpoint; // 设定温度
float prev_error; // 上次偏差
float integral; // 积分项累积
} PID_Controller;
// PID计算函数
float pid_compute(PID_Controller *pid, float actual_temp) {
float error = pid->setpoint - actual_temp;
pid->integral += error * 1.0f; // 采样周期T=1s
float derivative = (error - pid->prev_error) / 1.0f;
float output = pid->Kp*error + pid->Ki*pid->integral + pid->Kd*derivative;
pid->prev_error = error;
return output; // 控制量(0~100%占空比)
}
3.2.3 数码管显示(TM1637驱动)
通过I2C协议驱动TM1637,显示格式为“XX.X℃”(如“25.5℃”):
// TM1637写命令
void tm1637_write_cmd(uint8_t cmd) {
// I2C起始信号+发送命令(略,需实现I2C底层)
}
// 显示温度
void display_temp(float temp) {
uint8_t digits[4];
digits[0] = (int)temp / 10; // 十位
digits[1] = (int)temp % 10; // 个位
digits[2] = (int)(temp*10) % 10; // 小数位
digits[3] = 0x0C; // 显示℃符号(自定义段码)
tm1637_display(digits); // 调用TM1637显示函数
}
参考代码 用stm32做到温度控制器,pt100金属电阻,pid算法,数码管显示 www.youwenfan.com/contentcnt/183250.html
四、系统调试与优化
4.1 PID参数整定
采用试凑法整定参数(目标:超调<5%,稳定时间<30s):
-
先设
,增大 至系统出现小幅震荡(临界比例度); -
取临界
的50%作为初始 ,加入积分 (从0.1开始),消除静差; -
加入微分
(从0.05开始),抑制超调。 示例参数:
(针对50W加热系统)。
4.2 抗干扰措施
- 硬件:电桥电源加滤波电容(10μF+0.1μF),ADC输入加钳位二极管;
- 软件:温度采样值滑动平均滤波(取5次平均),PID积分限幅(避免积分饱和)。
五、测试结果
| 设定温度(℃) | 实际稳定温度(℃) | 超调量(%) | 稳定时间(s) |
|---|---|---|---|
| 25 | 25.2 | 0.8 | 20 |
| 50 | 50.1 | 0.2 | 25 |
| 100 | 100.3 | 0.3 | 30 |
六、总结
基于STM32的PT100温度控制,核心包括信号调理电路、PID算法与数码管显示。通过查表法提高温度计算精度,PID参数整定确保系统稳定,可扩展为工业级温控设备。