数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 700|回复: 47

[工仪] 白光电烙铁添加姿态手感控制、彻底杜绝滚珠开关引起的加热偷停的现象

[复制链接]
发表于 2026-5-6 11:49:58 | 显示全部楼层 |阅读模式
本帖最后由 慕名而来 于 2026-5-6 11:49 编辑


       用了四十多年20w内热电烙铁,去年秋天终于入手了这个亚克力手柄的白光电烙铁,用了几次感觉真的挺好用,拿起来很快可以干活,撂下就待机、待机久了还会休眠,用好久也不烧烙铁头,体验感觉真的不错。转眼之间白光烙铁用了快半年了,最近焊板子用的多了发现一个小毛病,就是拿着干活时活动幅度小的时候它会偷停、经常掉温度,连续焊东西多的时候要时常的摇晃一下才好,我第一次用这东西也不知道别人是否有遇到这个问题。

       我对白光烙铁的工作原理一窍不通,经过检查发现是一个滚珠开关的问题,烙铁想要保证持续的工作状态就要求这个开关中的滚珠实时的移动,也就是手拿着烙铁不能静止太长时间。既然这个电烙铁需要感知拿去和放下的状态,那么电容感应触摸开关做传感器就是最佳选择了,而最近我恰好就在玩STC单片机的触摸功能,说做就做,弄模块、编程序一顿操作猛如虎,简简单单的就实现了白光电烙铁手柄姿态的手感控制。


       原理很简单,当单片机确认了烙铁被触摸(拿起)后就通过一个引脚不断输出上跳脉冲去触发电烙铁的主控使其控制加热,需要说明的是经过实测我的电烙铁是需要上跳脉冲触发的,其他烙铁我没接触过需要实测确定,触摸感应头我用的是铜箔胶带、也可以用两面胶粘贴薄的金属片来实现,最后的关键点是测量触摸数据时需要把整机粗略的装配拢成一体,否则如果单独调试好了的小板子总装后或许因单片机附件环境电容的变化引起数据漂移、失控。


以下是STC8H1K08T单片机的执行程序:
声明!共享程序仅供坛友交流、参考,每次使用需要在实际系统中调试、适配,不能作为固件使用,如有疑问请跟帖讨论、我当知无不言言无不尽,如有疏漏也请告知避免误导他人。


