基于STM32的PT100温度控制器设计(含PID算法与数码管显示)

基于STM32的PT100温度控制器设计(含PID算法与数码管显示)

一、系统概述

以STM32F103C8T6为主控,实现PT100金属电阻温度检测、PID算法控制与数码管显示的闭环温度控制系统。核心功能包括:

应用场景:工业烘箱、恒温水箱、实验室温控设备等。

二、硬件设计

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(1kΩ) ── Vcc(3.3V)  
        │            │  
        R3(100Ω)     R2(1kΩ)  
        │            │  
GND ────┴────────────┴─── 电桥输出(ΔV)  
                │  
                ├─ LM358同相输入端  
                │  (放大后输出Vout=ΔV×100)  
                └─ 运放电源(3.3V/GND)

2.2.2 数码管显示电路(TM1637驱动)

2.2.3 执行器驱动电路(MOSFET PWM控制)

三、软件设计(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温度计算函数
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公式

// 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):

  1. 先设,增大至系统出现小幅震荡(临界比例度);

  2. 取临界的50%作为初始,加入积分(从0.1开始),消除静差;

  3. 加入微分(从0.05开始),抑制超调。

    示例参数(针对50W加热系统)。

4.2 抗干扰措施

五、测试结果

设定温度(℃) 实际稳定温度(℃) 超调量(%) 稳定时间(s)
25 25.2 0.8 20
50 50.1 0.2 25
100 100.3 0.3 30

六、总结

基于STM32的PT100温度控制,核心包括信号调理电路、PID算法与数码管显示。通过查表法提高温度计算精度,PID参数整定确保系统稳定,可扩展为工业级温控设备。

专注于matlab/simulink,电子电路,编程