基于 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
休眠失效 振动开关误触 软件消抖
相关推荐
芯片设计-曾工7 小时前
当精准脉冲遇上清晰视界——CH2205E模块与YL1621的“黄金搭档“
驱动开发·stm32·单片机·51单片机·硬件工程
LCG元13 小时前
STM32 硬件 SPI + DMA 驱动 OLED 显示屏(SSD1306):从原理到 112fps 高速刷新全流程
stm32·单片机·嵌入式硬件
天吾cc13 小时前
RTT-ADC
单片机·嵌入式硬件·学习
qq_4480111614 小时前
C语言中的野指针和空指针
c语言·开发语言·单片机
210Brian14 小时前
STM32学习笔记(五)EXTI外部中断(上)
笔记·stm32·学习
崇山峻岭之间15 小时前
STM32F407的FOC驱动01
stm32·单片机·嵌入式硬件
Lzh编程小栈20 小时前
【嵌入式硬核精讲】I2C通信协议万字详解(时序帧格式、同步半双工、重复起始、一对多挂载、寄存器、面试必考)
stm32·单片机·嵌入式硬件·面试
十月的皮皮20 小时前
STM32从零到量产开发:四路继电器工业控制模块开发 -上位机 Program.cs 应用程序入口设计说明
c语言·stm32·单片机·stm32cubemx·hal库
LCG元20 小时前
STM32F103+MPU6050互补滤波姿态解算与OLED实时显示实战(附完整工程代码)
stm32·单片机·嵌入式硬件
求知喻20 小时前
FM33L023D外部中断
单片机·嵌入式硬件