主程序:


  1. //本程序用于调试STC8H1K08T单片机触摸按键功能
  2. //程序原创:wannenggong
  3. //程序由豆包AI进行了规范整理
  4. //烧录程序时设置时钟频率为:22.1184MHz
  5. //----------------------------------------------
  6. #include <STC8H.h>
  7. #include "delay.h"
  8. #include "STC8_uart.h"

  9. //触摸阈值配置,以下数值根据实测值设定,阈值设定应留足余量!!
  10. //本系统实测值:无触摸时大于1500(最大值不超过1550),有触摸小于1300
  11. #define TK_H            1600   // 此值为无触摸值
  12. #define TK_PICKUP       250    // 拿起阈值(由触摸后的值换算而来、本系统最小真实值大于300)
  13. #define TK_PUTDOWN      150    // 放下阈值(本系统最大真实值小于70)

  14. sbit TRIG_IO = P1^6;  // 加热控制输出

  15. u32  sum = 0;
  16. u16  TK_data;
  17. u16  TK_d;
  18. bit  Read_end;
  19. u16  time_n;
  20. bit  work_flag = 0;   // 工作标志:0=休眠 1=加热工作

  21. //----触摸初始化-------------------------
  22. void key_init(void)
  23. {
  24.     TSRT = 0x00;
  25.     TSCHEN1 |= 0x02;    // TK1-P1.1
  26.     TSCFG1  = (7<<4) | 7;
  27.     TSCFG2  = 2;
  28.     TSCTRL  = 0x00;
  29.     TK_ON();
  30. }

  31. //----定时器0初始化 1ms@22.1184MHz------------
  32. void Timer0_Init(void)
  33. {
  34.     AUXR |= 0x80;    // 1T模式
  35.     TMOD &= 0xF0;
  36.     TL0  = 0x9A;
  37.     TH0  = 0xA9;
  38.     TF0  = 0;
  39.     ET0  = 1;        // 允许中断
  40.     TR0  = 0;        // 默认关闭
  41. }

  42. //----定时器中断-------------------------------
  43. void Timer0_Isr(void) interrupt 1
  44. {   
  45.     time_n++;

  46.     // 400ms 周期输出 1ms 高电平脉冲
  47.     TRIG_IO = 1;      //高电平触发烙铁加热

  48.     if(time_n == 1)
  49.     {
  50.         TRIG_IO = 0;  //1ms后转低电平等待下个周期再次发送高电平
  51.     }

  52.     if(time_n >= 400) //一个周期结束、计数清零
  53.     {
  54.         time_n = 0;
  55.     }
  56. }

  57. //----触摸按键读取--------------------------------
  58. void Read_Touch(void)
  59. {
  60.     u16 i,j;

  61.     for(j=0;j<20;j++)
  62.     {
  63.         TSCTRL = (1<<7)|(1<<6)|1;
  64.         Read_end = 0;

  65.         for(i=0;i<50;i++)
  66.         {
  67.             if(Read_end) break;
  68.             delay_ms(1);
  69.         }

  70.         if(Read_end) sum += TK_data;
  71.     }

  72.     sum = sum / 20;
  73.     TK_d = (u16)sum;      //键值原值
  74.     TK_d = TK_H - TK_d;   //工作时调用差值、调试时封闭此句代码显示键值原值
  75. }
  76. //----触摸控制主逻辑-----------------------------
  77. void Touch_Control(void)
  78. {
  79.     Read_Touch();

  80.     // 烙铁拿起 → 间隔400ms发送一个脉宽1ms的上跳脉冲、使主控时时响应中断进入连续工作模式
  81.     if(TK_d > TK_PICKUP && work_flag == 0) //work_flag初始为0、是两个状态互锁的标志
  82.     {
  83.         work_flag = 1;
  84.         TR0 = 1;        // 启动定时器、由定时器控制间隔400ms输出一个上跳脉冲
  85.         time_n = 0;
  86.         //SendUInt16(TK_d);
  87.     }

  88.     // 烙铁放下 → 控制端恒为低电平进入休眠模式
  89.     else if(TK_d < TK_PUTDOWN && work_flag == 1)
  90.     {
  91.         work_flag = 0;
  92.         TR0 = 0;        // 关闭定时器
  93.         TRIG_IO = 0;    // 端口输出低电平使烙铁进入休眠状态
  94.         time_n = 0;
  95.         //SendUInt16(TK_d);
  96.     }
  97. }

  98. //----触摸中断------------------------------
  99. void TK_ISR(void) interrupt 35
  100. {
  101.     u8 sta = TSSTA2;

  102.     if(sta & 0x40)
  103.         TSSTA2 |= 0x40;
  104.     if(sta & 0x80)
  105.     {
  106.         TSSTA2 |= 0x80;
  107.         sta &= 0x0F;

  108.         if(sta == 1) //TK1/P1.1
  109.         {
  110.             Read_end = 1;
  111.             TK_data = TSDAT / 8; //缩小数据便于比对
  112.         }
  113.     }
  114. }

  115. //==================== 主函数 ====================
  116. void main(void)
  117. {
  118.     EAXSFR();
  119.     GPIO_set();
  120.     key_init();
  121.     //UartInit();
  122.     Timer0_Init();
  123.     EA = 1;

  124.     TRIG_IO = 0;  // 初始为0
  125.     delay_ms(100);

  126.     while(1)
  127.     {
  128.         Touch_Control();
  129.         //Read_Touch();//调试用  
  130.         delay_ms(100);
  131.     }
  132. }
复制代码




