开源改变世界!!

非线性速度控制 #905

推推 grbl 2年前 (2023-01-23) 96次浏览

关闭
rwensley 打开了这个问题 2016 年 2 月 12 日 · 3条评论
关闭

非线性速度控制#905

rwensley 打开了这个问题 2016 年 2 月 12 日 · 3条评论

注释

非线性速度控制 #905

你好,

我正在使用 PWM 输出来控制通用电机。这些电机的速度与施加的电压曲线高度非线性。使用手动电位器,我重新订购了以下产品;
V PWM rpmmactual
0 0 5000
0.5 25.5 6100
1 51 7710
1.5 76.5 10144
2 102 11205
2.5 127.5 12533
3 153 153 153 14175
3.5 178.5 16400
4 204 4 204 19400
4.5 229.5 23570
5 255 30000 5 255 30000 5 255 3000000

这里使用S代码是结果;
S value RPM measured
5000 5000
6000 5565
7000 6160
8000 6960
9000 7920
10000 9200
11000 10240
12000 10765
13000 11350
14000 12050
15000 12800
16000 13630
17000 14570
18000 15660
19000 16940
20000 18550
21000 20360
22000 22600
23000 25860
24000 28860
25000 30000
26000 30000
27000 30000
28000 30000
29000 30000
30000 30000

我的 SPINDLE_MAX_RPM = 30000 和 SPINDLE_MIN_RPM = 5000

在 spindle_control.c 我输入了这一行

  rpm = (-0.000000001 * pow(rpm,3)) + (0.00003 * pow(rpm,2)) + (1.1873 * rpm) - 911.79;

  #define SPINDLE_RPM_RANGE (SPINDLE_MAX_RPM-SPINDLE_MIN_RPM)
  if ( rpm < SPINDLE_MIN_RPM ) { rpm = 0; } 
  else { 
    rpm -= SPINDLE_MIN_RPM; 
    if ( rpm > SPINDLE_RPM_RANGE ) { rpm = SPINDLE_RPM_RANGE; } // Prevent integer overflow
  }
  rpm = (-0.000000001 * pow(rpm,3)) + (0.00003 * pow(rpm,2)) + (1.1873 * rpm) - 911.79;
  current_pwm = floor( rpm*(PWM_MAX_VALUE/SPINDLE_RPM_RANGE) + 0.5);
  #ifdef MINIMUM_SPINDLE_PWM
    if (current_pwm < MINIMUM_SPINDLE_PWM) { current_pwm = MINIMUM_SPINDLE_PWM; }
  #endif
  OCR_REGISTER = current_pwm; // Set PWM pin output

我希望这会使输出线性化,这样当输入 S 10000 时,我将获得 10000 的实际转速,而不是像现在这样的 9200。

然而; 结果不太好。出于某种原因,进行此更改会导致 S5000 最终变为 13000。

我意识到每个主轴都会有所不同,因此需要某种形式的数据输入来更正。

这个想法可以合并到未来的版本中吗?

谢谢,
罗恩温斯利

非线性速度控制 #905
成员

@rwensley: 不,不太可能支持这样的东西。这就是为什么。主轴转速通常是非线性的,并且在负载下,它们以与没有负载时完全不同的速率旋转。这还取决于您要切割的材料、切割方式以及材料去除率。如果没有闭环反馈系统,很难准确预测真正的主轴转速。

这就是主轴控制器的用途。他们接受信号或命令以指定的速率打开主轴。主轴控制器将读取运行转速并调整主轴功率以确保其保持编程的主轴速度。

恕我直言,最好让 Grbl 只输出一个信号来确定主轴控制器的主轴速度,这正是您想要的。

非线性速度控制 #905
作者

我在原来的帖子中没有提到我正在使用闭环主轴控制器。S 命令是通过 PWM 给控制器的设定点。S10000 应将主轴 RPM 设置为 10000,并且随着主轴负载的变化,主轴控制器将保持该设定值。

然而; 当我发出 S 命令时,控制器没有达到正确的速度。

由于我能够注入 1.5VI 的直流电压,因此我希望获得 10000 RPM,而我做到了。但是,如果我使用外部信号,来自 grbl 的 pwm,并设置 S10000,我不会得到 10000 rpm,而是 9200 RPM。

可能是主轴控制器中的 PWM 电压转换不准确。我无法更改它,因为它是控制器中的硬件。

然而,我应该能够制作一条校正曲线,允许将校正后的转速发送到控制器。

gcode 读取 S10000,speed_control.c 例程对此进行插值并将 10800 发送到控制器。现在用户要求 10000,控制器正在生产和维护 10000。

你是对的,我只希望 grbl 发出一个确定主轴速度的信号,但我们生活在一个非线性世界中,它远非完美。因此需要曲线。

罗恩

非线性速度控制 #905
成员

@rwensley: 同意。但是创建非线性输出是高度特定于设置的。此外,正如您已经展示的那样,更改主轴控制源代码相对简单。并没有那么复杂。我会保持原样。

喜欢 (0)