开源改变世界!!

主轴 PWM 反转选项

推推 grbl 2年前 (2022-06-12) 446次浏览 0个评论

我会找到一个选项来反转主轴 PWM 输出的优势。

一些“分线板”具有板载 PWM 到需要反向 PWM 的模拟转换器。

该功能将吸引装有此类板(并行端口 BOB)的流行中国 CNC 路由器的用户,以避免临时硬件逆变器。

似乎 Mach3 提供了这样的选项,当然 TX14692 等板及其许多变体都使用反向 PWM。

主轴 PWM 反转选项 owenduffy 添加了 增强 标签 on 8 Oct 2019
主轴 PWM 反转选项
所有者

婚戒 评论 on 8 Oct 2019

本周晚些时候我会看看它是否可以轻松干净地添加。

主轴 PWM 反转选项
所有者

婚戒 评论 on 12 Oct 2019

我想我有这个工作。我正在同时对主轴进行整体清理,因此我需要进行更多测试。

以前,如果您没有指定主轴引脚,您仍然需要定义一堆主轴值才能使其编译。现在,如果您不指定引脚,则不需要其他值。

主轴 PWM 反转选项
作者

欧文达菲 评论 on 12 Oct 2019

好的,听起来不错,巴特。准备好后很高兴进行测试。

请参阅与主轴控制和用户定制相关的问题#247 ……如果它符合您对用户定制的想法,它可能是对同一模块的一个非常简单的增强。

主轴 PWM 反转选项
所有者

婚戒 评论 on 12 Oct 2019

我看到了那个问题。在查看其他问题之前,我想要一个关于反转问题的干净 PR。还有一个#define ENABLE_PIECEWISE_LINEAR_SPINDLE从未在 Grbl_ESP32 中实现的 AVR Grbl 功能。

您如何测量主轴转速?

它在负载下保持 RPM 的效果如何?

主轴 PWM 反转选项
作者

欧文达菲 评论 on 12 Oct 2019

测量速度:

所有测试均在 CNC6040 1.5kw 2pole 感应电机 VFD 上空载。VFD 控制器显示 VFD 供电频率。感应电机具有与负载相关的滑差(这是电机电流增加以满足负载要求的机制),并且我已经使用轴上的光学转速计验证了卸载的主轴速度与频率显示相一致(即卸载的滑差非常正如预期的那样低)。

我认为空载速度是目标,因为刀具在轻切割时燃烧与接近空载速度有关。在这种情况下,我认为您在负载下会遭受速度损失,这是电动机的基本特征。

这种特殊的 VFD 在低转速下卸载时不是很稳定,我希望在加载时更不稳定。速度控制存在实际限制。

我预计高速时的滑差可能很小,但在绕组电抗相对于绕组电阻较低的最低频率/速度下,滑差曲线可能不太理想。我是否说过速度控制存在实际限制?

我提出的退出想法并没有将补偿限制为分段补偿,尽管我看到了保持代码路径长度短的警告。

主轴 PWM 反转选项
所有者

婚戒 评论 on 12 Oct 2019

更改已上传到 devt 分支。在与主人合并之前,我会将它们留在那里一段时间。

感谢您可以进行的任何测试或您的反馈。

主轴 PWM 反转选项
作者

欧文达菲 评论 on 12 Oct 2019

我今天应该可以做到(UTC+11)。

主轴 PWM 反转选项
作者

欧文达菲 评论 on 12 Oct 2019

我最初使用输出范围对其进行了测试。

验证它是倒置的,但在速度低于 31 美元时存在问题,因为我预计 PWM 为 0%(倒置)但它提供 1.56µs(我假设 PWM=1/256)并且我们真的希望 PWM=0 时速度低于S31,不是吗?

如果我将速度设置为 S2000,我得到 10.15µs(反转很好),它们 M2 和 PWM=770ns,我们需要 0ns 来关闭电机。

我说清楚了吗?

主轴 PWM 反转选项
所有者

婚戒 评论 on 12 Oct 2019