串口.c程序:


  1. #include "STC8_uart.h"

  2. #define  MAIN_Fosc  22118400L   //定义主时钟(烧录程序时设定)
  3. #define Baudrate      115200L
  4. #define TM            (65536 -(MAIN_Fosc/Baudrate/4))
  5. #define Timer0_Reload   (65536UL -(MAIN_Fosc / 1000))//Timer 0中断频率,1000次/秒

  6. //-----------------------------

  7. void UartInit()
  8. {
  9.   SCON = (SCON & 0x3f) | 0x40;
  10.   AUXR |= 0x40;                //定时器时钟1T模式
  11.   AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
  12.   TL1  = TM;
  13.   TH1  = TM >> 8;
  14.   TR1 = 1;                                //定时器1开始计时
  15. }
  16. //-----------------------------
  17. //使用函数printf()时必须保留下述两个函数
  18. void UartPutc(unsigned char dat)
  19. {
  20.   SBUF = dat;
  21.   while(TI == 0);
  22.   TI = 0;
  23. }
  24. //-----------------------------
  25. char putchar(char c)
  26. {
  27.   UartPutc(c);
  28.   return c;
  29. }
  30. //----发送字符串函数-----------
  31. void SendString(char *str)
  32. {
  33.     while (*str)         // 遍历字符串直到结束符
  34.     {
  35.         UartPutc(*str++); // 发送当前字符并指向下一个
  36.     }
  37. }

  38. //----数字转字符串函数--------
  39. //16位无符号整数 → 字符串
  40. void UartNumToString(unsigned int num, char *str)
  41. {
  42.     char temp[10];
  43.     int i = 0, j = 0;
  44.    
  45.     if(num == 0)  // 处理数字0
  46.     {
  47.         str[j++] = '0';
  48.         str[j] = '\0';
  49.         return;
  50.     }
  51.    
  52.     // 逆序取数字
  53.     while(num > 0)
  54.     {
  55.         temp[i++] = num % 10 + '0';
  56.         num = num / 10;
  57.     }
  58.    
  59.     // 反转得到正确顺序
  60.     while(i > 0)
  61.     {
  62.         str[j++] = temp[--i];
  63.     }
  64.     str[j] = '\0';  // 字符串结束符
  65. }

  66. //----串口打印16位无符号整数变量-------------
  67. void SendUInt16(unsigned int dat)
  68. {
  69.     char buf[10];  // 存储转换后的字符串
  70.     UartNumToString(dat, buf);
  71.     SendString(buf);
  72. }
复制代码




串口.h程序:


  1. #ifndef __STC_UART_H
  2. #define __STC_UART_H

  3. #include "STC8H.h"
  4. #include <stdio.h>

  5. //---------------------------------------------------------------------

  6. void UartInit();
  7. void UartPutc(unsigned char dat);
  8. char putchar(char c);
  9. void SendString(char *str);
  10. void UartNumToString(unsigned int num, char *str);
  11. void SendUInt16(unsigned int dat);


  12. #endif
复制代码




实物图片:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 3家元 +90 收起 理由
海上生明月丶 + 30 謝謝分享
jf201006 + 30 謝謝分享
家睦 + 30

查看全部打赏

发表于 2026-5-6 11:53:16 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2026-5-6 12:32:26 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2026-5-6 14:48:40 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2026-5-6 18:39:17 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2026-5-6 20:01:55 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

 楼主| 发表于 2026-5-6 20:53:08 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

 楼主| 发表于 2026-5-6 20:59:02 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2026-5-6 21:01:13 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

 楼主| 发表于 2026-5-6 21:05:52 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

 楼主| 发表于 2026-5-6 21:46:20 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2026-5-6 21:56:04 | 显示全部楼层
游客请登录后查看回复内容

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2026-5-6 22:12:04 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2026-5-6 22:34:25 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2026-5-6 22:36:53 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2026-5-7 08:47:11 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2026-5-7 09:08:16 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2026-5-7 09:44:36 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2026-5-7 09:58:47 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2026-5-7 10:47:24 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|数码之家-技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2026-7-1 05:23 , Processed in 0.124801 second(s), 9 queries , Gzip On, Redis On.

Powered by Discuz!

© MyDigit.Net Since 2006

快速回复 返回顶部 返回列表