找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17862|回复: 54
打印 上一主题 下一主题
收起左侧

也做3000F超级电容点焊机(已补充PCB和程序)

  [复制链接]
跳转到指定楼层
楼主
本帖最后由 zuse1021 于 2020-5-21 21:09 编辑

之前做过一个微波炉变压器版的点焊机,总感觉能力不够,在看到隔壁论坛的开源的超级电容点焊机后,打算仿一个。
原版本两个超级电容用均衡版充电,MOS利用升压电路。感觉比较麻烦,于是打算两个恒流模块加上两个独立的220转5V的电源,做成平衡充给电容充电。然后MOS的升压也直接用成品的升压模块,更方便。
手头正好有一些STC的8A8K64S4A12的直插40针的单片机,就利用起来了。既然用了这个单片机,顺便就加上了测电容电压的功能。
下面介绍一下PCB:

考虑到5块包邮的嘉立创,PCB的长度被设定为10cm,右上方是0.36寸四位共阳数码管,三极管是四个9012,四个按键,其它元件在PCB上都标注了。
BOOST MODULE是升压模块,初步打算用这个模块:

输出控制在16v~18v左右,PCB也是按这个模块的尺寸来画的。然而买回来一个却无法升压,大概是坏了,因为只买了1个,所以也不知道这个模块是不是能用上,另一家买的另一种升压模块倒是可以升压,但尺寸不对应哈哈。
四个按键用于控制脉冲长度、脉冲间隔和脉冲次数的设定,同时可以利用EEPROM储存,断电保存上一次的设置,还用于显示电容电压。
下面介绍按键的作用:
key1--进入菜单1--脉冲长度调节--显示脉冲长度
key1-- +1
key2-- -1
key3-- 恢复预设值
key4-- back to main

key2--进入菜单2--脉冲间隔调节--显示脉冲间隔
key1-- +1
key2-- -1
key3-- 恢复预设值
key4-- back to main

key3--进入菜单3--脉冲次数调节--显示脉冲次数
key1-- +1
key2-- -1
key3-- 恢复预设值
key4-- back to main

key4--进入菜单4--电容电压显示--显示总电压
key1-- 显示第一节电容电压
key2-- 显示第二节电容电压
key3-- 保持当前配置于EEPROM
key4-- back to main

MOS板初步打算16个irf3713并联,也可以某宝入一个成品的点焊MOS板。
实际上,只测试了电路和程序没问题,还没有实际装起来。程序和PCB文件待补充,下面是两张焊了一部分的照片。