我没有测试那个。我从不喜欢这种工作方式。好像不是很健壮。

这样做的目的是确保您以最低 RPM 或最低 PWM 运行主轴吗?

我认为它应该将低于最小值的任何非零 Sxxx 更改为最小值,并通过与任何其他 S 值相同的计算发送它。否则,除非 SPINDLE_PWM_MIN_VALUE 是完美的,否则您会出现从低于最小值到最小值的奇怪过渡。

我认为 S 应该在 gcode.cpp 中进行测试和修复。如果您发送 S100,它会将其更改为 S200(如果这是最小值)。现在 $G 报告和覆盖等工作在正确的值上。

主轴 PWM 反转选项
作者

欧文达菲 评论 on 12 Oct 2019

好的,我认为每当电机停止、程序停止或 Sxxxx<min 时,系统都需要发送 PWM 0%(根据配置不反转或反转)。它应该以可靠和一致的方式完成。

因此,对于倒置的情况,我希望当第 1 项中的任何条件适用时,主轴引脚上的 3V 电压会稳定。

我没有亲自进行更改的原因是缺乏对所有各种模块和参数(如果你喜欢的话,意大利面条)的交互的了解。

准备好后很高兴再次测试,我再次使用示波器。

感谢您的努力巴特,感谢。

顺便说一句,我可以忍受 grbl 线性化……忍受它???,它比没有好得多,并且与我实现和测试的基本相同。

做得好!

主轴 PWM 反转选项
作者

欧文达菲 评论 on 12 Oct 2019

我可能会解释说,我认为应该为 sxxxx<rpmmin 停止主轴的原因是,以 rpmmin 旋转“工具”可能不安全,因此它不应该是默认速度。一个例子是在 600rpm 以上可能不安全的寻边器。

另一方面,将 sxxx 限制在 rpmmax 是有意义的。

主轴 PWM 反转选项
所有者

婚戒 评论 on 12 Oct 2019

如果您将 RPM 设置得太高,我不确定它如何保存寻边器。

我想如果你真的担心所有这些东西,你会正确设置它。也许我大部分时间都会不理它。

这个怎么样…

示例:
settings.rpm_min = 200
settings.rpm_max = 1000

S0 = 0 PWM
S100 = SPINDLE_PWM_MIN_VALUE
S200 = 200 RPM
S1000 = 1000 RPM
S1200 = 1000 RPM(并报告 1000)

主轴 PWM 反转选项

让我试着说得更清楚些。

系统应发送 PWM=0%(反转或不按照配置):
-Sxxx<rpm_min;
– 启动时;
– 每当程序停止时 (M2)。

推理:电机或驱动器命令速度太慢可能不安全,因此如果用户正确配置 rpm_min ($31),代码应在请求较低速度时保护电机。

(寻边器是题外话,速度过快可能会损坏它或工作。所以如果我订购s600并且系统配置为rpm_min = 1200,则发送PWM = 0%。)

主轴 PWM 反转选项
作者

欧文达菲 评论 2019 年 10 月 12 日  

如果您将 RPM 设置得太高,我不确定它如何保存寻边器。

我想如果你真的担心所有这些东西,你会正确设置它。也许我大部分时间都会不理它。

这个怎么样…

示例:
settings.rpm_min = 200
settings.rpm_max = 1000

S0 = 0 PWM
S100 = SPINDLE_PWM_MIN_VALUE
S200 = 200 RPM
S1000 = 1000 RPM
S1200 = 1000 RPM(并报告 1000)

S100 = 0 脉宽调制

推理:
不要比要求的速度更快地旋转工具,这可能对工具、工作、操作员不安全。
不要以低于 rpm_min 的速度旋转电机(除非您将其停止)。

主轴 PWM 反转选项
所有者

婚戒 评论 2019 年 10 月 12 日

我不同意。

推理:

永远不要接受 RPM 但不要旋转。

这是“原始”Grbl。

