Contact me: hankecnc@gmail.com

主轴/激光自适应 PWM 的想法 #304

推推 grbl 3年前 (2023-01-21) 251次浏览

关闭
EliteEng 开启了这个问题 2013 年 12 月 17 日 · 7条评论
关闭

主轴/激光自适应 PWM 的想法#304

EliteEng 开启了这个问题 2013 年 12 月 17 日 · 7条评论

注释

主轴/激光自适应 PWM 的想法 #304
贡献者

正如#284中所讨论的,对于当前的实际进给速率,改变主轴/激光器 pwm 的最佳方法是什么

** 这不是实际代码,只是一个想法 **

在 stepper.c 中
,你会向 stepper_t 结构添加一个“float pwm_percent”吗

// these calculations will be done somewhere like st_prep_buffer()
if ( ACCEL or DECEL ) { // check if accelerating or decelerating 
st.pwm_percent = prep.current_speed / prep.maximum_speed;
} else {
st.pwm_percent = 1;
}

然后在“if (st.execute_step)”//可能在 TCCR0B = (1<<CS21) 之后;

// this will be done in realtime and may slow things down.
if (st.pwm_percent < 1) {
spindle_percent(st.pwm_percent);
}

然后在 spindle.c 中检查主轴是否正在运行
然后执行 current_rpm*pwm_percent 计算出新的 rpm。
然后它必须更新 PWM 定时器。

你的想法是什么?
这会减慢很多吗?
有更容易的方法吗?

主轴/激光自适应 PWM 的想法 #304
成员

@el

主轴/激光自适应 PWM 的想法 #304
成员

@EliteEng: 前几天正好在想这个问题。v0.9b 中的新步进算法确实非常有助于以步进速度精确运行主轴(同时提供真正的实时进给率用户反馈)。首先,我不确定实时需要多少 PWM 设置,但如果我们可以将其提炼为 st_prep_buffer() 可以预先计算的单个整数值,那将是最好的。您可以使用 dist_per_tick 变量中的段恒速信息来计算 PWM 调整。因此,当步进算法加载一个新段时,它需要做的就是 ping 主轴代码以(非常)快速更新其计时器。我们在主步进 ISR 中确实有一些余地。不多,但有逻辑检查、整数加法/位移位和内存复制的空间。除此之外,我们无能为力。乘法,尤其是除法,绝对不能在步进 ISR 中进行。他们花了太多时间。

此外,如果您不介意主轴 PWM 仅比步进 ISR 晚 50 毫秒,您可以在添加新段后直接设置 PWM 速度。这确实给准备缓冲区增加了一些复杂性,它太复杂了,但如果将它直接集成到 ISR 中不起作用,它可以简化或允许这样的事情起作用。

尽量使 ISR 中的代码尽可能少,因为我需要我们留下的一些剩余开销。我一直在研究自适应步进分辨率的想法,它会根据步进频率自动调整步进分辨率。基本上,它基于 Smoothieware 使用的概念,但通过实时调整提升了一个档次。因此,较低的步进频率将以较少的可闻噪声移动多个轴,并有望获得更好的性能。它可能会或可能不会出现,但至少会作为编译时构建选项出现。

主轴/激光自适应 PWM 的想法 #304
成员

@EliteEng:另外一件事,如果我们将 PWM 定时器从 16 位 Timer1 更改为 8 位 Timer0 或 Timer2,您会感到困惑吗?我不记得 Timer0 或 Timer2 的硬件 PWM 引脚是什么。我认为其中一个仍在限制销上。

我问是因为我也在试验主步进器 ISR 如何与段缓冲区一起工作以及如何提高性能。v0.9 中新的常量滴答 ISR 可能是也可能不是答案,但我希望在需要时能够使用 Timer1 有一些回旋余地。谢谢!

主轴/激光自适应 PWM 的想法 #304
贡献者作者

@chamnit:如果我们丢失了 z 限位开关(我们将重新获得 Y 限位开关)和作为主轴的步进器,我们可以使用 Timer2(引脚 11)- 没问题

我认为我们应该能够让 st_prep_buffer() 预先计算一个 uint8_t,以便 ISR 设置 Timer2(主轴)的 PWM,这应该足够快,不会干扰其他任何东西。- 这应该不会太复杂。

主轴/激光自适应 PWM 的想法 #304

嗨 EliteEng,
我尝试调整 pin_map.h 文件以在您的代码中从使用 Y 限制更改为 Z 限制 pin,但无法使其工作。
我还应该在其他任何地方进行更改才能使其正常工作吗?

主轴/激光自适应 PWM 的想法 #304
贡献者作者

@Anachronicman我将 Y 和 Z 限位开关都连接到 Z 限位销。

因此,您不必更改 pin_map.h 中的任何内容,只需将 Y 限位开关连接到 Z 限位销即可。
如果您不使用 Z 轴,则需要更改 config.h 以删除 Z Homing

#define HOMING_SEARCH_CYCLE_0 (1<<Z_AXIS)
#define HOMING_SEARCH_CYCLE_1 ((1<<X_AXIS)|(1<<Y_AXIS)) 

#define HOMING_SEARCH_CYCLE_0 ((1<<X_AXIS)|(1<<Y_AXIS)) 
//#define HOMING_SEARCH_CYCLE_1 ((1<<X_AXIS)|(1<<Y_AXIS)) 

我们在 0.9c 中更改了 PWM 以使用 Z Limit Pin 但是@chamnit在每个人开始使用它之前,他想修复一些错误。

如果你想让我看看你的代码,只需发布​​一个指向 repo 的链接。

主轴/激光自适应 PWM 的想法 #304

感谢您提供信息罗布。

0.9c 是否可以下载和测试?

2014 年 2 月 10 日上午 11:45,Rob Brown notifications@github.com写道:

@Anachronicman我将 Y 和 Z 限位开关都连接到 Z 限位销。

因此,您不必更改 pin_map.h 中的任何内容,只需将 Y 限位开关连接到 Z 限位销即可。
如果您不使用 Z 轴,则需要更改 config.h 以删除 Z Homing

#define HOMING_SEARCH_CYCLE_0 (1<<Z_AXIS)
#define HOMING_SEARCH_CYCLE_1 ((1<<X_AXIS)|(1<<Y_AXIS))

#define HOMING_SEARCH_CYCLE_0 ((1<<X_AXIS)|(1<<Y_AXIS))
//#define HOMING_SEARCH_CYCLE_1 ((1<<X_AXIS)|(1<<Y_AXIS))
我们改变了 PWM 以使用 Z 限制引脚在 0.9c 但@chamnit在每个人开始使用它之前,他想修复一些错误。

如果你想让我看看你的代码,只需发布​​一个指向 repo 的链接。


直接回复此电子邮件或在 GitHub 上查看。

喜欢 (0)