开源改变世界

主轴频率控制 #959

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

打开
Georges760 开启了这个问题 2016 年 4 月 16 日 · 4条评论
打开

主轴频率控制#959

Georges760 开启了这个问题 2016 年 4 月 16 日 · 4条评论

注释

主轴频率控制 #959

我打算使用 grbl 来控制电子阀而不是 XY 机械上的激光,以便拥有单喷嘴打印头。

我对 grbl 很陌生,但绝对不是 AVR/Arduino/3Dprinting。

我知道 grbl 的 v0.9 可以在 PWM 模式下处理可变主轴,这非常适合我的需要(因为它控制了液滴大小)。但我还想控制主轴信号频率(不仅是 PWM 比率)。
我需要这个,因为对于按需下降应用程序,我们需要控制每个长度单位的下降数量。我可以使用移动速度参数以固定的下降频率来控制这个“每长度单位的下降数”,但是控制下降频率会更强大,所以 grbl 中的可变主轴频率。

所以我有两个问题:

  • 有没有办法用实际的 grbl 来实现我的目标?还是我需要编写一些更具体的命令?
  • 如果我需要编写这些新的特定命令,你会怎么做?我会做的,但我更愿意先问一个更有经验的人,先走好的路……

如果我必须单独完成,我会在“S”命令中添加一个可选扩展,例如:
S500 100,其中“S500”表示可变主轴 PWM 比率(超过 1000),“100”表示所需的变量主轴频率(仍然需要为此值找到一个有用的单位……)。

我不知道它是否会让其他应用程序的其他人受益,但以防万一我想以正确的方式进行软件进化。

主轴频率控制 #959
贡献者

@Georges760我可以帮忙解决这个问题。
存在一些与主轴 PWM/频率的不同变化相关的问题,因此我将考虑如何最好地满足尽可能多的需求

主轴频率控制 #959
作者
乔治760 评论了 2016 年 4 月 18 日  

查看代码后,PWM 似乎是由 Timer2 在 WGM22 = 0 的快速 PWM 模式下完成的,因此频率由等于 MAX (0xFF) 的 TOP 固定。

实现我的目标的一种方法是保持快速 PWM 模式,但将 WGM22 更改为 1,因此 TOP 值现在是 OCR2A 中的值,这意味着 OCR2A 现在控制频率(不再是 PWM 比率)。在这种模式下,我们需要使用另一个输出比较 OC2B 来获得 PWM 比率,这意味着引脚将从 PB3(OC2A – Arduino D11)变为 PD3(OC2B – Arduino D3),它已经用于 Y_STEP,这是一个硬件兼容性的严重问题…出于类似的原因,您已经不得不在 v0.8 和 v0.9 之间更改此引脚…所以我可以更改原型中的所有这些引脚,但我怀疑它会不会轻松进入主流…

一种更温和的方法是将 Timer2 更改为 Timer1,因此我们受益于 16 位定时器分辨率,并且 OC1B 在实际用于 Y_LIMIT 的 PB2(Arduino D10)上,因此该开关比 Y_STEP 更简单……我可以使用这种方式。

主轴频率控制 #959

我正在使用带有 GRBL 的 RAMPS 1.4 板,这意味着我有很多引脚可用于主轴控制。

我已经设法使代码在引脚 D7(没有连接但没有焊接头引脚)、D9(通过晶体管输出,不是我想要的)和引脚 D12 上工作,但如果我可以让它在 D11 上工作(这是板上的一个辅助引脚,焊有接头)。

问题是我不能让它在 D11 上工作!我设法开始工作的所有引脚都是 OCRxB(分别为 OCR2B、OCR4B 和 OCR1B),引脚 D11 是 OCR1A。这是代码的相关部分:

#define` PWM_MAX_VALUE 65535.0
#define TCCRA_REGISTER    TCCR1A
#define TCCRB_REGISTER    TCCR1B
#define OCR_REGISTER    OCR1B
#define OCR_REGISTER_TOP OCR1A

#define COMB_BIT      COM1B1
#define WAVE0_REGISTER    WGM10
#define WAVE1_REGISTER    WGM11
#define WAVE2_REGISTER    WGM12
#define WAVE3_REGISTER    WGM13

#define SPINDLE_PWM_DDR   DDRB
#define SPINDLE_PWM_PORT    PORTB
#define SPINDLE_PWM_BIT   5 // MEGA2560 Digital Pin 11

#ifdef VARIABLE_SPINDLE

#define SPINDLE_RPM_RANGE (SPINDLE_MAX_RPM-SPINDLE_MIN_RPM)

        TCCRA_REGISTER = (1 << COMB_BIT) | (1 << WAVE1_REGISTER) | (1 << WAVE0_REGISTER);
        TCCRB_REGISTER = (TCCRB_REGISTER & 0b11111000) | (1<<CS11) | (1<<WAVE2_REGISTER)| (1<<WAVE3_REGISTER); // set to 1/8 Prescaler
        OCR_REGISTER_TOP = 0xFFFF; //This is OCR1A

        rpm -= SPINDLE_MIN_RPM;
        if (rpm > SPINDLE_RPM_RANGE) {
            rpm = SPINDLE_RPM_RANGE;
        } // Prevent uint8 overflow
        uint16_t current_pwm = floor(rpm * (PWM_MAX_VALUE / SPINDLE_RPM_RANGE)+0.5); 
        OCR_REGISTER = current_pwm; //This is OCR1B

#else   
        // SPINDLE_ENABLE_PORT |= (1 << SPINDLE_ENABLE_BIT);
        rampsStartSpindle();

#endif

关于如何将引脚 D12 切换到 D11 有什么想法吗?

主轴频率控制 #959

没关系,明白了……将 pwm 模式更改为 14,使 ICR1 位于顶部,并释放 OCR1A 寄存器以使用引脚 D11!

虽然输出在 +-0.06V 波动…我应该实施一些滤波器或平均样本吗?

喜欢 (0)