首页
/ 嵌入式温控系统设计:基于STM32的PID与PWM控制实现方案

嵌入式温控系统设计:基于STM32的PID与PWM控制实现方案

2026-05-02 11:34:29作者:冯梦姬Eddie

副标题:中级技术难度 | 预计学习时间:4小时

一、问题引入:嵌入式温控的技术挑战

在工业控制与智能家居领域,温度控制的精度直接影响产品性能与用户体验。传统控制方式普遍存在超调量大、响应速度慢、稳态误差明显等问题。本文将以STM32F103C8T6为核心控制器,通过数字PID算法与PWM功率调节技术的结合,构建一套可实现±0.5℃控制精度的嵌入式温控系统,解决传统温控方案的技术痛点。

二、方案设计:系统架构与核心组件选型

2.1 控制系统整体架构

温控系统采用经典的闭环控制结构,主要由四大模块组成:

  • 温度采集模块:负责环境温度的实时监测
  • 控制算法模块:通过PID计算输出控制量
  • 执行机构模块:通过PWM信号调节加热功率
  • 人机交互模块:实现参数设置与状态显示

2.2 核心硬件选型分析

微控制器对比选型

性能参数 STM32F103C8T6 STM32F407IGH6 Arduino Mega
工作频率 72MHz 168MHz 16MHz
片上ADC 12位/16通道 12位/24通道 10位/16通道
PWM输出通道 4路高级定时器 12路高级定时器 15路普通PWM
开发成本 中等 较高
适用场景 中小型控制系统 复杂工业控制 教学实验

传感器技术选型

  • 模拟型:NTC热敏电阻(成本低,需校准)
  • 数字型:DS18B20(单总线,-55℃~125℃,±0.5℃精度)
  • 工业级:PT100铂电阻(-200℃~850℃,高精度)

本方案选用DS18B20数字温度传感器,兼顾精度与开发便捷性。

三、实施步骤:从硬件接线到软件实现

3.1 硬件接线指南

最小系统电路连接

  • STM32F103C8T6核心板
  • DS18B20温度传感器:VCC接3.3V,GND接GND,DATA接PA0(需外接4.7K上拉电阻)
  • 加热模块:通过NPN三极管驱动继电器,控制端接PB0(TIM3_CH3 PWM输出)
  • 调试接口:USART1(PA9/PA10)连接USB转TTL模块

接线注意事项

  • 传感器信号线应远离强电干扰
  • 加热回路需添加保险丝保护
  • PWM控制线路应使用屏蔽线减少干扰

3.2 软件开发环境配置

使用STM32CubeMX创建工程,关键配置步骤:

  1. 配置RCC时钟:外部8MHz晶振,系统时钟72MHz
  2. 配置GPIO:PA0为输入(传感器),PB0为复用推挽输出(PWM)
  3. 配置TIM3:PWM模式,频率1kHz,占空比0-100%可调
  4. 配置USART1:115200bps,8N1,用于调试信息输出
  5. 生成MDK-ARM工程文件

3.3 温度采集模块实现

DS18B20驱动核心代码:

uint8_t DS18B20_Start(void) {
    uint8_t ack=0;
    GPIO_SetBits(GPIOA, GPIO_Pin_0);
    delay_us(2);
    GPIO_ResetBits(GPIOA, GPIO_Pin_0);
    delay_us(480);  // 拉低总线480us以上
    GPIO_SetBits(GPIOA, GPIO_Pin_0);
    delay_us(60);   // 释放总线等待60us
    ack=GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
    delay_us(420);  // 等待剩余时间
    return ack;
}

float DS18B20_GetTemp(void) {
    uint8_t temp_data[2];
    float temp;
    
    DS18B20_Start();
    DS18B20_WriteByte(0xCC);  // 跳过ROM命令
    DS18B20_WriteByte(0x44);  // 温度转换命令
    HAL_Delay(750);           // 等待转换完成
    
    DS18B20_Start();
    DS18B20_WriteByte(0xCC);
    DS18B20_WriteByte(0xBE);  // 读取温度命令
    temp_data[0] = DS18B20_ReadByte();  // 低字节
    temp_data[1] = DS18B20_ReadByte();  // 高字节
    
    temp = (temp_data[1] << 8 | temp_data[0]) * 0.0625;
    return temp;
}

思考:为什么DS18B20需要严格的时序控制?与I2C或SPI接口相比有哪些优缺点?

3.4 PID算法实现

位置式PID控制器代码:

typedef struct {
    float setpoint;      // 设定温度
    float kp;            // 比例系数
    float ki;            // 积分系数
    float kd;            // 微分系数
    float error;         // 当前误差
    float last_error;    // 上一次误差
    float integral;      // 积分项
    float derivative;    // 微分项
    float output;        // 输出值
    float output_min;    // 输出最小值
    float output_max;    // 输出最大值
} PID_HandleTypeDef;

void PID_Init(PID_HandleTypeDef *pid, float kp, float ki, float kd, float min, float max) {
    pid->kp = kp;
    pid->ki = ki;
    pid->kd = kd;
    pid->output_min = min;
    pid->output_max = max;
    pid->error = 0;
    pid->last_error = 0;
    pid->integral = 0;
    pid->derivative = 0;
    pid->output = 0;
}

