基于 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
休眠失效 振动开关误触 软件消抖
相关推荐
yuan199971 小时前
基于 STM32 的工程级扫地机器人方案
stm32·嵌入式硬件·机器人
qq_411262422 小时前
wifi自适应
stm32·单片机·嵌入式硬件
洋九八3 小时前
STM32 (NVIC)中断
stm32·单片机·嵌入式硬件
12.=0.3 小时前
【stm32_9.2】FreeRTOS的任务管理:任务策略,调度器启用,任务创建、删除、挂起、恢复
c语言·stm32·单片机·嵌入式硬件
国产电子元器件3 小时前
ACS712国产替代推荐:电流检测芯片选型指南
单片机·嵌入式硬件·物联网
徐怀江3 小时前
ModusToolbox for vscode使用小记
ide·vscode·单片机·mcu·infineon
洋九八5 小时前
STM32 串口(USART)配置
stm32·单片机·嵌入式硬件
华科大胡子5 小时前
单片机IO不够?ULN2003A救急方案
单片机
时空自由民.5 小时前
MCU 串口 printf 耗时优化方案
单片机·嵌入式硬件