3L补充了PCB和程序,有兴趣的可以下载大致分了两个部分,一部分是main.c,是主程序,另一部分是ADCread.c,用于测电压。下面把main.c贴上。
  1. #include <STC8.H>
  2. #include <stdio.h>
  3. #include <Intrins.h>
  4. #include <adcread.h>
  5. #define WT_12M          0x83

  6. typedef unsigned int u16;                                                                //对数据类型进行声明定义
  7. typedef unsigned char u8;                                                                //对数据类型进行声明定义

  8. sbit key1=P0^0;        //P0.0端口定义为时间减
  9. sbit key2=P0^1;        //P0.1端口定义为时间加
  10. sbit key3=P0^2;        //P0.2端口定义为按下显示第一节电容电压
  11. sbit key4=P0^3;        //P0.3端口定义为按下显示第二节电容电压
  12. sbit out=P4^1;                   //P4.1端口定义为驱动脉冲输出
  13. sbit tst=P5^5;       //P5.5端口定义为检测点焊笔准备焊接的输入端

  14. sbit DIG1=P2^0;         //P2.0端口定义为DIG1
  15. sbit DIG2=P2^1;         //P2.1端口定义为DIG2
  16. sbit DIG3=P2^2;         //P2.2端口定义为DIG3
  17. sbit DIG4=P2^3;         //P2.3端口定义为DIG4
  18. u16 pulse;                                                  //输出脉冲长度,×0.1毫秒
  19. u16 interval;                                                //脉冲间隔,×0.1毫秒
  20. u8  num;                                                                //脉冲次数
  21. u16 v1;                                                                        //第一电容电压
  22. u16 v2;                                                                        //第二电容电压
  23. u16 vcc;                                                                //总电压               
  24. u8  Page_Sgin;                                        //页面选择
  25. u8 zz;

  26. //数码管真值表//
  27. u8 code LED_CODE[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示0~9,
  28. u8 code LED_S[2]={0x9f,0xaf}; //显示上折角,下折角

  29. //延时100us//
  30. void Delay(long t)                //STC8Axx基于STC-Y6指令集@12.000MHz,from:STC-ISP;
  31. {
  32.         u8 ia, ja;
  33.         long ka;
  34.         for(ka=t;ka>0;ka--)
  35.         {
  36.         _nop_();
  37.         ia = 2;
  38.         ja = 140;
  39.         do
  40.         {
  41.                 while (--ja);
  42.         } while (--ia);
  43.         }
  44. }

  45. //检测点焊笔准备//
  46. bit stst(void)
  47. {
  48.         static unsigned  int l = 0;                        //定义静态变量,用来记录延时用.                  
  49.         if(tst == 0)                                                                                //如果检测到按键引脚有低电平,记数变量开始累加.
  50.         {
  51.                 if(l <7000)                                                                                //控制延时计数返0,因为当按键不松开时,i一直在累加
  52.                         l++;                                                                                                //CPU每检测到一次按键引脚为低电平0,i就累加1次.
  53.         }
  54.         else                                                                                                                //如果按键没有按下或者按下后有高电平(抖动)i清0
  55.                 l = 0;
  56.         if(l == 6999)                                                                                //如果变量i的值累加到6999,说明点焊笔已经做好准备,可以焊接了.
  57.                 return 1;                                                                                        //返回1,说明已检测到按键有效值.
  58.         else
  59.                 return 0;                                                                                        //返回0,说明没有检测到有效值.
  60. }

  61. void IapIdle()                                                                               
  62. {
  63.     IAP_CONTR = 0;                              //关闭IAP功能
  64.     IAP_CMD = 0;                                //清除命令寄存器
  65.     IAP_TRIG = 0;                               //清除触发寄存器
  66.     IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
  67.     IAP_ADDRL = 0;
  68. }

  69. char IapRead(int addr)                                        //EEPROM读一字节
  70. {
  71.     char dat;
  72.     IAP_CONTR = WT_12M;                         //使能IAP
  73.     IAP_CMD = 1;                                //设置IAP读命令
  74.     IAP_ADDRL = addr;                           //设置IAP低地址
  75.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  76.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  77.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  78.     _nop_();
  79.     dat = IAP_DATA;                             //读IAP数据
  80.     IapIdle();                                  //关闭IAP功能
  81.     return dat;
  82. }

  83. void IapProgram(int addr, char dat)                                        //EEPROM写一字节
  84. {
  85.     IAP_CONTR = WT_12M;                         //使能IAP
  86.     IAP_CMD = 2;                                //设置IAP写命令
  87.     IAP_ADDRL = addr;                           //设置IAP低地址
  88.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  89.     IAP_DATA = dat;                             //写IAP数据
  90.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  91.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  92.     _nop_();
  93.     IapIdle();                                  //关闭IAP功能
  94. }

  95. void IapErase(int addr)                                                //EEPROM擦除一扇区=512字节
  96. {
  97.     IAP_CONTR = WT_12M;                         //使能IAP
  98.     IAP_CMD = 3;                                //设置IAP擦除命令
  99.     IAP_ADDRL = addr;                           //设置IAP低地址
  100.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  101.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  102.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  103.     _nop_();                                    //
  104.     IapIdle();                                  //关闭IAP功能
  105. }

  106. /********************************
  107.                 数码管动态显示程序
  108. ********************************/
  109. void display(u8 wei)
  110. {
  111.                 u8 ke;  
  112.                 u8 dd=0;
  113.                 switch(wei)
  114.                 {
  115.                         case 1://显示脉冲长度
  116.                                         for(dd=0;dd<3;dd++)
  117.                                         {
  118.                                                 if(dd == 0)                                //显示个位
  119.                                                 {
  120.                                                                 P2=0xf7;//个位段码开
  121.                 P3=LED_CODE[pulse%10];
  122.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  123.                                                                 P2=0xff;//段码关
  124.                                                                 P3=0xff;//位码消隐
  125.                                                 }
  126.                                                 if(dd == 1&& pulse/10%10!=0)                                //显示十位
  127.                                                 {
  128.                                                                 P2=0xfb;//十位段码开
  129.                 P3=LED_CODE[pulse/10%10];
  130.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  131.                                                                 P2=0xff;//段码关
  132.                                                                 P3=0xff;//位码消隐
  133.                                                 }
  134.                                                 if(dd == 2 && pulse/100%10!=0)                                //显示百位
  135.                                                 {
  136.                                                                 P2=0xfd;//百位段码开
  137.                 P3=LED_CODE[pulse/100%10];
  138.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  139.                                                                 P2=0xff;//段码关
  140.                                                                 P3=0xff;//位码消隐
  141.                                                 }
  142.                                         }                                       
  143.                                         break;       
  144.                         case 2:        //显示脉冲间隔
  145.                                         for(dd=0;dd<3;dd++)
  146.                                         {
  147.                                                 if(dd == 0)                                //显示个位
  148.                                                 {
  149.                                                                 P2=0xf7;//个位段码开
  150.                 P3=LED_CODE[interval%10];
  151.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  152.                                                                 P2=0xff;//段码关
  153.                                                                 P3=0xff;//位码消隐
  154.                                                 }
  155.                                                 if(dd == 1&& interval/10%10!=0)                                //显示十位
  156.                                                 {
  157.                                                                 P2=0xfb;//十位段码开
  158.                 P3=LED_CODE[interval/10%10];
  159.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  160.                                                                 P2=0xff;//段码关
  161.                                                                 P3=0xff;//位码消隐
  162.                                                 }
  163.                                                 if(dd == 2 && interval/100%10!=0)                                //显示百位
  164.                                                 {
  165.                                                                 P2=0xfd;//百位段码开
  166.                 P3=LED_CODE[interval/100%10];
  167.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  168.                                                                 P2=0xff;//段码关
  169.                                                                 P3=0xff;//位码消隐
  170.                                                 }
  171.                                         }
  172.                                         break;       
  173.                         case 3:        //显示脉冲次数
  174.                                         for(dd=0;dd<2;dd++)
  175.                                         {
  176.                                                 if(dd == 0)                                //显示个位
  177.                                                 {
  178.                                                                 P2=0xf7;//个位段码开
  179.                 P3=LED_CODE[num%10];
  180.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  181.                                                                 P2=0xff;//段码关
  182.                                                                 P3=0xff;//位码消隐
  183.                                                 }
  184.                                                 if(dd == 1&& num/10!=0)                                //显示十位
  185.                                                 {
  186.                                                                 P2=0xfb;//十位段码开
  187.                 P3=LED_CODE[num/10%10];
  188.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  189.                                                                 P2=0xff;//段码关
  190.                                                                 P3=0xff;//位码消隐
  191.                                                 }
  192.                                         }
  193.                                         break;       
  194.                         case 4:                //显示总电压
  195.                                         for(dd=0;dd<4;dd++)
  196.                                         {
  197.                                                 if(dd == 0)                                //显示个位
  198.                                                 {
  199.                                                                 P2=0xf7;//个位段码开
  200.                 P3=LED_CODE[vcc%10];
  201.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  202.                                                                 P2=0xff;//段码关
  203.                                                                 P3=0xff;//位码消隐
  204.                                                 }
  205.                                                 if(dd == 1)                                //显示十位
  206.                                                 {
  207.                                                                 P2=0xfb;//十位段码开
  208.                 P3=LED_CODE[vcc/10%10];
  209.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  210.                                                                 P2=0xff;//段码关
  211.                                                                 P3=0xff;//位码消隐
  212.                                                 }
  213.                                                 if(dd == 2)                                //显示百位
  214.                                                 {
  215.                                                                 P2=0xfd;//百位段码开
  216.                 P3=LED_CODE[vcc/100%10];
  217.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  218.                                                                 P2=0xff;//段码关
  219.                                                                 P3=0xff;//位码消隐
  220.                                                 }
  221.                                                 if(dd  == 3)                                //显示千位
  222.                                                 {
  223.                                                                 P2=0xfe;//千位段码开
  224.                 P3=LED_CODE[vcc/1000]&0x7f;
  225.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  226.                                                                 P2=0xff;//段码关
  227.                                                                 P3=0xff;//位码消隐
  228.                                                 }       
  229.                                         }
  230.                                         break;       
  231.                         case 5:                //显示第一节电容电压
  232.                                         for(dd=0;dd<4;dd++)
  233.                                         {
  234.                                                 if(dd == 0)                                //显示个位
  235.                                                 {
  236.                                                                 P2=0xf7;//个位段码开
  237.                 P3=LED_CODE[v1/10%10];                //个位显示电压小数点后第二位
  238.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  239.                                                                 P2=0xff;//段码关
  240.                                                                 P3=0xff;//位码消隐
  241.                                                 }
  242.                                                 if(dd == 1)                                //显示十位
  243.                                                 {
  244.                                                                 P2=0xfb;//十位段码开
  245.                 P3=LED_CODE[v1/100%10];        //十位显示电压小数点后第一位
  246.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  247.                                                                 P2=0xff;//段码关
  248.                                                                 P3=0xff;//位码消隐
  249.                                                 }
  250.                                                 if(dd == 2)                                //显示百位
  251.                                                 {
  252.                                                                 P2=0xfd;//百位段码开
  253.                 P3=LED_CODE[v1/1000]&0x7f;        //百位显示电压小数点前一位+小数点
  254.                                                                 for(ke = 0;ke <100;ke++);                //延时一段时间
  255.                                                                 P2=0xff;//段码关
  256.                                                                 P3=0xff;//位码消隐
  257.                                                 }
  258.                                                 if(dd  == 3)                                //显示千位
  259.                                                 {
  260.                                                                 P2=0xfe;//千位段码开
  261.                 P3=LED_S[0];                                                        //千位显示第一节电容符号
  262.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  263.                                                                 P2=0xff;//段码关
  264.                                                                 P3=0xff;//位码消隐
  265.                                                 }       
  266.                                         }
  267.                                         break;
  268.                         case 6:                //显示第二节电容电压
  269.                                         for(dd=0;dd<4;dd++)
  270.                                         {
  271.                                                 if(dd == 0)                                //显示个位
  272.                                                 {
  273.                                                                 P2=0xf7;//个位段码开
  274.                 P3=LED_CODE[v2/10%10];                //个位显示电压小数点后第二位
  275.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  276.                                                                 P2=0xff;//段码关
  277.                                                                 P3=0xff;//位码消隐
  278.                                                 }
  279.                                                 if(dd == 1)                                //显示十位
  280.                                                 {
  281.                                                                 P2=0xfb;//十位段码开
  282.                 P3=LED_CODE[v2/100%10];        //十位显示电压小数点后第一位
  283.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  284.                                                                 P2=0xff;//段码关
  285.                                                                 P3=0xff;//位码消隐
  286.                                                 }
  287.                                                 if(dd == 2)                                //显示百位
  288.                                                 {
  289.                                                                 P2=0xfd;//百位段码开
  290.                 P3=LED_CODE[v2/1000]&0x7f;        //百位显示电压小数点前一位+小数点
  291.                                                                 for(ke = 0;ke <100;ke++);                //延时一段时间
  292.                                                                 P2=0xff;//段码关
  293.                                                                 P3=0xff;//位码消隐
  294.                                                 }
  295.                                                 if(dd  == 3)                                //显示千位
  296.                                                 {
  297.                                                                 P2=0xfe;//千位段码开
  298.                 P3=LED_S[1];                                                        //千位显示第二节电容符号
  299.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  300.                                                                 P2=0xff;//段码关
  301.                                                                 P3=0xff;//位码消隐
  302.                                                 }       
  303.                                         }
  304.                                         break;       
  305.                         case 7://显示主菜单
  306.                                         for(dd=0;dd<4;dd++)
  307.                                         {
  308.                                                 if(dd == 0)                                //显示个位
  309.                                                 {
  310.                                                                 P2=0xf7;//个位段码开
  311.                 P3=LED_S[0];
  312.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  313.                                                                 P2=0xff;//段码关
  314.                                                                 P3=0xff;//位码消隐
  315.                                                 }
  316.                                                 if(dd == 1)                                //显示十位
  317.                                                 {
  318.                                                                 P2=0xfb;//十位段码开
  319.                 P3=LED_S[1];
  320.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  321.                                                                 P2=0xff;//段码关
  322.                                                                 P3=0xff;//位码消隐
  323.                                                 }
  324.                                                 if(dd == 2)                                //显示百位
  325.                                                 {
  326.                                                                 P2=0xfd;//百位段码开
  327.                 P3=LED_S[0];
  328.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  329.                                                                 P2=0xff;//段码关
  330.                                                                 P3=0xff;//位码消隐
  331.                                                 }
  332.                                                 if(dd == 3)                                //显示千位
  333.                                                 {
  334.                                                                 P2=0xfe;//千位段码开
  335.                 P3=LED_S[1];
  336.                                                                 for(ke = 0;ke <100;ke++);        //延时一段时间
  337.                                                                 P2=0xff;//段码关
  338.                                                                 P3=0xff;//位码消隐
  339.                                                 }
  340.                                         }                       
  341.                         default:
  342.                                         break;
  343.                 }
  344. }

  345. //按键处理函数
  346. //返回按键值1~4
  347. //mode:0,不支持连续按;1,支持连续按;
  348. //0,没有任何按键按下

  349. u8 KEY_Scan(u8 mode)
  350. {         
  351.                                 static u8 key_up=1;//按键标志
  352.         if(mode) key_up=1;  //支持连按      
  353.                                 //检测按键是否按下      
  354.         if(key_up&&(key1==0||key2==0||key3==0||key4==0))
  355.         {
  356.                 Delay(100);//去抖动
  357.                 if(key_up&&(key1==0||key2==0||key3==0||key4==0))
  358.                 {
  359.                                key_up=0;
  360.                                 if     (key1     == 0)           return 1;
  361.                                 else if(key2     == 0)           return 2;
  362.                                 else if(key3     == 0)           return 3;
  363.                                 else if(key4     == 0)           return 4;
  364.                                                                                                                          
  365.                 }
  366.         }
  367.         //检测按键是否松开
  368.         else if(key1==1 && key2==1 && key3==1 && key4==1)        key_up=1;      
  369.                                 return 0;//无按键按下
  370. }

  371. void Main_Menu()
  372. {
  373.                                 u8 i;
  374.                                 u8 m5=stst();
  375.                                 if(m5 == 1)
  376.                                 {
  377.                                         for(i=0;i<num;i++)        //加入 for循环,表明for循环大括号中的程序循环执行num次
  378.                                           {
  379.                                                 out=0;                                        //将P4.1口赋值 0,对外输出低电平
  380.                                                 Delay(pulse);                //调用延时程序;更改延时数字可以更改延时长度;用于改变输出脉冲时间pulse×100us
  381.                                                 out=1;                                        //将P4.1口赋值 1,对外输出高电平
  382.                                                 Delay(interval);//等待间隔时间
  383.                                           }
  384.                                 }
  385.                                 display(7);                                        //显示主菜单CC
  386.                                 switch(KEY_Scan(0))      
  387.          {
  388.            case 1:                     //key1按下
  389.               Page_Sgin=1;             //页面选择置1,进入菜单1--脉冲长度调节
  390.                                                         break;
  391.            case 2:                     //key2按下
  392.               Page_Sgin=2;             //页面选择置2,进入菜单2--脉冲间隔调节
  393.                                                         break;
  394.            case 3:                     //key3按下
  395.               Page_Sgin=3;             //页面选择置3,进入菜单3--脉冲次数调节
  396.                                                         break;
  397.            case 4:                     //key4按下
  398.               Page_Sgin=4;             //页面选择置4,进入菜单4--电容电压显示
  399.                                                         break;
  400.            default:
  401.                                                         break;
  402.          }               
  403. }

  404. void Menu_1()                                                                        //菜单1--脉冲长度调节
  405. {

  406.                                 switch(KEY_Scan(0))      
  407.          {               
  408.            case 1:                                     //key1按下
  409.               if(pulse < 999)
  410.                                                                 pulse++;                                                                         //脉冲长度+1
  411.                                                         break;
  412.            case 2:                                     //key2按下
  413.               if(pulse > 1)
  414.                                                                 pulse--;                                                                         //脉冲长度-1
  415.                                                         break;
  416.                                          case 3:                               //key3按下
  417.                                                         pulse=20;                                     //脉冲长度恢复预置,2ms
  418.                                                         break;
  419.            case 4:                                     //key4按下
  420.               Page_Sgin=0;                             //back to 主菜单
  421.                                                         break;
  422.            default :
  423.            break;
  424.          }       
  425.                                 display(1);                                                                                                //显示菜单1-显示脉冲长度                       
  426. }

  427. void Menu_2()                                                                        //菜单2--脉冲间隔调节
  428. {
  429.                                 switch(KEY_Scan(0))      
  430.          {               
  431.            case 1:                                     //key1按下
  432.               if(interval < 999)
  433.                                                                 interval++;                                                                //脉冲长度+1
  434.                                                         break;
  435.            case 2:                                     //key2按下
  436.               if(interval > 1)
  437.                                                                 interval--;                                                                //脉冲长度-1
  438.                                                         break;
  439.                                          case 3:                               //key3按下
  440.                                                         interval=3;                             //脉冲长度恢复预置,300us
  441.                                                         break;
  442.            case 4:                                     //key4按下
  443.               Page_Sgin=0;                             //back to 主菜单
  444.                                                         break;
  445.            default :
  446.            break;
  447.          }       
  448.                                 display(2);                                                                                                //显示菜单2-显示间隔长度               
  449. }

  450. void Menu_3()                                                                        //菜单3--脉冲次数调节
  451. {
  452.                                 switch(KEY_Scan(0))      
  453.          {               
  454.            case 1:                                     //key1按下
  455.               if(num < 99)
  456.                                                                 num++;                                                                                //脉冲次数+1
  457.                                                         break;
  458.            case 2:                                     //key2按下
  459.               if(num > 1)
  460.                                                                 num--;                                                                                //脉冲次数-1
  461.                                                         break;
  462.                                          case 3:                               //key3按下
  463.                                                         num=3;                                                     //脉冲次数恢复预置,3次
  464.                                                         break;
  465.            case 4:                                     //key4按下
  466.               Page_Sgin=0;                             //back to 主菜单
  467.                                                         break;
  468.            default :
  469.            break;
  470.          }       
  471.                                 display(3);                                                                                                //显示菜单3-显示脉冲次数       
  472. }

  473. void Menu_4()                                                                        //菜单4--电容电压显示
  474. {
  475.                                 u16 ib,jb;                                                //定义延迟用临时变量
  476.                           v1=GetResult (7);                        //获取第一节电池电压
  477.                                 v2=vcc-v1;                              //计算得到第二节电池电压
  478.                                
  479.                                 switch(KEY_Scan(0))      
  480.          {               
  481.            case 1:                                     //key1按下
  482.                                                         for (ib = 5000; ib > 0; ib--) //外层循环1000次
  483.                                                                 {
  484.                                                                 for (jb = 124; jb > 0; jb--) ; //内层循环124次,延时一定长度用于显示第一节电容电压
  485.                                                                         {
  486.                                                                                 display(5);                                                //显示第一节电容电压
  487.                                                                         }
  488.                                                                 }

  489.                                                         break;
  490.            case 2:                                     //key2按下
  491.                                                         for (ib = 5000; ib > 0; ib--) //外层循环1000次
  492.                                                                 {
  493.                                                                 for (jb = 124; jb > 0; jb--) ; //内层循环124次,延时一定长度用于显示第二节电容电压
  494.                                                                         {
  495.                                                                                 display(6);                                                //显示第二节电容电压
  496.                                                                         }
  497.                                                                 }
  498.                                                         break;
  499.                                          case 3:                                                                       //key3按下,保持当前配置于EEPROM
  500.                                                         IapErase(0x0400);                                                                                        //擦除EEPROM
  501.                                                         IapProgram(0x0400, pulse>> 8);                                //写入pulse高8位
  502.                                                         IapProgram(0x0401, pulse & 0xff);                        //写入pulse低8位
  503.                                                         IapProgram(0x0402, interval>> 8);                        //写入interval高8位                                 
  504.                                                         IapProgram(0x0403, interval & 0xff);        //写入interval低8位
  505.                                                         IapProgram(0x0404, num);                                                        //写入num         
  506.                                                         break;
  507.            case 4:                                     //key4按下
  508.               Page_Sgin=0;                             //back to 主菜单
  509.                                                         break;
  510.            default :
  511.            break;
  512.          }       
  513.                                         display(4);                                                                                                //显示总电压=VCC               
  514. }

  515. void lnterface()  //人机界面
  516. {      
  517.         switch(Page_Sgin)      
  518.         {               
  519.                 case 0:
  520.                              Main_Menu(); break;
  521.                 case 1:
  522.                              Menu_1();                 break;
  523.                 case 2:
  524.                              Menu_2();                 break;
  525.                                                                 case 3:
  526.                              Menu_3();                 break;
  527.                 case 4:
  528.                              Menu_4();                break;                              
  529.                 default :                                                                         break;
  530.         }
  531. }

  532. void main()                                                                                                                //主函数//
  533. {      
  534.                         pulse = IapRead(0x0400);                                //pulse读EEPROM
  535.                         pulse <<= 8;                                                                                 //pulse恢复高位
  536.                         pulse |= IapRead(0x0401);                         //pulse或上低位
  537.                         interval = IapRead(0x0402);                        //interval读EEPROM
  538.                         interval <<= 8;                                                                 //interval恢复高位
  539.                         interval |= IapRead(0x0403);                 //interval或上低位       
  540.                         num=IapRead(0x0404);                                          //num=读EEPROM
  541.                         out=1;                                                                 //初始化输出端口
  542.                         tst= 1;                                                                //初始化焊笔检测端口
  543.                         Page_Sgin=0;                                        //初始化页面选择
  544.                         vcc=GetVCC();                                  //获取总电压
  545.                         while(1)
  546.                         {
  547.                                 lnterface();
  548.                         }
  549. }  
复制代码







评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏46 分享淘帖 顶7 踩
回复

使用道具 举报

沙发
ID:328014 发表于 2020-5-21 15:11 | 只看该作者
好东东  能分享下电路与代码吗?
回复

使用道具 举报

板凳
ID:29594 发表于 2020-5-21 19:30 | 只看该作者
SPOT WELDING.rar (34.37 KB, 下载次数: 340)
分享PCB与程序。

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:29594 发表于 2020-5-22 20:16 | 只看该作者

继续发mos板的图,16颗mos管用2×20的铜排连接,每颗mos管用两个m3螺丝固定在铜排上,中间的铜排是D极,两边围合的是S极,G极全部翘起来,准备后续弄个洞洞板连接起来。G极接到PCB控制板上的MOS-G,S极接电容负极,D极接点焊笔A,电容正极接点焊笔B,同时D极接到PCB控制板上的TST,这样当点焊笔A和B同时点在镍片上时,会自动延迟大约1秒,然后触发点焊输出。
回复

使用道具 举报

5#
ID:430492 发表于 2020-5-24 18:34 | 只看该作者
楼主有电路图分享不?
回复

使用道具 举报

6#
ID:29594 发表于 2020-5-25 08:58 | 只看该作者
cooleaf 发表于 2020-5-24 18:34
楼主有电路图分享不?


电路图么有,把PBC的反面也贴图上来,简单说明一下:
P3.0~P3.7接共阳数码管的A~DP,P2.0~P2.3通过1K电阻、9012和220R接数码管的DIG1~DIG4,P0.0~P0.3接4个按键,
P4.1接TLP250的1脚,P5.5接PC817的4脚。
测电压的部分参考STC8官方文档,利用P1.7的ADC7通道测电容第一节的电压,背面丝印的104电容,实际上可以焊在正面IC座里面。
其它如PCB,电路比较简单,比照着PCB看一下就明白了。
另外那个1.4元的升压模块,周末测了测,还是可以用的哈哈。
回复

使用道具 举报

7#
ID:430492 发表于 2020-5-25 19:18 | 只看该作者
感谢楼主分享!!
回复

使用道具 举报

8#
ID:29594 发表于 2020-5-30 10:05 | 只看该作者




下面这片是脉冲20(2ms),间隔4(0.4ms),次数4,也就是2ms的脉冲间隔0.4ms连续4次,效果蛮好的,非常牢,用老虎钳拉只能把镍片拉坏,焊点不掉。
那么这次点焊机的DIY就算基本成功了。后续有空弄个壳子。

回复

使用道具 举报

9#
ID:755390 发表于 2020-5-30 15:18 | 只看该作者
能点1mm的不锈钢吗?
回复

使用道具 举报

10#
ID:29594 发表于 2020-5-30 19:52 | 只看该作者
阿东奎 发表于 2020-5-30 15:18
能点1mm的不锈钢吗?

不清楚,我估计不行,手头只有0.15的镀镍片,我也只是用来焊焊电池。这个电流是大概可以估计出来的,大约在2000A的样子吧。之前用微波炉变压器的那种,电流在几百安的数量级。这个还是猛不少的。焊1.0不锈钢可以参考修车场里那种工业用的,那种都要好几千安培甚至上万安培电流了吧。
回复

使用道具 举报

11#
ID:253767 发表于 2020-6-4 06:57 | 只看该作者
谢谢分享!!!
回复

使用道具 举报

12#
ID:770222 发表于 2020-6-5 12:12 来自手机 | 只看该作者
牛人太多了乙,多谢分享
回复

使用道具 举报

13#
ID:546568 发表于 2020-6-5 15:55 | 只看该作者
牛人啊,最近正对着感兴趣,学习了!
回复

使用道具 举报

14#
ID:774678 发表于 2020-6-10 09:29 | 只看该作者
厉害了,这个得学习一下儿
回复

使用道具 举报

15#
ID:345562 发表于 2020-6-13 14:39 | 只看该作者
好完整的的资源,谢谢分享。
回复

使用道具 举报

16#
ID:241916 发表于 2020-7-4 11:08 | 只看该作者
板子D的真漂亮,有水准
回复

使用道具 举报

17#
ID:399111 发表于 2020-7-16 14:16 | 只看该作者
你的MOS什么型号啊
回复

使用道具 举报

18#
ID:56960 发表于 2020-7-16 17:13 | 只看该作者
为DIY精神点赞,顶帖+收藏!
回复

使用道具 举报

19#
ID:29594 发表于 2020-7-17 09:25 | 只看该作者
YYZZ052 发表于 2020-7-16 14:16
你的MOS什么型号啊

IRF3713×16个。那个宝广东拆机货,1块1个
回复

使用道具 举报

20#
ID:353831 发表于 2020-7-18 23:46 来自手机 | 只看该作者
楼主  怎么给电容充电啊!另外用的什么充电器?
回复

使用道具 举报

21#
ID:29594 发表于 2020-7-19 09:26 | 只看该作者
wl020807 发表于 2020-7-18 23:46
楼主  怎么给电容充电啊!另外用的什么充电器?

用两个普通的5v充电器,某宝买两个恒压恒流模块,调整到2.75v,1A~2A,分别给两个电容充电。
回复

使用道具 举报

22#
ID:712493 发表于 2020-7-23 21:34 | 只看该作者
楼主:
1、1-2A充电,要多久能满,充一次可以打几个焊点
2、3000F电容是并联放电,还是串联放电,或最后是多少电压 ,多少容量在放电  谢谢
回复

使用道具 举报

23#
ID:29594 发表于 2020-7-25 21:12 | 只看该作者
fj51hei 发表于 2020-7-23 21:34
楼主:
1、1-2A充电,要多久能满,充一次可以打几个焊点
2、3000F电容是并联放电,还是串联放电,或最后 ...

1、充电时间没有测过,我是拿太阳能板输入,恒流输出大概3A冲的,大约一刻钟就满了。充满可以打几个焊点?我也没测过哈哈。
2、串联放电。2.75V*2。
回复

使用道具 举报

24#
ID:712493 发表于 2020-8-2 21:52 | 只看该作者
zuse1021 发表于 2020-7-25 21:12
1、充电时间没有测过,我是拿太阳能板输入,恒流输出大概3A冲的,大约一刻钟就满了。充满可以打几个焊点 ...

就是串并联后3000F/5.5V的电容,谢谢答疑
回复

使用道具 举报

25#
ID:29594 发表于 2020-8-31 08:24 | 只看该作者
据坛友反映,仿制后无法保存设置的问题,忘了在主贴中说了,这个单片机的EEPROM是可以自定义大小的,当时好像是利用了4K的大小,各位如果刷ROM到单片机中时,可以选择4K的EEPROM大小来刷。
回复

使用道具 举报

26#
ID:53978 发表于 2020-9-1 08:34 | 只看该作者
这个可以有,感谢分享。
回复

使用道具 举报

27#
ID:828103 发表于 2020-10-11 21:04 | 只看该作者
这个是好东西啊
回复

使用道具 举报

28#
ID:824917 发表于 2020-10-27 18:37 来自手机 | 只看该作者
你好,请问为什么我下载了却解压不了?手机不行,电脑也不行。
回复

使用道具 举报

29#
ID:328014 发表于 2020-10-27 18:49 | 只看该作者
搞事DIY 发表于 2020-10-27 18:37
你好,请问为什么我下载了却

我刚刚用winrar在win10成功解压了.可能是你没有用winrar这个软件吧
回复

使用道具 举报

30#
ID:824917 发表于 2020-10-27 18:58 来自手机 | 只看该作者
我确实没有winrsr,我到时试一下。
回复

使用道具 举报

31#
ID:824917 发表于 2020-10-27 18:59 来自手机 | 只看该作者
51hei团团 发表于 2020-10-27 18:49
我刚刚用winrar在win10成功解压了.可能是你没有用winrar这个软件吧

我确实没有,我到时下来试一下。
回复

使用道具 举报

32#
ID:824917 发表于 2020-10-27 21:14 来自手机 | 只看该作者
用winrar成功解压
回复

使用道具 举报

33#
ID:288629 发表于 2020-10-30 13:05 | 只看该作者
楼主动手能力太强了,佩服
回复

使用道具 举报

34#
ID:639666 发表于 2020-10-30 19:18 | 只看该作者
zuse1021 发表于 2020-7-25 21:12
1、充电时间没有测过,我是拿太阳能板输入,恒流输出大概3A冲的,大约一刻钟就满了。充满可以打几个焊点 ...

场效应管G极的驱动电压也是5伏?还是升压板升为12伏来驱动?
回复

使用道具 举报

35#
ID:29594 发表于 2020-10-30 20:18 | 只看该作者
lhxtzlhxtz 发表于 2020-10-30 19:18
场效应管G极的驱动电压也是5伏?还是升压板升为12伏来驱动?

升压模块升压到16v驱动
回复

使用道具 举报

36#
ID:842023 发表于 2020-11-11 16:28 | 只看该作者
τ 宝成品的点焊MOS板,mos太少,请问楼主线多粗
回复

使用道具 举报

37#
ID:24379 发表于 2021-1-16 21:49 | 只看该作者
这个牛,就是升压模块是为了mos管饱和导通是吗?
回复

使用道具 举报

38#
ID:848720 发表于 2021-1-18 11:42 | 只看该作者
有没有原理图?
回复

使用道具 举报

39#
ID:748246 发表于 2021-2-12 11:42 | 只看该作者
6666666待会儿画pcb试试
回复

使用道具 举报

40#
ID:884089 发表于 2021-2-16 19:44 来自手机 | 只看该作者
这个mos管的s接哪个呢
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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