else if (rpm <= settings.rpm_min) {
        if (rpm == 0.0) { // S0 disables spindle
          sys.spindle_speed = 0.0;
          pwm_value = SPINDLE_PWM_OFF_VALUE;
        } else { // Set minimum PWM output
          sys.spindle_speed = settings.rpm_min;
          pwm_value = SPINDLE_PWM_MIN_VALUE;
        }

另一种方法是出错,停止作业,需要重置。

主轴 PWM 反转选项

好的,我理解并接受。

我即将进行 cal 运行以提供 py 脚本以进行分段线性化。我在 devt 版本上运行它,试运行看起来不错。光学转速计将记录实际主轴速度(空载)。

主轴 PWM 反转选项
所有者

婚戒 评论 2019 年 10 月 12 日

伟大的。

您认为应该添加 SPINDLE_RPM_RANGE_ERROR 吗?

主轴 PWM 反转选项
作者

欧文达菲 评论 2019 年 10 月 12 日  

我不明白。

使用 devt 分支的 cal 运行看起来不错。即我正在使用反转。)
主轴 PWM 反转选项

主轴 PWM 反转选项

我一直在研究这个问题,我认为仍然存在一个问题,即当主轴应该停止时,每个 PWM 周期都有一个非常短(790ns)的下降脉冲。

我发现如果我设置 sxxx>0 和 <rpmmin,我会得到像 rpmmin 一样的 pwm。

如果我设置 s0,我不会得到向下转换。

如果我然后击中 m2,我会看到 790ns 下降脉冲

这似乎是由我评论的那一行引起的:

// grbl_analogWrite(SPINDLE_PWM_CHANNEL, (1<<SPINDLE_PWM_BIT_PRECISION) – 1);
grbl_analogWrite(SPINDLE_PWM_CHANNEL, (1<<SPINDLE_PWM_BIT_PRECISION));

这条修改后的线路问题就消失了。

主轴 PWM 反转选项
所有者

婚戒 评论 2019 年 10 月 12 日

我也看到了这个问题。

主轴 PWM 反转选项

您已部分实施分段补偿。

我将代码添加到主轴控制.cpp:

@@ -61,11 +61,12 @@ void spindle_stop()
   spindle_set_enable(false);
 	#ifdef SPINDLE_PWM_PIN
 		#ifndef INVERT_SPINDLE_PWM
 			grbl_analogWrite(SPINDLE_PWM_CHANNEL, SPINDLE_PWM_OFF_VALUE);
 		#else
-			grbl_analogWrite(SPINDLE_PWM_CHANNEL, (1<<SPINDLE_PWM_BIT_PRECISION) - 1);
+//			grbl_analogWrite(SPINDLE_PWM_CHANNEL, (1<<SPINDLE_PWM_BIT_PRECISION) - 1);
+			grbl_analogWrite(SPINDLE_PWM_CHANNEL, (1<<SPINDLE_PWM_BIT_PRECISION));
 		#endif
 	#endif
 }
 
 uint8_t spindle_get_state()  // returns SPINDLE_STATE_DISABLE, SPINDLE_STATE_CW or SPINDLE_STATE_CCW
@@ -138,15 +139,31 @@ uint32_t spindle_compute_pwm_value(float rpm)
 			pwm_value = SPINDLE_PWM_MIN_VALUE;
 			}
 		} else {
 			// Compute intermediate PWM value with linear spindle speed model.
 			// NOTE: A nonlinear model could be installed here, if required, but keep it VERY light-weight.
-			sys.spindle_speed = rpm;
-			pwm_value = floor((rpm-settings.rpm_min)*pwm_gradient) + SPINDLE_PWM_MIN_VALUE;
-		}		
-		
-		return(pwm_value);
+        #if (N_PIECES > 3)
+          if (rpm > RPM_POINT34) {
+            pwm_value = floor(RPM_LINE_A4*rpm - RPM_LINE_B4);
+          } else 
+        #endif
+        #if (N_PIECES > 2)
+          if (rpm > RPM_POINT23) {
+            pwm_value = floor(RPM_LINE_A3*rpm - RPM_LINE_B3);
+          } else 
+        #endif
+        #if (N_PIECES > 1)
+          if (rpm > RPM_POINT12) {
+            pwm_value = floor(RPM_LINE_A2*rpm - RPM_LINE_B2);
+          } else 
+        #endif
+        {
+          pwm_value = floor(RPM_LINE_A1*rpm - RPM_LINE_B1);
+        }
+      }
+   sys.spindle_speed = rpm;
+   return(pwm_value);
 	#else
 		return(0); // no SPINDLE_PWM_PIN
 	#endif
 }
 


