站内搜索
发作品签到
专业版

智能保温盒

工程标签

187
0
0
0

简介

智能加热盒,如果早餐冷了可以加热。PID调节温度

简介:智能加热盒,如果早餐冷了可以加热。PID调节温度
发热片暖冬开源挑战赛

开源协议

GPL 3.0

创建时间:2025-11-12 15:14:57更新时间:2025-12-04 17:40:51

描述

硬件部分

  1. USB-C + PD 诱骗

    • TYPE-C 16P(073) → PW6606 通过 CC1/CC2 与充电器通信,诱骗 20VVSEL 设置)到 VBUS

    • VBUS 经 C31–C38(8×47uF)滤波,提供稳定高压输入。

  2. 9V 线性降压

    • 78L09U23)将 VBUS(≈20V)降至 9V,供模拟电路、运放、NTC 等使用。

    • 输出滤波:C27C29(10uF)+ C28C30(100nF)。

  3. 3.3V 线性降压

    • LM317U16)通过 R5(6.98K)和 R6(5.1K)调节输出为 3.3V,为主控 STM32F103C8T6 及其外围供电。

    • 输出滤波:C13C15(10uF)+ C11C12C14(100nF)。

二、主控与时钟系统

  • STM32F103C8T6U26):

    • 使用 8MHz 晶振(X3) + C54C55(12pF)提供主时钟。

    • NRST 复位电路:C67(100nF)+ R7(1K)上拉。

    • BOOT0 接地(从 Flash 启动),BOOT1 未接(默认0)。

  • SWD 下载接口PA13/SWDIOPA14/SWCLK 引出至 H2(4P 排针)。

 三、温度检测与信号调理

  1. NTC 温度传感器

    • 使用 外部 10K 3950 NTC(图中标注 NTC)接在 R30(90.9K)与 R31(10K)的分压网络中。

    • 信号送入 STM32 的 ADC 引脚(如 PA0PA3 等),实现温度采样。

  2. 电流检测与放大

    • 加热电流通过 R11(12mΩ)采样 → 电压信号经 LM321U19)放大 → 送入 STM32 的 ADC 引脚(如 PA4PA7)。

    • R9(18K)、R10(10K)、C9C10(1nF)构成运放反馈与滤波网络,用于 PID 的电流环反馈。

四、加热驱动与 PWM 输出

  1. MOS 驱动电路

    • STM32 输出 PWM 信号(如 PB0PB1 等)→ EG3002U18)驱动芯片 → 推动 CMSC3006Q9,功率 MOS)控制加热膜通断。

    • 2N7002Q10)可能用于小电流开关或保护逻辑。

  2. 加热膜接口

    • 从 CMSC3006 的 OUTDOUTS 引出至 H10(4P 母座),连接加热膜负载。

 五、PID 控温逻辑(推测)

 
 
环节 传感器/信号 执行器 控制策略
温度环 NTC(ADC 采样) PWM → MOS → 加热膜 PID 调节占空比,稳定目标温度
电流环 12mΩ 采样 → LM321 同 PWM 输出 过流保护、恒流控制
电压环 VBUS 分压检测 PD 诱骗电压选择 根据加热功率需求选择 PD 档位

 六、用户交互与保护

  • 按键调温SW2SW3SW4 接 STM32 GPIO,用于设定温度、模式。

  • 状态指示

    • LED10(红色)接 R23(10Ω)限流,用于电源/加热状态。

    • BUZZER1(2.7kHz)接 STM32 GPIO,用于报警或提示音。

  • 保护电路

    • SD103AWSD1D4)用于 VBUS 防反接/续流。

    • 1N4148WSD2D3)用于信号隔离或电压钳位。

    • 电流采样 + PWM 限幅实现硬件过流保护。

七、系统工作流程图(PID 控温)

text
USB-C PD充电器
    ↓
PW6606 诱骗 20V → VBUS
    ↓
78L09 → 9V(模拟电源)
LM317 → 3.3V(数字电源)
    ↓
STM32 上电 → 读取 NTC 温度
    ↓
用户设定目标温度(按键)
    ↓
PID 计算(温度环 + 电流环)
    ↓
输出 PWM → EG3002 → CMSC3006 → 加热膜
    ↓
实时采样 NTC + 电流 → 反馈至 PID
    ↓
动态调节 PWM 占空比,保持恒温
    ↓
过流/超温 → 关闭 PWM + 蜂鸣器报警

软件部分

#include "mid_pid.h"

/************************************************
功能:初始化PID各参数
参数:pid = 对应pid的结构体地址
      p = pid的静态kp值
      i = pid的静态ki值
      d = pid的静态kd值
      maxI = pid计算后的I最大值,即最大误差累加值
      maxOut = PID最大输出值
      target = 目标值
************************************************/
void pid_init(PID* pid, float p, float i, float d, float maxI, float maxOut, int target)
{
    pid->kp = p;
    pid->ki = i;
    pid->kd = d;
    pid->max_change_i = maxI;
    pid->max_output = maxOut;
    pid->target = target;
}
/******************************************************************
 * 函 数 说 明:PID变化累计的参数清零
 * 函 数 形 参:pid=对应的PID地址
******************************************************************/
void pid_change_zero(PID* pid)
{
    pid->change_p = 0;
    pid->change_i = 0;
    pid->change_d = 0;
}

/****************************************************
功能:单级PID计算
参数:pid = pid的参数输入
     target = 目标值
     current = 当前值
返回:PID计算后的结果
****************************************************/
float pid_calc(PID *pid, float target, float current)
{
    //用上一次的误差值更新 之前误差last_error
    pid->last_error = pid->error;
    //获取新的误差 = 目标值 - 当前值
    pid->error = target - current;

    //计算比例P = 目标值与实际值之间的误差e
    float pout = pid->error;
    //计算积分I = 误差e的累加
    pid->change_i += pid->error;
    //计算微分D = 当前误差e - 之前的误差last_e
    float dout = pid->error - pid->last_error;

    //积分I 限制不能超过正负最大值
    if(pid->change_i > pid->max_change_i)
    {
      pid->change_i = pid->max_change_i;
    }
    else if(pid->change_i < -pid->max_change_i)
    {
      pid->change_i = -pid->max_change_i;
    }

    //计算输出PID_OUT = (Kp x P)+ (Ki x I)+(Kd x D)
    pid->output = (pid->kp * pout) + (pid->ki * pid->change_i) + (pid->kd * dout);

    //输出 限制不能超过正负最大值
    if(pid->output > pid->max_output) pid->output = pid->max_output;
    else if(pid->output < -pid->max_output) pid->output = -pid->max_output;

    //返回PID计算的结果
    return pid->output;
}

/******************************************************************
 * 函 数 说 明:串级PID的计算函数
 * 函 数 形 参:左到右依次是串级PID结构体,外环目标值,外环反馈值,内环反馈值
 * 函 数 返 回:
******************************************************************/
void pid_cascade_calc(CascadePID *pid, float outerRef, float outerFdb, int innerFdb)
{
    pid_calc(&pid->outer, outerRef, outerFdb); //计算外环    
    pid_calc(&pid->inner, pid->outer.output, innerFdb); //计算内环
    //内环输出就是串级PID的输出
    pid->output = pid->inner.output; 
}

外壳使用嘉立创的纸盒








设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

3D模型

序号文件名称下载次数
暂无数据

附件

序号文件名称下载次数
1
BOM_Board1_PCB1_2025-12-03.xlsx
2
克隆工程
添加到专辑
0
0
分享
侵权投诉

评论

全部评论(1
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航