添加对 RC ESC 驱动主轴的支持? #148

推推 grbl 3年前 (2023-01-29) 199次浏览
关闭
xnaron 打开了这个问题 2019 年 5 月 17 日 · 10 条评论
关闭

添加对 RC ESC 驱动主轴的支持?#148

xnaron 打开了这个问题 2019 年 5 月 17 日 · 10 条评论

注释

添加对 RC ESC 驱动主轴的支持? #148

是否可以添加支持以启用 RC ESC 驱动主轴的控制?

添加对 RC ESC 驱动主轴的支持? #148 xnaron 更改标题 添加对RC ESC驱动主轴的支持 添加对 RC ESC 驱动主轴的支持? 2019 年 5 月 17 日
添加对 RC ESC 驱动主轴的支持? #148
所有者

RC ESC(电子速度控制)就像一个业余伺服器一样运行。它是一个 50Hz 的 PWM,脉冲长度从 1ms 到 2ms。

由于主轴已经在 PWM 通道上,我们只需调整 cpu_map.h 中的一些设置即可使其正常工作。

这是一个有效的 cpu_map 示例。只有一个问题。(见文末)

#ifdef CPU_MAP_ESP32_ESC_SPINDLE
	// This is the CPU Map for the ESP32 CNC Controller R2	
	
	  // It is OK to comment out any step and direction pins. This
    // won't affect operation except that there will be no output
		// form the pins. Grbl will virtually move the axis. This could 
		// be handy if you are using a servo, etc. for another axis.
		#define CPU_MAP_NAME "CPU_MAP_ESP32"	
		
		#define X_STEP_PIN      	GPIO_NUM_12
		#define X_DIRECTION_PIN  	GPIO_NUM_26
		#define X_RMT_CHANNEL		0
		
		#define Y_STEP_PIN      	GPIO_NUM_14
		#define Y_DIRECTION_PIN   	GPIO_NUM_25
		#define Y_RMT_CHANNEL		1
		
		#define Z_STEP_PIN      	GPIO_NUM_27		
		#define Z_DIRECTION_PIN   	GPIO_NUM_33 		 
		#define Z_RMT_CHANNEL		2		
		
		// OK to comment out to use pin for other features
		#define STEPPERS_DISABLE_PIN GPIO_NUM_13		
		
		// *** the flood coolant feature code is activated by defining this pins
		// *** Comment it out to use the pin for other features
		#define COOLANT_FLOOD_PIN 	GPIO_NUM_16			
		//#define COOLANT_MIST_PIN   	GPIO_NUM_21
		
		// If SPINDLE_PWM_PIN is commented out, this frees up the pin, but Grbl will still
		// use a virtual spindle. Do not comment out the other parameters for the spindle.
		#define SPINDLE_PWM_PIN    GPIO_NUM_17 
		#define SPINDLE_PWM_CHANNEL 0
		
		// RC ESC Based Spindle 
		// An ESC works like a hobby servo with 50Hz PWM 1ms to 2 ms pulse range		
		#define SPINDLE_PWM_BASE_FREQ 50 // Hz for ESC
		#define SPINDLE_PWM_BIT_PRECISION 16   // 16 bit required for ESC
		#define SPINDLE_PULSE_RES_COUNT 65535
		
		#define ESC_MIN_PULSE_SEC 0.001 // min pulse in seconds (OK to tune this one)
		#define ESC_MAX_PULSE_SEC 0.002 // max pulse in seconds (OK to tune this one)		
		#define ESC_TIME_PER_BIT  ((1.0 / (float)SPINDLE_PWM_BASE_FREQ) / ((float)SPINDLE_PULSE_RES_COUNT) ) // seconds

		#define SPINDLE_PWM_OFF_VALUE    (uint16_t)(SERVO_MIN_PULSE_SEC / SERVO_TIME_PER_BIT) // in timer counts
		#define SPINDLE_PWM_MAX_VALUE    (uint16_t)(SERVO_MAX_PULSE_SEC / SERVO_TIME_PER_BIT) // in timer counts
		
		#ifndef SPINDLE_PWM_MIN_VALUE
				#define SPINDLE_PWM_MIN_VALUE   SPINDLE_PWM_OFF_VALUE   // Must be greater than zero.
		#endif
		
		#define SPINDLE_PWM_RANGE         (SPINDLE_PWM_MAX_VALUE-SPINDLE_PWM_MIN_VALUE)
		
		#define SPINDLE_ENABLE_PIN	GPIO_NUM_22			
		
		// if these spindle function pins are defined, they will be activated in the code
		// comment them out to use the pins for other functions
		//#define SPINDLE_ENABLE_PIN	GPIO_NUM_16
		//#define SPINDLE_DIR_PIN			GPIO_NUM_16		
		
		#define X_LIMIT_PIN      	GPIO_NUM_2  
		#define Y_LIMIT_PIN      	GPIO_NUM_4  
		#define Z_LIMIT_PIN     	GPIO_NUM_15 	
		#define LIMIT_MASK      	B111
		
		#define PROBE_PIN       	GPIO_NUM_32  
		
		#define CONTROL_SAFETY_DOOR_PIN   GPIO_NUM_35  // needs external pullup
		#define CONTROL_RESET_PIN         GPIO_NUM_34  // needs external pullup
		#define CONTROL_FEED_HOLD_PIN     GPIO_NUM_36  // needs external pullup 
		#define CONTROL_CYCLE_START_PIN   GPIO_NUM_39  // needs external pullup    		
		