和 cpu_map:

@@ -126,12 +126,14 @@
 	// round down to nearest bit count for SPINDLE_PWM_MAX_VALUE = 13bits (8192)
 	
 	#define SPINDLE_PWM_BASE_FREQ 5000 // Hz
 	#define SPINDLE_PWM_BIT_PRECISION 8   
 	#define SPINDLE_PWM_OFF_VALUE     0
-	#define SPINDLE_PWM_MAX_VALUE     255
-	//#define INVERT_SPINDLE_PWM
+//	#define SPINDLE_PWM_MAX_VALUE     255
+#define INVERT_SPINDLE_PWM
+#define SPINDLE_PWM_MIN_VALUE 3
+#define SPINDLE_PWM_MAX_VALUE 195
 	
 	#ifndef SPINDLE_PWM_MIN_VALUE
 		#define SPINDLE_PWM_MIN_VALUE   1   // Must be greater than zero.
 	#endif

和config.h:

@@ -45,11 +45,12 @@ Some features should not be changed. See notes below.
 // Define CPU pin map and default settings.
 // NOTE: OEMs can avoid the need to maintain/update the defaults.h and cpu_map.h files and use only
 // one configuration file by placing their specific defaults and pin map at the bottom of this file.
 // If doing so, simply comment out these two defines and see instructions below.
 #define DEFAULTS_GENERIC
-#define CPU_MAP_TEST_DRIVE // these are defined in cpu_map.h
+//#define CPU_MAP_TEST_DRIVE // these are defined in cpu_map.h
+#define CPU_MAP_ESP32 // these are defined in cpu_map.h
 #define VERBOSE_HELP // adds addition help info, but could confuse some senders
 
 
 // Serial baud rate
 #define BAUD_RATE 115200
@@ -687,30 +688,27 @@ Some features should not be changed. See notes below.
 #define DISABLE_LASER_DURING_HOLD // Default enabled. Comment to disable.
 
 // Enables a piecewise linear model of the spindle PWM/speed output. Requires a solution by the
 // 'fit_nonlinear_spindle.py' script in the /doc/script folder of the repo. See file comments 
 // on how to gather spindle data and run the script to generate a solution.
-// #define ENABLE_PIECEWISE_LINEAR_SPINDLE  // Default disabled. Uncomment to enable.
+#define ENABLE_PIECEWISE_LINEAR_SPINDLE  // Default disabled. Uncomment to enable.
 
 // N_PIECES, RPM_MAX, RPM_MIN, RPM_POINTxx, and RPM_LINE_XX constants are all set and given by
 // the 'fit_nonlinear_spindle.py' script solution. Used only when ENABLE_PIECEWISE_LINEAR_SPINDLE
 // is enabled. Make sure the constant values are exactly the same as the script solution.
 // NOTE: When N_PIECES < 4, unused RPM_LINE and RPM_POINT defines are not required and omitted.
