数码之家

 找回密码
 立即注册
搜索
查看: 5963|回复: 25

[Arduino] Arduino点焊机控制器代码的注释

[复制链接]
发表于 2019-12-29 20:01:20 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

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

x
首先声明:这是开源Arduino点焊机V2版本的代码,非原创。
电路图和pcb是 KICAD 格式。

电路图

电路图
  
pcb:
Gerber_Combined_PCBs.JPG

打赏

参与人数 2家元 +70 收起 理由
kingw12 + 20 謝謝分享
家睦 + 50

查看全部打赏

 楼主| 发表于 2019-12-29 20:03:11 | 显示全部楼层
代码:
  1. // Arduino Battery Spot Welder蓄电池点焊机
  2. // Project Page: http://www.instructles.com/id/DIY-Arduino-Battery-Spot-Welder/

  3. int max_pulse_time = 20; // Sets the maximum pulse time to 20mS (do not use higher than 99 because the display only works up to 99)将最大脉冲时间设置为20MS(不使用高于99,因为显示器只工作到99)
  4. int mosfetPin = 5;  // Pin that controls the mosfet drivers 控制mosfet的引脚
  5. int ledPin = 4;   // Pin to control the status led 控制状态led的引脚
  6. int switchPin = 2;  // Pin to trigger a pulse with the foot switch用脚踏开关触发脉冲的引脚
  7. int sensorPin = A7;  // Pin where the potentiometer value is read读取电位计值的引脚
  8. int previous_pulse_time; // Previous pulse time so display can skip to ones digit以前的脉冲时间显示可以跳过的数字
  9. int pulse_time;   // Variable to store the pulse time 存储脉冲时间的变量
  10. int pulse_short;  // Variable to store the short pulse time 存储短脉冲时间的变量
  11. int displayStep = 0; // The step the display function should complete next 下一步显示功能应完成的步骤
  12. unsigned long previousMillis = millis(); // The milliseconds where the timer starts counting from 计时器开始计数的毫秒数
  13. int tens = 0; // Tens place digit 十位数字
  14. int ones = 0; // Ones place digit 个位数字
  15. float pulse_calc = 1023 / max_pulse_time;

  16. // Defines the possible characters to be displayed on the 7-segment display in an array 定义数组中7段显示器上可能显示的字符
  17. //            0          1          2          3          4          5          6          7          8          9          .          None       All
  18. byte y[13] = {B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11110110, B00000001, B00000000, B11111111}; // Ones
  19. byte z[13] = {B11111100, B00001100, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11110110, B00000001, B00000000, B11111111}; // Tens


  20. //-------------------------------------------------------------------------------------------

  21. void setup() {
  22.   pinMode(switchPin, INPUT); // Set switchPin as Input 将开关脚设置为输入
  23.   pinMode(mosfetPin, OUTPUT); // Set mosfetPin as Output 将mosfet脚设置为输出
  24.   pinMode(ledPin, OUTPUT); // Set ledPin as Output将led引脚设置为输出
  25.   pinMode(sensorPin, INPUT); // Set sensorPin as Input 将传感器引脚设置为输入

  26.   // Set up 7 Segment Pins设置7段引脚
  27.   for (int i = 6; i <= 13; i++) // Pins 6-13 are set as Outputs脚6-13设置为输出

  28.     pinMode(i, OUTPUT);

  29.   // Light up the led and the display 2 seconds to verify correct placement and function点亮led和显示屏2秒钟,以验证正确的位置和功能
  30.   digitalWrite(ledPin, HIGH);
  31.   segments(z[12]);
  32.   delay(2000);
  33.   digitalWrite(ledPin, LOW);
  34.   segments(z[11]);
  35. }

  36. //-------------------------------------------------------------------------------------------

  37. void loop() {

  38.   // Read pulse time from analog input从模拟输入读取脉冲时间
  39.   read_pulse_time();

  40.   // Display time on 7-segment display在7段显示器显示时间

  41.   time_display();

  42.   // Impulse activated by switch脉冲激活开关
  43.   if (digitalRead(switchPin) == HIGH && pulse_time > 0) {
  44.     double_pulse();
  45.     // Wait until switch has been released等到开关已经发布
  46.     do {
  47.       digitalWrite(mosfetPin, LOW);
  48.       digitalWrite(ledPin, LOW);
  49.     } while (digitalRead(switchPin) == HIGH);
  50.     // Delay before impulse can be triggered again再次延迟脉冲触发之前
  51.     delay(500);
  52.   }
  53.   else
  54.   {
  55.     digitalWrite(mosfetPin, LOW);
  56.     digitalWrite(ledPin, LOW);
  57.   }
  58. }

  59. //-------------------------------------------------------------------------------------------

  60. void segments(byte n) {
  61.   // controll all 7 Segments控制所有7段

  62.   for (int k = 6; k <= 13; k++) {
  63.     if ((n & B10000000) > 0)
  64.       digitalWrite(k, HIGH);
  65.     else
  66.       digitalWrite(k, LOW);
  67.     n = n << 1;
  68.   }
  69. }

  70. //-------------------------------------------------------------------------------------------

  71. void read_pulse_time() {
  72.   // Read the potentiometer and shift the value to correct the midpoint读取电位计并移动该值以校正中点
  73.   // This allows 20 to be selected without the value having to be exactly 1023 这允许选择20,而不必精确地选择1023
  74.   int sensorValue = analogRead(sensorPin) + pulse_calc/2;

  75.   // Add a small amount of hysteresis添加少量滞后
  76.   if ((sensorValue - 3) / pulse_calc > pulse_time) {
  77.     // Makes a pulse of max 20 mS because SensorValue can max become 1023 使脉冲最大为20毫秒,因为传感器最大值可以变为1023
  78.     pulse_time = sensorValue / pulse_calc;
  79.   }
  80.   if ((sensorValue + 3) / pulse_calc < pulse_time) {
  81.     pulse_time = sensorValue / pulse_calc;
  82.   }
  83. }

  84. //-------------------------------------------------------------------------------------------

  85. void reset_timer() {
  86.   // Set timer to start counting from current time设置计时器以从当前时间开始计数
  87.   previousMillis = millis();
  88. }

  89. //-------------------------------------------------------------------------------------------

  90. bool delay_done(unsigned long delay) {
  91.   // If difference between current time and previous time is more than the delay如果当前时间和上一时间之间的差异大于延迟
  92.   if ((unsigned long)(millis() - previousMillis) >= delay) {
  93.     return true;
  94.   }
  95.   return false;
  96. }

  97. //-------------------------------------------------------------------------------------------

  98. void time_display() { // 7 segment pulse time displaying
  99.   if (pulse_time != previous_pulse_time) {
  100.     previous_pulse_time = pulse_time;

  101.     // Skip to ones digit跳到个位数
  102.     displayStep = 2;
  103.   }

  104.   if (tens == 0) {
  105.     // Skip to ones digit跳到个位数
  106.     displayStep = 2;
  107.   }

  108.   tens = (pulse_time % 100) / 10; // 十位
  109.   ones = pulse_time % 10; // Ones place个位

  110.   //delay(500);

  111.   switch (displayStep) {
  112.     // Display tens digit显示十位数
  113.     case 0:
  114.       // Time to clear display after displaying both digits显示两个数字后清除显示的时间
  115.       if (delay_done(400)) {
  116.         // Display tens digit显示十位数
  117.         segments(z[tens]);

  118.         reset_timer();
  119.         displayStep = 1;
  120.       }
  121.       break;

  122.     // Delay after showing tens digit延迟后显示十位数字
  123.     case 1:
  124.       if (delay_done(300)) {
  125.         // Clear display清屏
  126.         segments(z[11]);

  127.         displayStep = 2;
  128.       }
  129.       break;

  130.     // Display ones digit显示个位数字
  131.     case 2:
  132.       segments(y[ones]);

  133.       reset_timer();
  134.       displayStep = 3;

  135.       break;

  136.     // Delay after showing ones digit 延迟最后显示的数字
  137.     case 3:
  138.       if (delay_done(300)) {
  139.         // Clear display 清屏
  140.         segments(z[11]);

  141.         reset_timer();
  142.         displayStep = 0;
  143.       }
  144.       break;
  145.   }
  146. }

  147. //-------------------------------------------------------------------------------------------

  148. void double_pulse() {

  149.   pulse_short = (pulse_time / 8); // 设置短脉冲为1/8脉冲

  150.   if (pulse_short < 1) // 使短脉冲至少一个毫秒
  151.     pulse_short = 1;

  152.   digitalWrite(ledPin, HIGH);
  153.   digitalWrite(mosfetPin, HIGH);
  154.   delay(pulse_short);
  155.   digitalWrite(mosfetPin, LOW);
  156.   delay(pulse_short);
  157.   digitalWrite(mosfetPin, HIGH);
  158.   delay(pulse_time);
  159.   digitalWrite(mosfetPin, LOW);

  160.   //保持额外的50ms
  161.   delay(50);
  162.   digitalWrite(ledPin, LOW);

  163. }
