基于 STC15F104E 的 T12 白光烙铁控制器方案

STC15F104E 只有 8 个引脚,资源非常紧张,因此必须用最少的外设实现温控 + PWM + 睡眠 + 报警,这也是目前网上最常见、最稳定的做法。


一、硬件方案

1、引脚分配(STC15F104E)

引脚 功能
P3.1 (TXD) 振动开关 / 手柄晃动检测
P3.0 (RXD) 按键(短按加温 / 长按睡眠)
P3.2 (INT0) 热电偶输入(LM358 放大后)
P3.3 (INT1) PWM 输出 → MOSFET
P3.4 指示灯 LED
VCC / GND 5V 供电

2、典型电路结构

复制代码
T12 烙铁头
   │
   ├── 加热丝 → MOSFET → GND
   │
   └── 热电偶(mV级)
           ↓
        LM358 放大 ×100
           ↓
       STC15F104E ADC

MOSFET :AO3400 / IRLZ44N
放大电路 :LM358 单电源放大
供电:DC 24V → 7805 → 5V


二、温度采集原理

T12 的热电偶输出约 2--5 mV/℃,必须放大:

复制代码
放大倍数 ≈ Rf / Rin ≈ 100
ADC 分辨率:STC15F104E ≈ 10bit

温度计算公式(经验拟合):

c 复制代码
temp = adc * 0.48 - 50;

实际一定要 实物校准


三、核心控制逻辑

PID 控制 PWM 占空比
定时采样(100ms)
休眠 / 唤醒
防干烧


四、示例代码

1、头文件与宏定义

c 复制代码
#include <STC15F104E.H>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char

#define PWM_PIN P33
#define LED_PIN P34
#define KEY_PIN P30
#define SHAKE_PIN P31

#define TEMP_TARGET 300   // 目标温度 ℃

2、PWM(软件 PWM)

c 复制代码
uchar pwm_cnt = 0;
uchar pwm_duty = 0;

void Timer0Init(void) {
    AUXR &= 0x7F;
    TMOD &= 0xF0;
    TL0 = 0xCD;
    TH0 = 0xD4;
    TR0 = 1;
    ET0 = 1;
    EA = 1;
}

void Timer0_ISR() interrupt 1 {
    pwm_cnt++;
    if (pwm_cnt >= 100) pwm_cnt = 0;

    PWM_PIN = (pwm_cnt < pwm_duty) ? 1 : 0;
}

3、ADC 读取温度

c 复制代码
uint Get_ADC(void) {
    ADC_CONTR = 0x80 | 0x02; // 通道2
    _nop_(); _nop_();
    ADC_CONTR |= 0x40;
    while (!(ADC_CONTR & 0x20));
    return (ADC_RES << 2) | (ADC_RESL & 0x03);
}

4、温度转换

c 复制代码
uint Get_Temp(void) {
    uint adc;
    adc = Get_ADC();
    return (uint)(adc * 0.48 - 50); // 校准公式
}

5、PID 控制(增量式)

c 复制代码
int err, err_last, err_sum;
#define KP 12
#define KI 2
#define KD 5

void PID_Control(uint cur_temp) {
    int out;

    err = TEMP_TARGET - cur_temp;
    err_sum += err;

    if (err_sum > 200) err_sum = 200;
    if (err_sum < -200) err_sum = -200;

    out = KP * err
        + KI * err_sum
        + KD * (err - err_last);

    err_last = err;

    if (out > 95) out = 95;
    if (out < 0) out = 0;

    pwm_duty = out;
}

6、主循环

c 复制代码
void main(void) {
    uint temp;

    Timer0Init();

    while (1) {
        temp = Get_Temp();

        if (temp < 600) {
            PID_Control(temp);
            LED_PIN = 1;
        } else {
            pwm_duty = 0;   // 超温保护
            LED_PIN = 0;
        }

        if (KEY_PIN == 0) {
            pwm_duty = 0;   // 睡眠
            LED_PIN = 0;
        }

        if (SHAKE_PIN == 0) {
            LED_PIN = 1;    // 唤醒
        }

        for (uint i = 0; i < 30000; i++);
    }
}

参考代码 STC15F104E编写的白光烙铁T12控制器 www.youwenfan.com/contentcsu/70216.html

五、调试与校准

校准步骤

  1. 烙铁加热到 300℃
  2. 用万用表测 ADC 值
  3. 调整公式:
c 复制代码
temp = adc * K - B;

六、常见问题解决

问题 原因 解决
温度跳动大 放大倍数不稳 加 RC 滤波
不上温 MOSFET 未导通 检查栅极驱动
一直满功率 PID 参数过大 减小 KP
休眠失效 振动开关误触 软件消抖
相关推荐
雨田言炎38 分钟前
STM32之RCC系统时钟控制(芯片的心脏控制器)
stm32·单片机·嵌入式硬件
李永奉40 分钟前
日常使用的锂电池上,新、旧锂电池的差异分析
单片机·嵌入式硬件·物联网·智能手机·电脑
额额额对了1 小时前
IMX6ULL 杂项设备 LED 驱动
stm32·单片机·嵌入式硬件
半杯咖啡半行码3 小时前
STM32开发之IIC通信详解:从协议基础到FM24CL04实战
stm32·单片机·嵌入式硬件
硅基手札4 小时前
【I2C 技术系列 05】I2C 多主仲裁与时钟同步
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
Zw-awa4 小时前
DO 和 AO 到底怎么选:比较器替你决定了什么
stm32
硅基手札4 小时前
【I2C 技术系列 01】I2C 电气特性与物理层
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
comyccccc4 小时前
TB6612电机驱动板原理图与PCB设计学习笔记
单片机·嵌入式硬件
gscsded5 小时前
MCUboot裸机移植实战
单片机·嵌入式硬件·arm
北京盛世宏博6 小时前
多协议以太网温湿度变送器:Modbus TCP/UDP/SNMP 协议应用场景详解
单片机·tcp/ip·udp·传感器·温湿度