
开源协议
:GPL 3.0
描述
硬件部分
-
USB-C + PD 诱骗
-
TYPE-C 16P(073) →
PW6606通过CC1/CC2与充电器通信,诱骗 20V(VSEL设置)到VBUS。 -
VBUS经C31–C38(8×47uF)滤波,提供稳定高压输入。
-
-
9V 线性降压
-
78L09(U23)将VBUS(≈20V)降至 9V,供模拟电路、运放、NTC 等使用。 -
输出滤波:
C27、C29(10uF)+C28、C30(100nF)。
-
-
3.3V 线性降压
-
LM317(U16)通过R5(6.98K)和R6(5.1K)调节输出为 3.3V,为主控STM32F103C8T6及其外围供电。 -
输出滤波:
C13、C15(10uF)+C11、C12、C14(100nF)。
-
二、主控与时钟系统
-
STM32F103C8T6(
U26):-
使用 8MHz 晶振(
X3) +C54、C55(12pF)提供主时钟。 -
NRST复位电路:C67(100nF)+R7(1K)上拉。 -
BOOT0接地(从 Flash 启动),BOOT1未接(默认0)。
-
-
SWD 下载接口:
PA13/SWDIO、PA14/SWCLK引出至H2(4P 排针)。
三、温度检测与信号调理
-
NTC 温度传感器
-
使用 外部 10K 3950 NTC(图中标注
NTC)接在R30(90.9K)与R31(10K)的分压网络中。 -
信号送入
STM32的 ADC 引脚(如PA0–PA3等),实现温度采样。
-
-
电流检测与放大
-
加热电流通过
R11(12mΩ)采样 → 电压信号经LM321(U19)放大 → 送入STM32的 ADC 引脚(如PA4–PA7)。 -
R9(18K)、R10(10K)、C9、C10(1nF)构成运放反馈与滤波网络,用于 PID 的电流环反馈。
-
四、加热驱动与 PWM 输出
-
MOS 驱动电路
-
STM32输出 PWM 信号(如PB0、PB1等)→EG3002(U18)驱动芯片 → 推动 CMSC3006(Q9,功率 MOS)控制加热膜通断。 -
2N7002(Q10)可能用于小电流开关或保护逻辑。
-
-
加热膜接口
-
从
CMSC3006的OUTD、OUTS引出至H10(4P 母座),连接加热膜负载。
-
五、PID 控温逻辑(推测)
| 环节 | 传感器/信号 | 执行器 | 控制策略 |
|---|---|---|---|
| 温度环 | NTC(ADC 采样) | PWM → MOS → 加热膜 | PID 调节占空比,稳定目标温度 |
| 电流环 | 12mΩ 采样 → LM321 | 同 PWM 输出 | 过流保护、恒流控制 |
| 电压环 | VBUS 分压检测 |
PD 诱骗电压选择 | 根据加热功率需求选择 PD 档位 |
六、用户交互与保护
-
按键调温:
SW2、SW3、SW4接STM32GPIO,用于设定温度、模式。 -
状态指示:
-
LED10(红色)接R23(10Ω)限流,用于电源/加热状态。 -
BUZZER1(2.7kHz)接STM32GPIO,用于报警或提示音。
-
-
保护电路:
-
SD103AWS(D1、D4)用于 VBUS 防反接/续流。 -
1N4148WS(D2、D3)用于信号隔离或电压钳位。 -
电流采样 + PWM 限幅实现硬件过流保护。
-
七、系统工作流程图(PID 控温)
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
克隆工程


评论