复制代码

打赏

参与人数 1家元 +20 收起 理由
人艰不拆了 + 20

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-12-29 20:10:53 | 显示全部楼层
该点焊机可用于焊接18650电池。
它使用12V汽车电池作为焊接电流源。
通常情况下,一个40Ah 440A电池可提供足够的电流,
实现0.15mm至0.25mm镍条的良好焊接。
对于较厚的镍条,也许您需要并排安装两个或更多的电池。

焊机会生成一个双脉冲,默认情况下,第一个脉冲是第二个脉冲时间的12%。主脉冲的脉冲时间可通过电位器进行调整,并以毫秒为单位显示数码管上,因此您可以精确地调整时间。默认情况下,其可调范围为1…20 ms。(在程序中最多可调至99ms)

程序利用交替显示来得到10---99mS的显示,这样可以只用一个数码管,尽管这是不必要的。。。。。
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-12-29 20:18:58 | 显示全部楼层
代码已在Arduino nano编译通过,效果未知。
我试验用了两个2.8V,3000F串联做主电源,很不幸,炸了Mos。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-29 20:24:46 | 显示全部楼层
全部的资料在这里:电路图,pcb,代码,注释,制作网站资料,元件清单等
大小限制只能分卷压缩了,需要改名后解压(论坛提示不支持的文件名?!)

