基于 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 / GND5V 供电

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

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

temp = adc * 0.48 - 50;

实际一定要 实物校准


三、核心控制逻辑

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


四、示例代码

1、头文件与宏定义

#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)

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 读取温度

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、温度转换

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

5、PID 控制(增量式)

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、主循环

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. 调整公式:
temp = adc * K - B;

六、常见问题解决

问题原因解决
温度跳动大放大倍数不稳加 RC 滤波
不上温MOSFET 未导通检查栅极驱动
一直满功率PID 参数过大减小 KP
休眠失效振动开关误触软件消抖
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值