#endif

唯一的问题是 spindle_stop() 在我认为您需要 1ms 脉冲时有一个硬编码的 0。我不得不将其更改为 SPINDLE_PWM_OFF_VALUE。(见下文)。

void spindle_stop()
{		
  spindle_set_enable(false);
	#ifdef SPINDLE_PWM_PIN
		grbl_analogWrite(SPINDLE_PWM_CHANNEL, SPINDLE_PWM_OFF_VALUE);
	#endif
}
'''

If you can test this, I can create a pull request.
添加对 RC ESC 驱动主轴的支持? #148
作者

它工作但主轴在应该关闭时以低速运行(M3 S0)。我认为这款电调的范围比普通电调更广。我尝试将 ESC_MIN_PULSE_SEC 降低到 0.0007,然后再降低到 0.0002,但都没有用。M3 S1000 大约是主轴全速运转。我尝试将 spindle_set_enable 设置回零库存,但这也不起作用,因为 esc 不会启动。还有其他降低脉冲长度的建议吗?

添加对 RC ESC 驱动主轴的支持? #148

在 RC 伺服上,PWM 不是 50Hz。它是 25 Hz,因为信号是 40 毫秒周期内的 1 到 2 毫秒脉冲。40 毫秒是 25 赫兹。不知道这是否与问题有关,但我知道更快的 PWM 速率会导致伺服器发出嗡嗡声。不知道 ESC 是否相同。

添加对 RC ESC 驱动主轴的支持? #148
所有者

一般来说,模拟舵机的规格是 20ms 或 50Hz。你是对的,它可以有很大的不同。一些数字伺服系统喜欢它的速度要快得多。

你有你正在使用的ESC的链接吗?在低速下,那些较低脉冲长度下的速度是否相同?

添加对 RC ESC 驱动主轴的支持? #148
所有者

我发现了一个错误。我在代码中使用了其他伺服功能的定义值,但忘记重命名它们。这意味着如果您更改默认脉冲长度,代码实际上并没有改变。

将“SERVO”更改为“ESC”,因此这些行在 cpu_map 中看起来像这样。

#define SPINDLE_PWM_OFF_VALUE    (uint16_t)(ESC_MIN_PULSE_SEC / ESC_TIME_PER_BIT) // in timer counts
#define SPINDLE_PWM_MAX_VALUE    (uint16_t)(ESC_MIN_PULSE_SEC / ESC_TIME_PER_BIT) // in timer counts

这里有如此多的逻辑图来表明它现在可以工作。

离开

添加对 RC ESC 驱动主轴的支持? #148

500RPM (50%)

添加对 RC ESC 驱动主轴的支持? #148

1000 转 (100%)

添加对 RC ESC 驱动主轴的支持? #148

此处以 0.0005 秒的最小脉冲关闭

添加对 RC ESC 驱动主轴的支持? #148

添加对 RC ESC 驱动主轴的支持? #148
作者

它没有按我预期的那样工作。我将不得不把逻辑分析仪放在上面,看看我得到了什么。我注意到当我移动 x 轴时信号似乎发生了变化。esc 进入蜂鸣模式,就像信号丢失一样。我想知道您是否可以在移动轴后再次测量来重现。

添加对 RC ESC 驱动主轴的支持? #148
作者
纳龙 评论了 2019 年 5 月 18 日  

`
#define SPINDLE_PWM_BASE_FREQ 50 // ESC 的 Hz
#define SPINDLE_PWM_BIT_PRECISION 16 // ESC 需要 16 位
#define SPINDLE_PULSE_RES_COUNT 65535

#define ESC_MIN_PULSE_SEC 0.0007 // min pulse in seconds (OK to tune this one)
#define ESC_MAX_PULSE_SEC 0.0018 // max pulse in seconds (OK to tune this one)   
#define ESC_TIME_PER_BIT  ((1.0 / (float)SPINDLE_PWM_BASE_FREQ) / ((float)SPINDLE_PULSE_RES_COUNT) ) // seconds

#define SPINDLE_PWM_OFF_VALUE    (uint16_t)(ESC_MIN_PULSE_SEC / ESC_TIME_PER_BIT) // in timer counts
#define SPINDLE_PWM_MAX_VALUE    (uint16_t)(ESC_MIN_PULSE_SEC / ESC_TIME_PER_BIT) // in timer counts

`

添加对 RC ESC 驱动主轴的支持? #148

这就是我所拥有的,现在我无法改变速度它总是看起来像上面的屏幕截图。(尝试使用 M3 S100、M3 S500、M3 S1000 等……信号保持如上

如果我移动一个轴,我会松开 pwm 信号,它看起来像下面这样(例如:点动 x 轴超过 1mm)

添加对 RC ESC 驱动主轴的支持? #148

$0=3 $1=255 $2=0 $3=0 $4=0 $5=0 $6=0 $10=3 $11=0.010 $12=0.002 $13=0 $20=0 $21=1 $22=1 $23=0 $24=25.000 $25=1000.000 $26=250 $27=1.000 $30=10000.000 $31=0.000 $32=0 $100=160.700 $101=160.700 $102=100.000 $110=8000.000 $111=8000.000 $112=500.000 $120=500.000 $121=500.000 $122=200.000 $130=170.000 $131=260.000 $132=20.000

添加对 RC ESC 驱动主轴的支持? #148
所有者

我发现了两个问题。

  1. 将 cpu_map.h 中的这些行更改为以下代码。
#define SPINDLE_PWM_OFF_VALUE    (uint16_t)(ESC_MIN_PULSE_SEC / ESC_TIME_PER_BIT) // in timer counts
#define SPINDLE_PWM_MAX_VALUE    (uint16_t)(ESC_MAX_PULSE_SEC / ESC_TIME_PER_BIT) // in timer counts
  1. Grbl 具有激光功率(使用主轴 PWM)补偿速度的激光模式。我认为当它不处于激光模式时,它会在移动过程中做出一些改变。确保 $32=0。

围绕主轴速度调整检查激光模式(stepper.cpp 中的第 258 行)

if (st_prep_block->is_pwm_rate_adjusted) {
    spindle_set_speed(st.exec_segment->spindle_pwm);
}

这可能与 0 速度不在 0 负荷有关。

感谢您对此问题的耐心等待。你能告诉我你用的电调和电机吗?我想找一个帮我测试。(也许建造一台 PCB 机器)

添加对 RC ESC 驱动主轴的支持? #148
作者

通过上述更改,它现在可以完美运行。ESC 是我大约 8 年前从 Hobbyking 购买的(见图)。我已经用四轴飞行器的自定义固件刷新了它。它需要 700us 到 ~1800us 之间的脉冲长度。您上面的代码运行良好,现在激光模式检查已经到位,没有问题。电机是我手头上的另一台用于四轴飞行器的电机。它也很旧。当我平衡它们时,我把它们的标签都去掉了。PCBEater 电机的规格是 KV 额定值介于 900 至 1200KV 之间,尺寸为 28mm 或更小直径和约 28mm 高。电机应该有一个约 3mm 的轴,从最靠近电线的一侧伸出(见图)。我正在寻找电机的来源,一旦找到就会发布。

再次感谢您如此迅速地进行更改。

添加对 RC ESC 驱动主轴的支持? #148

添加对 RC ESC 驱动主轴的支持? #148

添加对 RC ESC 驱动主轴的支持? #148
所有者

太棒了。