float PID_Compute(PID_HandleTypeDef *pid, float feedback) {
    pid->error = pid->setpoint - feedback;
    
    // 积分项计算(带限幅)
    pid->integral += pid->error * 0.1;  // 0.1为采样周期(秒)
    if (pid->integral > pid->output_max/pid->ki)
        pid->integral = pid->output_max/pid->ki;
    if (pid->integral < pid->output_min/pid->ki)
        pid->integral = pid->output_min/pid->ki;
    
    // 微分项计算
    pid->derivative = (pid->error - pid->last_error) / 0.1;
    
    // PID输出计算
    pid->output = pid->kp * pid->error + pid->ki * pid->integral + pid->kd * pid->derivative;
    
    // 输出限幅
    if (pid->output > pid->output_max)
        pid->output = pid->output_max;
    if (pid->output < pid->output_min)
        pid->output = pid->output_min;
    
    pid->last_error = pid->error;
    return pid->output;
}

3.5 PWM输出控制

PWM初始化与占空比设置:

void PWM_Init(void) {
    TIM_OC_InitTypeDef sConfigOC = {0};
    
    htim3.Instance = TIM3;
    htim3.Init.Prescaler = 71;       // 72MHz/72=1MHz
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim3.Init.Period = 999;         // 1MHz/(999+1)=1kHz
    htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&htim3);
    
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 0;              // 初始占空比0%
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3);
    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
}

void Set_PWM_Duty(float duty) {
    if (duty < 0) duty = 0;
    if (duty > 100) duty = 100;
    __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, (uint16_t)(duty * 10));  // 1000*0.1=100
}

思考:为什么在PWM输出前需要进行死区时间设置?在加热控制中如何避免功率器件的频繁开关?

四、优化调优:PID参数整定与系统性能提升

4.1 PID参数整定方法

临界比例度法步骤

  1. 置PID控制器为纯比例控制(Ki=0,Kd=0)
  2. 逐渐增大Kp直到系统出现等幅振荡,记录此时的临界比例系数Kp0和振荡周期T0
  3. 根据经验公式计算参数:
    • Kp = 0.6 * Kp0
    • Ti = 0.5 * T0
    • Td = 0.125 * T0

参数调试建议

  • 温度超调量大:减小Kp,增加Td
  • 响应速度慢:适当增加Kp,减小Ti
  • 稳态误差大:增加Ki,延长积分时间

4.2 系统抗干扰优化

硬件层面

  • 传感器线路添加RC滤波电路(10K电阻+104电容)
  • 电源输入端添加TVS管防雷击保护
  • 加热回路与控制电路光电隔离

软件层面

  • 温度数据采用滑动平均滤波:
float Filter_SMA(float new_value) {
    static float buffer[5] = {0};
    static uint8_t index = 0;
    float sum = 0;
    
    buffer[index++] = new_value;
    if (index >= 5) index = 0;
    
    for (uint8_t i=0; i<5; i++) {
        sum += buffer[i];
    }
    return sum / 5;
}

五、常见故障排查

5.1 硬件故障

故障现象 可能原因 排查方法
温度无变化 加热元件损坏 测量加热丝电阻值
温度跳变 传感器接触不良 检查接线端子是否松动
PWM无输出 定时器配置错误 使用示波器测量输出波形
系统频繁复位 电源纹波过大 增加电源滤波电容

5.2 软件故障

故障现象 可能原因 解决方法
温度持续上升 PID输出未限幅 添加输出上下限保护
温度波动剧烈 Kp值过大 减小比例系数
响应速度慢 采样周期过长 优化主循环周期
显示温度异常 传感器未初始化 检查初始化函数返回值

六、应用拓展:系统功能扩展方案

6.1 多区域温度控制

通过扩展多个DS18B20传感器(同一总线可挂接多个),实现多点温度监测与独立控制。关键修改:

  • 为每个传感器分配唯一ROM地址
  • 创建多个PID控制实例
  • 扩展PWM输出通道控制多个加热模块

6.2 上位机监控系统

通过USART转Wi-Fi模块(如ESP8266)实现数据上传,上位机功能包括:

  • 实时温度曲线显示
  • PID参数远程调节
  • 超温报警与记录
  • 历史数据查询与分析

6.3 低功耗优化设计

针对电池供电场景的节能措施:

  • 采用STM32的STOP模式,降低待机功耗
  • 动态调整采样频率(温度稳定后降低频率)
  • 使用低功耗传感器(工作电流<1mA)
  • 优化加热策略,减少开关次数

七、项目总结

本项目基于STM32F103C8T6微控制器,通过数字PID算法与PWM技术的结合,实现了高精度温度控制。系统具有结构简单、成本低廉、控制精度高的特点,可广泛应用于智能家居、工业控制、实验室设备等领域。

通过本项目的实践,读者可以掌握:

  • STM32外设(TIM、GPIO、USART)的配置与应用
  • 数字温度传感器的接口与数据处理
  • PID控制算法的原理与参数整定
  • 嵌入式系统的抗干扰设计与优化方法

建议进一步学习方向:自适应PID控制算法、模糊控制策略、多传感器数据融合技术,不断提升系统的智能化水平与控制精度。

附:项目代码获取

项目完整代码可通过以下命令获取:

git clone https://gitcode.com/gh_mirrors/stm322/STM32

代码位于项目的"温控"目录下,包含硬件原理图、STM32CubeMX配置文件和完整源代码。

登录后查看全文
热门项目推荐
相关项目推荐