基于 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
休眠失效 振动开关误触 软件消抖
相关推荐
嵌入式ZYXC32 分钟前
第1篇:《面试题:画一个STM32最小系统电路,每个元件的作用》
stm32·单片机·嵌入式硬件·面试·职场和发展
振南的单片机世界1 小时前
printf重定向:一句fputc,串口打印任意变量
stm32·单片机·嵌入式硬件
eng八戒2 小时前
【RA-Eco-RA2L1开发板评测】基于 FSP 实现串口打印功能
单片机·嵌入式硬件
嵌入式ZYXC2 小时前
第2篇:《面试题:LDO和DC-DC的区别?分别用在什么场景?》
stm32·单片机·嵌入式硬件·面试·职场和发展
HAPPY酷3 小时前
单片机OLED进阶:打造赛博朋克风“碎片化消散”文字特效
单片机·嵌入式硬件·microsoft
czhaii3 小时前
GB2312简体中文编码表
单片机·算法
玩转单片机与嵌入式3 小时前
AI 推理会不会堵住实时任务?MCU 上跑模型时,RTOS 和 DMA 该怎么配合?
人工智能·单片机·嵌入式硬件
清风6666663 小时前
基于单片机的超声波人体感应PWM自动调光灯设计与实现
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
fffzd3 小时前
STM32:IIC与温湿度传感器(轮询模式)
stm32·单片机·嵌入式硬件·iic·通信·嵌入式软件·i2c
项目題供诗3 小时前
STM32-编码器接口测速(十七)
stm32·单片机·嵌入式硬件