补充内容 (2020-1-2 18:52):
币不足可以到楼下的开源链接去找,一样的。
我开始研究的时候内个网址要梯子,所以转发过来了。

Arduino_Spot_Welder_V2-master.1.zip

3 MB, 下载次数: 27, 下载积分: 家元 -55

改成Arduino_Spot_Welder_V2-master.zip.001

Arduino_Spot_Welder_V2-master.2.zip

3 MB, 下载次数: 23, 下载积分: 家元 -55

改成.002

Arduino_Spot_Welder_V2-master.3.zip

1.27 MB, 下载次数: 27, 下载积分: 家元 -55

改成.003

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-12-29 20:33:18 | 显示全部楼层
下面是发图时间: 2017-03-12T14:38:33.021Z-diodes_soldered.jpg adad8fe72a4c475d58bc3af806d7833fc3b2dd0b.JPG FD65TIDINI7ZKG6.LARGE.jpg FNSZ92NJ1WW3ENG.LARGE.webp.jpg FDKP69AJ5UA4GJU.LARGE.webp.jpg FC7FHNAJ67WI3RX.LARGE.webp.jpg FFSC99OINI7ZKG2.LARGE.webp.jpg
回复 支持 反对

使用道具 举报

发表于 2019-12-29 21:17:39 | 显示全部楼层
superman89 发表于 2019-12-29 20:18
代码已在Arduino nano编译通过,效果未知。
我试验用了两个2.8V,3000F串联做主电源,很不幸,炸了Mos。 ...

超级电容的放电能力可比电池强了海了去了,我的MOS管可是预备了恒定6000A电流才行!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-29 21:54:10 | 显示全部楼层
qd0426 发表于 2019-12-29 21:17
超级电容的放电能力可比电池强了海了去了,我的MOS管可是预备了恒定6000A电流才行! ...

理论上是这样,但我实测超级电容两串含连接件接近8毫欧,MOS管8并1毫欧,线缆,接触电阻等等也有5毫欧
5v电压 电流极限计算不过350A而已。我怀疑是没有加吸收电路。
以前做的是180好汉,一次性放光,不存在关断问题。
回复 支持 反对

使用道具 举报

发表于 2019-12-30 20:05:32 | 显示全部楼层
看到arduino代码就兴奋,更别提是我一直想做的点焊机了,关注下,看一遍代码再说:lol:
回复 支持 反对

使用道具 举报

发表于 2019-12-30 21:39:32 | 显示全部楼层
有的软件翻译的吧,比较生硬。
比如“ Wait until switch has been released等到开关已经发布 ”,其实就是等待按键松开
回复 支持 1 反对 0

使用道具 举报

发表于 2019-12-31 19:58:42 | 显示全部楼层
新品种的点焊机板子又出来了:lol:这次是汽车电瓶,以前是微波炉变压器。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-31 23:28:53 | 显示全部楼层
elecfunwb 发表于 2019-12-30 21:39
有的软件翻译的吧,比较生硬。
比如“ Wait until switch has been released等到开关已经发布 ”,其实就是 ...

词汇量不足,机翻+手工,见笑了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-31 23:32:45 | 显示全部楼层
Connection_Diagramm_old-1024x476.png

实际接线是这样的,需要外加电源12v。
后期的版本自供电。
不过我用超级电容,只有5.6v。
低压下MOS管开通速度会变慢,具体还是要看手册了。。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-31 23:36:36 | 显示全部楼层
请注意最后发的图上有两个大二极管
一个是大电流肖特基,反并联类似续流二极管。
一个并在MOS上做高电压保护。
接线是这样的:
baohu.jpg
回复 支持 反对

使用道具 举报

发表于 2020-1-1 00:51:17 | 显示全部楼层
下载文件是坏的,不能解压,M币伤不起
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-1 18:41:00 | 显示全部楼层
zhuangchao12 发表于 2020-1-1 00:51
下载文件是坏的,不能解压,M币伤不起

我用的是360压缩做的分卷,你改文件名以后,直接解压就好。把三个文件放到同一文件夹。
像这样:
截图202001015.jpg
回复 支持 反对

使用道具 举报

发表于 2020-1-1 20:57:34 来自手机浏览器 | 显示全部楼层
一个数码管确实没太必要,显示糟心
回复 支持 反对

使用道具 举报

发表于 2020-1-2 09:07:00 | 显示全部楼层
给个开源链接我去看看
// Wait until switch has been released等到开关已经发布
等待开关释放
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-2 18:50:55 | 显示全部楼层
本帖最后由 superman89 于 2020-1-2 19:30 编辑

回复审核不过,应该是发第三方连接不允许。
以后注意了
自己去搜开源链接吧。
回复 支持 反对

使用道具 举报

发表于 2020-1-4 15:58:22 | 显示全部楼层
这给笔线只能用细点的线否则炸管
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-3-29 20:15 , Processed in 0.187200 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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