• Tags
  • Documentation
  • Order
  • Register
  • Login
Duet3D Logo Duet3D
  • Tags
  • Documentation
  • Order
  • Register
  • Login

Duet Integration with an "AskPower A131" VFD

Scheduled Pinned Locked Moved
CNC
3
7
1.4k
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • undefined
    cjm
    last edited by cjm 5 Apr 2021, 20:36 21 Nov 2020, 20:06

    In case they're useful for people, here are notes regarding integration of a Duet 2 with a low cost 1.5KW air cooled spindle from Ebay, controlled by an “AskPower A131” variable frequency drive (VFD) inverter.

    Warning
    Wiring up a VFD involves high, potentially lethal, voltages and shouldn't be undertaken without appropriate knowledge and experience.

    1 VFD Mains Wiring
    The VFD was connected to 240V mains power via a switch and fuse (13A) using the L and N terminals in accordance with this diagram:
    A131 Wiring Figure.png

    2 Duet to VFD Interface
    To enable the speed and direction of the spindle to be controlled by the Duet, a simple interface was built on matrix-board using parts to hand. The schematic is as follows:
    Duet to VFD Interface Schematic.png
    Opto-isolators U1 to U4 electrically isolated the VFD controller from the Duet to avoid ground loops and reduce the risk of damage to the Duet board in the event of a fault/breakdown in the VFD. In addition, they provide the necessary level shifting from the 3.3V logic levels provided by the Duet.

    Emergency Stop is provided by a normally closed button on the control pendant. In normal operation, this switch holds the Duet Emergency Stop Input low and LED in U1 is held off via D1.
    When the Emergency Stop button is pressed, the switch contacts open, applying current to the LED in U1 via R3. This asserts the VFD_RESET line to rapidly stop the spindle. In addition, D1 allows R2 to pull an Emergency_Stop input to the Duet high, so it can pull the spindle up in the Z axis and halt the CNC X-Y stepper motors.

    The Spindle_Run and Spindle_Dir signals control the spindle ON/OFF state and direction of rotation and drive the VFD's VFD_RUN and VFD_DIR inputs via U2 and U3 respectively.

    Light emitting diodes DS1 through DS3 indicate the status of the VFD_RESET, VFD_RUN and VFD_DIR inputs and provided useful for test purposes.

    The Spindle_PWM signal from the Duet is passed through U4. R10 and R11 act to limit the PWM signal generated by U4 to an amplitude of 10V, as required by the VFD. The PWM signal is passed through a second order low pass filter formed by R12, R13, C3 and C4 and a unity gain buffer (U5) to drive the VFD_Speed input. A linearity error of around 4% at 5.0V output was measured. This gives a spindle speed of around 12,480 rpm for a 12,000 rpm setting, which was felt to be OK for now. Ideally, the VFD’s frequency output signal would be used to reduce this error.

    It may be noted that this circuit is generic and could be used with other VFD such as the HuanYang units.

    Duet 2 Connections
    The interface board was connected to the Duet 2 expansion connector using the following pins:

    Duet Connections.png

    VFD Connections
    The interface board was wired to the VFD as shown in the photo below. Note that the brown and red wires are both wired to the 12V OUT terminal and the blue and black wires are both wired to the GND terminal.
    VFD Wiring.png

    VFD Configuration
    To enable external control, the VFD must be configured using its control panel.
    VFD Control Panel.png
    The basic method is as follows:
    a) Ensure the VFD is powered and the Spindle is stopped.
    b) Press SET to put the VFD into the “Parameter Set” mode.
    c) Press the up/down buttons to choose the parameter to be adjusted.
    d) Press the SET button again to select the chosen parameter.
    e) Press the up/down and left/right buttons to adjust the parameter value to the desired setting. The left/right buttons are used to select which digit of the numeric value is to be changed and the up/down buttons enable the value of the digit to be incremented or decremented. Holding down Up or Down will cause the selected digit to scroll through the values 0 to 9.
    f) Once the value has been set correctly, press SET to store the new value. Alternatively, press STOP to cancel the operation.

    Using this approach the following parameter values were configured, with all others left at their default values:
    98ac5e62-2a36-42bd-9445-fca35e383eda-image.png

    Duet Firmware Configuration
    The following settings were used for the Firmware Version 3.2 Beta to take advantage of the new CNC spindle control options. However, the settings used for previous versions are included for reference, but commented out.

    ; Tools
    M563 S"Spindle" P0 D0 H		        ; Define Tool 0 (our Spindle)
    G10 P0 X0 Y0 Z0			        ; Set tool 0 axis offsets
    G10 P0 R0 S0				; Set initial tool 0 active and standby temperatures to 0C
    
    ; CNC Emergency Stop
    M950 J0 C"exp.e2stop"			; Define exp.e2stop as P0 to use as an emergency stop input
    M581 P0 T0 S1 R0			; emergency stop (T0) when P0 (E0 end stop) edge occurs
    
    ; CNC Mode (Updated for Firmware 3.2)
    M453 C"exp.13+exp.8+exp.14" Q1000 R24000 T0	; CNC Mode, PWM frequency 1KHz, max rpm = 24K 
    						; spindle speed PWM pin 	: exp.13  
                                                    ; spindle run pin 		: exp.8
                                                    ; spindle direction pin 	: exp.14
    
    ; CNC Mode (Pre Firmware 3.2)
    ; M950 P1 C"exp.8"			; use pin 8 on the expansion connector as the VFD enable pin
                                            ; M42 P1 S1.0 ; to turn the spindle on 
    					; M42 P1 S0.0 ; to turn the spindle off
    ; M453 C"exp.13" F1000 R24000     	; spindle speed PWM control using exp.13 pin, 
                                            ; PWM frequency 1KHz, max rpm = 24K
     
    

    Update for Firmware version 3.3RC1

    ; Configure Tool 0 as the CNC Spindle (Firmware 3.3RC1)
    M950 R0 C"exp.13+exp.8+exp.14" Q2000 L500:26200   ; Create spindle index 0, PWM frequency 2KHz, 
                                                      ; Lmin:max rpm = tweaked to match actual to target spindle RPM on 
                                                      ; and the following connections:
                                                      ; spindle speed PWM pin	: exp.13 
                                                      ; spindle run pin 		: exp.8
                                                      ; spindle direction pin 	: exp.14
    M563 P0 R0 S"Spindle"                             ; Create Tool 0 with Spindle 0 and call it Spindle 
    G10  P0 X0 Y0 Z0                                  ; Set Tool 0 axis offsets
    M568 P0 F0					  ; Set Tool 0 to default RPM of 0
    T0						  ; Select Tool 0 (or make sure generated by CAM)
    
    ; CNC Emergency Stop
    M950 J0 C"exp.4"                   ; Define exp.4 as P0 to use as an emergency stop input
    M581 P0 T0 S1 R0                   ; emergency stop  (T0) when P0 (E0 end stop) edge occurs
    
    ; CNC Mode (Firmware 3.3RC1)
    M453    
    
    

    Hope this helps someone!

    undefined undefined 2 Replies Last reply 26 Jan 2021, 18:08 Reply Quote 1
    • undefined
      misan @cjm
      last edited by 26 Jan 2021, 18:08

      @cjm That definitely helps a lot, thanks.

      May I presume M3/M4/M5 will then work (being able to set the spindle speed with S<speed> modifier too)?

      undefined 1 Reply Last reply 26 Jan 2021, 19:26 Reply Quote 0
      • undefined
        cjm @misan
        last edited by 26 Jan 2021, 19:26

        @misan Yes, using the S parameter with M3,M4 sets the spindle speed. M5 just stops the spindle so doesn’t use the speed parameter.

        Glad to hear the notes have been of help.

        1 Reply Last reply Reply Quote 0
        • undefined
          cjm @cjm
          last edited by cjm 9 May 2021, 19:54

          @cjm
          Update to add VFD spindle feedback

          The AskPower provides a signal, labelled “Fout 5V”, that can be filtered to generate a voltage that is proportional to spindle speed. One way of getting this data into a Duet is to use an Arduino (e.g. mini pro) to convert this signal (called VFD_FREQ in this schematic) into a frequency that can be fed back to the Duet via an opto-isolator as illustrated below.

          43815962-42f5-4d15-bb8f-2a0d026e7d9e-image.png

          By connecting the opto-isolated square wave to pin exp.pb6 and configuring Fan 0 as below, the spindle rpm can be read as fan rpm using the Duet.

          ; Fans
          M950 F0 C"!fan0+^exp.pb6" Q1000 					; Fan 0 uses the Fan0 output. inverted for PWM, and PB6 as a tacho input with pullup resistor enabled
          
          

          An arduino script to do the voltage to frequency conversion is:

          //  VFD_Sketch_0.03
          //
          //  License: GPL-3.0
          //
          //  Helpful reference: https://playground.arduino.cc/Code/FastPWM/
          //
          //  Sketch to measure a 0 to 5.0V VFD frequency output and generate a 
          //  tacho pulse whose frequency is proportional to the spindle RPM.
          //
          //  The VFD frequency output range is 0 -> 5.0V.
          //  Using the 16MHz/5V version of the Mini Pro this will
          //  deliver an ADC range of 1024 LSB (i.e. 0->1023)
          //
          //  Revs per Second (RPS) = 400 * adcValue_lsb / 1024 
          //
          //  Using Timer2 and with F_CPU = Arduino CPU frequency 
          //
          //  timerClock = F_CPU / (2 * prescaler)
          //  frequency = timerClock / (OCR1A + 1)
          //
          // So:
          //  400 * adcValue_lsb / 1024 = F_CPU / (2 * prescalar * (OCR1A + 1))
          //
          //  and:
          //  [prescaler * (OCR1A + 1)] = (F_CPU * 1024 / (2 * 400))/ adcValue_lsb
          //  
          // Product [prescaler * (OCR1A + 1)] is the required period expressed as a  
          // number of F_CLK clock cycles  
          
          
          float const calibrationFactor = 399.129F/400.0F;  //(adjust as necessary)
          float const timerScale = calibrationFactor * (F_CPU / 800.0) * 1024.0;   
          float adcFilter = 0.05;
          float adcFilter_flsb; 
          
          void setup() 
          {
           // initialize pin 9 as an output (driven by timer 2).
           pinMode(9, OUTPUT);
          
           //Configure Timer 2 for fast PWM mode, 10bit resolution
           TCCR1A = _BV(COM1A0) | _BV(WGM11) | _BV(WGM10); 
          
           //Serial for debug
           Serial.begin(9600);
           Serial.print("F_CPU=");
           Serial.println(F_CPU);  
          }
          
          // the loop function runs over and over again forever
          void loop() 
          {
            
           // read and filter the input on analog pin A3 (adding 1 to avoid division by zero later)
           float adcValue_lsb = analogRead(A3)+1.0;    
           adcFilter_flsb = adcValue_lsb * adcFilter + adcFilter_flsb * (1.0 - adcFilter);
           
           //Calculate the required period in F_CLK clock cycles
           float period_clk = timerScale / adcFilter_flsb;
          
          //Kludge: divide the period by 2 because the Duet expects 2 fan tacho pulses per rev:
          // Comment this out for frequency = RPM 
           period_clk =  period_clk /2;
          
           //Determine the prescaler
           long prescaler = (period_clk / 65536);
           if(prescaler == 0)      // prescaler -> 1
           {  
               TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); 
               prescaler = 1;
           }
           else if(prescaler <8)   // prescaler -> 8
           {
               TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS11); 
               prescaler = 8;
           }
           else if(prescaler <= 64) // prescaler -> 64
           {
               TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS11) | _BV(CS10); 
               prescaler = 64;
           }
           else if(prescaler <= 256)  //prescaler -> 256
           {
               TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS12); 
               prescaler = 256;
           }      
           else 
           {
               TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS12) | _BV(CS10); 
               prescaler=1024;
           }
          
           //set timer2 period
           OCR1A = (period_clk / prescaler) - 1;
          
           delay(1);  
          }
          

          Hopefully at some point there'll be a firmware update to display the actual spindle speed....

          1 Reply Last reply Reply Quote 2
          • undefined
            cjm
            last edited by cjm 17 Aug 2021, 19:43

            The following macro uses some conditional G-code and spindle RPM feedback via the Fan[0].RPM pin to wait for the spindle to spin up to speed after running an M3/M4 command:

            ; WaitForSpindle.g
            
            ; If the spindle is stopped or not configured then break
            if {spindles[0].state == "stopped"} || {spindles[0].state == "unconfigured"}
            	break;
            
            ; initial delay to allow the VFD to start the spindle
            G4 S2
            
            var reached_speed = false;
            while var.reached_speed == false	
            	var old_rpm = fans[0].rpm
            	G4 S1
            	var delta = {fans[0].rpm - var.old_rpm}
            	set var.delta = {abs(var.delta)}
            	if var.delta < 5
            		set var.reached_speed = true
            	if iterations > 30
            		break;
            		
            echo "Spindle rpm reached" 
            
            CNCModellerundefined 1 Reply Last reply 30 Oct 2021, 13:51 Reply Quote 3
            • CNCModellerundefined
              CNCModeller @cjm
              last edited by 30 Oct 2021, 13:51

              @cjm from what I've read could I just use an optical end stop connected to the fan header and a single pulse encoder wheel mounted on the spindle shaft?

              Just started looking into a conversion for my mill / lathe and the current motor controllers don't have a speed feedback output.

              Any thoughts would be much appreciated.

              Cheers
              Barry M

              @cjm said in Duet Integration with an "AskPower A131" VFD:

              The following macro uses some conditional G-code and spindle RPM feedback via the Fan[0].RPM pin to wait for the spindle to spin up to speed after running an M3/M4 command:

              ; WaitForSpindle.g
              
              ; If the spindle is stopped or not configured then break
              if {spindles[0].state == "stopped"} || {spindles[0].state == "unconfigured"}
              	break;
              
              ; initial delay to allow the VFD to start the spindle
              G4 S2
              
              var reached_speed = false;
              while var.reached_speed == false	
              	var old_rpm = fans[0].rpm
              	G4 S1
              	var delta = {fans[0].rpm - var.old_rpm}
              	set var.delta = {abs(var.delta)}
              	if var.delta < 5
              		set var.reached_speed = true
              	if iterations > 30
              		break;
              		
              echo "Spindle rpm reached" 
              

              Polar Duet3 Mini + 1HCL
              https://youtube.com/playlist?list=PLWjZVEdMv1BY82izahK45qKh-hp3NFkix
              Wanhao D4S: Duet2
              https://forum.duet3d.com/post/296755
              K40 Laser, Duet2
              https://forum.duet3d.com/post/312082
              Wanhao D5S
              https://www.youtube.com/CNCModellerUK

              undefined 1 Reply Last reply 30 Oct 2021, 17:02 Reply Quote 0
              • undefined
                cjm @CNCModeller
                last edited by cjm 30 Oct 2021, 17:02

                @cncmodeller
                I think it’s definitely worth trying and I’d be interested to hear the outcome as it would give a direct measurement of spindle RPM.

                However, from what I’ve seen, I believe the Duet fan rpm input expects two pulses per revolution, so perhaps try a two pulse encoder wheel?

                A point to check is whether the optical end stop has any electrical filtering, as this might need to be adjusted to avoid limiting the maximum rpm that can be measured.

                1 Reply Last reply Reply Quote 0
                • First post
                  Last post
                Unless otherwise noted, all forum content is licensed under CC-BY-SA