Skip to content

Invert VARIABLE_SPINDLE PWM output#246

Open
dingorock wants to merge 1 commit into
gnea:masterfrom
dingorock:invertPWM
Open

Invert VARIABLE_SPINDLE PWM output#246
dingorock wants to merge 1 commit into
gnea:masterfrom
dingorock:invertPWM

Conversation

@dingorock

Copy link
Copy Markdown

Adds the option to invert the duty cycle of the variable speed spindle output pin.
Tested with VFD Controller (Huanyang Invertor Model: HY01D523B)

@Ruisjm1

Ruisjm1 commented Aug 27, 2017

Copy link
Copy Markdown

Is possible star a file on specific line?

@dgarrigop

Copy link
Copy Markdown

It doesn't work for me, no signal on the 11 pin.

@dingorock

Copy link
Copy Markdown
Author

Sorry to hear that. Did you remember to uncomment line 214 in config.h?

// Invert the PWM signal for VARIABLE_SPINDLE
// #define INVERT_SPINDLE_PWM // Disabled by default. Uncomment to enable.

It's disabled by default for the pull request.

Maybe an interaction with some other spindle related setting?

@dgarrigop

Copy link
Copy Markdown

Yes I did, But now I'm trying with the normal code and no pwm signal on D11. Any suggestion?

@dingorock

dingorock commented Sep 25, 2017 via email

Copy link
Copy Markdown
Author

@dgarrigop

Copy link
Copy Markdown

I've tried with 2 different arduinos, both connected to cnc shield and disconnected. Checking the D11 with a tester.

@biasedlogic

Copy link
Copy Markdown

You sure you are on the right pin? The pin changes when you enable PWM

@jahnj0584

jahnj0584 commented Sep 25, 2017 via email

Copy link
Copy Markdown

@dgarrigop

dgarrigop commented Sep 25, 2017

Copy link
Copy Markdown

yeah, I did it, and doesn't work. The only way I can make my Laser work It's to enable USE_SPINDLE_DIR_AS_ENABLE_PIN and plug the laser to the spindle dir pin. (No pwm enabled)

PS: Now PWM is working but no inverting, even uncommenting INVERT_SPINDLE_PWM

@dgarrigop

Copy link
Copy Markdown

Updating: I used a nand on the output and comment out the INVERT_SPINDLE_PWM, eveything works fine now.

@Harvie

Harvie commented Mar 16, 2019

Copy link
Copy Markdown

Why do you need to invert duty cycle? For me it worked uninverted with HY VFD...

@OhmsLawBreaker

Copy link
Copy Markdown

hey,

any more detail on how anyone was able to get this to work? ive tried enabling USE_SPINDLE_DIR_AS_ENABLE_PIN and VARIABLE_SPINDLE with no luck. my laser just stays active on the +Z pin

@JBSchueler

Copy link
Copy Markdown

my laser just stays active on the +Z pin
Why do you connect your laser to +Z?

image
The laser must be connected to pin 11 (Variable Spindle PWM).

@Harvie

Harvie commented Nov 23, 2020

Copy link
Copy Markdown

Now there seems to be quite elegant solution integrating Huanyang RS485 communication directly to GRBL, i would be happy if you can help with testing:
terjeio/grblHAL#68

@oMtQB4

oMtQB4 commented May 4, 2021

Copy link
Copy Markdown

Does not work for me. I added a new pull request (#1040) with a different approach to invert PWM signal.

@semka95

semka95 commented Dec 7, 2021

Copy link
Copy Markdown

This PR does not work for me, I applied it to the latest available commit (bfb67f0). PR #1040 from @oMtQB4 works fine, except in my case laser does not operating at full power, it much weaker than it was before. I tried to fix #1040 version, but I wasn't successful. So I fixed this PR.
I took this code from @oMtQB4 PR:

uint8_t corr_pwm_value;
#ifdef INVERT_SPINDLE_PWM
  corr_pwm_value = 255 - pwm_value;
#else
  corr_pwm_value = pwm_value;
#endif
SPINDLE_OCR_REGISTER = corr_pwm_value; // Set corrected PWM output level.

and replaced SPINDLE_OCR_REGISTER = pwm_value; at the beginning of void spindle_set_speed(uint8_t pwm_value) function.

After this correction everything works perfect, PWM is inverted and laser is operating at full power.
I want to thank everyone involved in this discussion, without your help, I could not get the laser to work.

This is whole code for the function void spindle_set_speed(uint8_t pwm_value)
// Sets spindle speed PWM output and enable pin, if configured. Called by spindle_set_state()
// and stepper ISR. Keep routine small and efficient.
void spindle_set_speed(uint8_t pwm_value)
{
uint8_t corr_pwm_value;
#ifdef INVERT_SPINDLE_PWM
  corr_pwm_value = 255-pwm_value;
#else
  corr_pwm_value = pwm_value;
#endif
SPINDLE_OCR_REGISTER = corr_pwm_value; // Set PWM output level.
#ifdef SPINDLE_ENABLE_OFF_WITH_ZERO_SPEED
  if (pwm_value == SPINDLE_PWM_OFF_VALUE) {
    spindle_stop();
  } else {
    SPINDLE_TCCRA_REGISTER |= (SPINDLE_TCCRA_ENABLE_PWM_MASK); // Ensure PWM output is enabled.
    #ifdef INVERT_SPINDLE_ENABLE_PIN
      SPINDLE_ENABLE_PORT &= ~(1<<SPINDLE_ENABLE_BIT);
    #else
      SPINDLE_ENABLE_PORT |= (1<<SPINDLE_ENABLE_BIT);
    #endif
  }
#else
  if (pwm_value == SPINDLE_PWM_OFF_VALUE) {
    SPINDLE_TCCRA_REGISTER &= ~(SPINDLE_TCCRA_ENABLE_PWM_MASK); // Disable PWM. Output voltage is zero.
  } else {
    SPINDLE_TCCRA_REGISTER |= (SPINDLE_TCCRA_ENABLE_PWM_MASK); // Ensure PWM output is enabled.
  }
#endif
}

@dimanjy

dimanjy commented Dec 20, 2022

Copy link
Copy Markdown

Is there any way to include this PR into GRBL?

@sandmanRO

Copy link
Copy Markdown

Hello @dingorock, just a suggestion... when you turn off the PWM the D11 pin goes low (0V), right? In terms of inverted PWM this is equivalent of 100% duty cycle. Would not be more consistent when turning off the PWM to also set the D11 high, that is, again in terms of inverted PWM equivalent of 0% duty cycle? So the inverted PWM disable code would look like this:

SPINDLE_TCCRA_REGISTER &= ~(SPINDLE_TCCRA_ENABLE_PWM_MASK);
SPINDLE_PWM_PORT |= (1 << SPINDLE_PWM_BIT);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.