-#define N_PIECES 4  // Integer (1-4). Number of piecewise lines used in script solution.
-#define RPM_MAX  11686.4  // Max RPM of model. $30 > RPM_MAX will be limited to RPM_MAX.
-#define RPM_MIN  202.5    // Min RPM of model. $31 < RPM_MIN will be limited to RPM_MIN.
-#define RPM_POINT12  6145.4  // Used N_PIECES >=2. Junction point between lines 1 and 2.
-#define RPM_POINT23  9627.8  // Used N_PIECES >=3. Junction point between lines 2 and 3.
-#define RPM_POINT34  10813.9 // Used N_PIECES = 4. Junction point between lines 3 and 4.
-#define RPM_LINE_A1  3.197101e-03  // Used N_PIECES >=1. A and B constants of line 1.
-#define RPM_LINE_B1  -3.526076e-1
-#define RPM_LINE_A2  1.722950e-2   // Used N_PIECES >=2. A and B constants of line 2.
-#define RPM_LINE_B2  8.588176e+01
-#define RPM_LINE_A3  5.901518e-02  // Used N_PIECES >=3. A and B constants of line 3.
-#define RPM_LINE_B3  4.881851e+02
-#define RPM_LINE_A4  1.203413e-01  // Used N_PIECES = 4. A and B constants of line 4.
-#define RPM_LINE_B4  1.151360e+03
+#define N_PIECES 3
+#define RPM_MAX 23935.2
+#define RPM_MIN 2412.2
+#define RPM_POINT12 6283.9
+#define RPM_POINT23 11866.0
+#define RPM_LINE_A1 4.390865e-03
+#define RPM_LINE_B1 7.591787e+00
+#define RPM_LINE_A2 1.074874e-02
+#define RPM_LINE_B2 4.754411e+01
+#define RPM_LINE_A3 9.528342e-03
+#define RPM_LINE_B3 3.306286e+01
 
 
 /* ---------------------------------------------------------------------------------------
    OEM Single File Configuration Option
 


这是基于我昨天运行的 cal 的 cal 因素。

它适用于使用示波器观察的台架测试。

今天早上我应该可以在机器上跑步(天气允许的话)。

如果这很好,它将结束#244#247

主轴 PWM 反转选项
作者

欧文达菲 评论 2019 年 10 月 13 日  

我对模型进行了一些调整(更改了 py 文件中的参数),并且得到了更好的拟合。

该测试是使用 devt 分支进行的,具有前面显示的更改以适应主轴补偿的其余部分……重要的是,使用反向主轴 PWM。

一开始:
主轴 PWM 反转选项

补偿后:

主轴 PWM 反转选项

更清晰的组合:
主轴 PWM 反转选项

更好的校准。

巴特,这是一种享受……如果你结合了主轴补偿的其余部分,你可以关闭它和#247

谢谢你的工作……欧文。

主轴 PWM 反转选项
所有者

婚戒 评论 2019 年 10 月 13 日

我看不到您的代码中在哪里使用了#define ENABLE_PIECEWISE_LINEAR_SPINDLE。

以 +/- 格式阅读该代码需要做很多工作。

主轴 PWM 反转选项
所有者

婚戒 评论 2019 年 10 月 13 日

好的……看看原始的 Grbl。它围绕着一切以制作该功能的替代版本

主轴 PWM 反转选项

它在 config.h 的其他地方启用(就在我引用的内容之上)。没有它就不应该工作!!!

从本质上讲,我预计您将添加到主轴控制中的分段代码,从 grbl 逐字复制。

我希望你从 grbl 而不是我上面的代码中复制。我展示了它以显示已测试的范围。

当您将新内容合并到 devt 时,很高兴重新测试。

主轴 PWM 反转选项
作者

欧文达菲 评论 2019 年 10 月 13 日  

您认为我应该分叉并进行更改…但是实际上,您是作者,并且您更熟悉代码库,我很高兴进行测试。

主轴 PWM 反转选项
所有者

婚戒 评论 2019 年 10 月 13 日

我向 devt 推送了更多更改。对我来说测试并不容易。

我使线性拟合成为一个单独的函数来清理东西,它可以在将来允许更简单的方法添加其他拟合方法。

主轴 PWM 反转选项

很高兴测试。

好的,在使用范围的测试中看起来不错(它揭示的不仅仅是运行机器)。

我认为这很好推广。

再次感谢…欧文。

主轴 PWM 反转选项 bdring 提到了这个问题 2019 年 10 月 13 日
主轴 PWM 反转选项
所有者

婚戒 评论 2019 年 10 月 13 日

喜欢 (0)

您必须 登录 才能发表评论!