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

    Duet3D 1HCL - Closed Loop Controller Beta test

    Scheduled Pinned Locked Moved
    Hardware dev
    20
    209
    19.1k
    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.
    • MaxGyverundefined
      MaxGyver @lirwin17
      last edited by MaxGyver

      @dc42 I replaced my encoder cable with a shielded one (about one meter in length). Now the vibration/noise are gone. EDIT: Nope sry, when I run a calibration maneuver (M569.6 P50.0 V31) the erratic movement of the motor is still present, independent of cable length or shielding.

      BTW. how do I invert the motor direction on the 1HCL, the S variable of M569.1 does nothing for me...

      @lirwin17 The plugin is working now.

      DataChart.PNG
      Closed loop data record.csv

      The motor is holding the position, but the axis is not mooving.

      Cheers Max

      lirwin17undefined 1 Reply Last reply Reply Quote 0
      • TLASundefined
        TLAS @T3P3Tony
        last edited by

        @t3p3tony
        I’m very interested to see where this goes! Great focus are for new board development.

        Are there any plans to release a full Duet 3 version or expansion boards (3 motors) eventually? The build I’m currently working on has 11 motors on it and I’m using a main board and 2 expansion (3 motor) boards to simplify wiring. I’d consider upgrading to closed loop steppers, but 11 daisy-chained boards is a bit much on the wiring and mounting side.

        T3P3Tonyundefined 1 Reply Last reply Reply Quote 0
        • lirwin17undefined
          lirwin17 @MaxGyver
          last edited by

          That's perfect, thankyou @maxgyver

          BTW. how do I invert the motor direction on the 1HCL, the S variable of M569.1 does nothing for me...

          Do you mean in open-loop or closed loop mode? I assume in open loop mode if you haven't managed to get closed loop working yet?
          If that's the case, then the command to use is M569 with the S variable. (Not M569.1 as in your message 😉)

          The motor is holding the position, but the axis is not mooving.

          Ah! I think I know why now! Looking at the data you've sent, the relationship between raw encoder reading and step phase seems to be off.
          The firmware used to require you to specify Pulse Per Revolution (PPR) instead of Count Per Revolution (CPR) (Where PPR = 4 * CPR). However this was changed, and the docs updated. Looking at your data, it looks like the firmware you're using is expecting PPR, whereas the docs have told you to input CPR.
          I'll investigate getting a more recent version of the firmware to you without you having to build it from source yourself, but for now, we can just specify your CPR in PPR:

          From your M569.1 P50.0 S0 T2 C2.5 E10:20 R100 I0 D0, you have a C value of 2.5. This must mean that your original CPR was 2.5*200=500. (Where 200 comes from 360÷1.8, as the datasheet you linked to gives a step angle of 1.8 degrees).

          Knowing that your CPR is 500, your PPR must be 500*4=2000

          So the required value for C is given by 2000 ÷ 200 = 10

          tl;dr: Your M569.1 command should be M569.1 P50.0 T2 C10 E10:20 R100 I0 D0

          Give that a go and let me know how you get on
          If it still doesn't work, please could you send another data file after modifying the C value 🙂

          MaxGyverundefined 1 Reply Last reply Reply Quote 0
          • T3P3Tonyundefined
            T3P3Tony administrators @TLAS
            last edited by

            @tlas Its under consideration but would require a different method in hardware to read the encoders.

            www.duet3d.com

            TLASundefined 1 Reply Last reply Reply Quote 0
            • TLASundefined
              TLAS @T3P3Tony
              last edited by

              @t3p3tony
              Might be a side note here, but could you look into supporting Servo motors as well (and maybe call it the “Duet 4 CNC”). I think there’s a good market capacity there in sales if you have a better integrated CNC solution than something like SmoothStepper. It would mean taking on more development scope, but I know it’s been a growing segment within the existing duet board users. As E3D and others are perusing, it’s looking like a hybrid CNC-Mill and 3D printer combos are the ‘next big thing’ in the 3D printing world.

              Anyway, just a thought. The closed loop capability seems like it’s 70% of the way there anyway.

              1 Reply Last reply Reply Quote -1
              • MaxGyverundefined
                MaxGyver @lirwin17
                last edited by

                @lirwin17 With the new C value the vibration is gone, but now the tuning maneuver reports "incorrect polarity of the driver". In open loop mode, all axes are moving as they should.

                DataChart2.PNG

                lirwin17undefined 1 Reply Last reply Reply Quote 0
                • lirwin17undefined
                  lirwin17 @MaxGyver
                  last edited by

                  @maxgyver okie dokie. Looking at your raw encoder reading (the black line) it seems to be a bit all over the place. I think the next thing to check is that the encoder is doing what we think it should be doing.
                  I think we've both got 500 CPR from the datasheet, but I must admit the wording of it in there is a bit confusing to me:

                  impulse/turn: 500

                  So unless you know any differently, I think it would be good to investigate if the CPR really is 500.

                  Please could you run M122 B50 and then look for the Closed loop enabled: ... line. You should see a position value on there. Take a note of that, then manually move the motor ~1 full revolution (you can should disconnect the motor from the board to be safe from back EMF), then do the same again. This value is in PPR, so we should expect the value to increase by around 2000.

                  For example, my motor has a CPR of 1000 (so a PPR of 4000). When I do this, I get:

                  Closed loop enabled: yes, live status: 0x4, encoder type rotaryQuadrature, pre-error threshold: 10.000000, error threshold: 50.000000, reverse polarity: no, tuning: 0, tuning error: 0x1f, position -13572, raw count = 51964, collecting data: no

                  Closed loop enabled: yes, live status: 0x4, encoder type rotaryQuadrature, pre-error threshold: 10.000000, error threshold: 50.000000, reverse polarity: no, tuning: 0, tuning error: 0x1f, position -9633, raw count = 55903, collecting data: no

                  13572-9633 = 3939 ~= my 4000 PPR
                  [When you do this, we should expect to see ~2000 PPR]

                  MaxGyverundefined 1 Reply Last reply Reply Quote 0
                  • MaxGyverundefined
                    MaxGyver @lirwin17
                    last edited by

                    @lirwin17 This is very strange, after disconnecting the N Pin from the encoder input I get the difference of 2000 for the position value when the motor shaft is turned one revolution. When the N pin is connected, it's around 3(+-1) 🙄

                    Encoder Pulse.PNG

                    T3P3Tonyundefined 1 Reply Last reply Reply Quote 0
                    • T3P3Tonyundefined
                      T3P3Tony administrators @MaxGyver
                      last edited by

                      @maxgyver the index - N or Z pin is not needed right now so i would proceed using the encoders without it.

                      www.duet3d.com

                      MaxGyverundefined 1 Reply Last reply Reply Quote 0
                      • MaxGyverundefined
                        MaxGyver @T3P3Tony
                        last edited by MaxGyver

                        @t3p3tony Okay, this is the data chart with the N-pin disconnected

                        DataChart3.PNG

                        lirwin17undefined 1 Reply Last reply Reply Quote 0
                        • lirwin17undefined
                          lirwin17 @MaxGyver
                          last edited by

                          @maxgyver

                          after disconnecting the N Pin from the encoder input I get the difference of 2000 for the position value when the motor shaft is turned one revolution. When the N pin is connected, it's around 3(+-1)

                          That is very strange 🤔 Yeah, as Tony suggests that pin isn't required at the moment so I'd just leave it disconnected.

                          this is the data chart with the N-pin disconnected

                          That looks a lot better - the step phase is closely tracking the desired step phase. Is it passing tuning now? If not, there is still a fair degree of error between the two lines at points. I've often found I can decrease this error by increasing the motor current. Is your motor current set to the maximum for your motor? If not, try increasing it and see if it brings the step phase/desired step phase closer together.

                          MaxGyverundefined 1 Reply Last reply Reply Quote 0
                          • MaxGyverundefined
                            MaxGyver @lirwin17
                            last edited by

                            @lirwin17 said in Duet3D 1HCL - Closed Loop Controller Beta test:

                            Is it passing tuning now?

                            Yes, it is passing the tuning. Sometimes tuning reports "incorrect polarity of the driver" first and then passes on the second try.

                            Is your motor current set to the maximum for your motor? If not, try increasing it and see if it brings the step phase/desired step phase closer together.

                            Changing the current doesn't make much of a difference.

                            Cheers
                            Max

                            MaxGyverundefined 1 Reply Last reply Reply Quote 0
                            • MaxGyverundefined
                              MaxGyver @MaxGyver
                              last edited by MaxGyver

                              @maxgyver

                              Okay, this is what I have tried so far:

                              • Quadruple checked my wiring, tried different encoder cables (long, short, with and without shielding/grounding.)
                              • Confirmed the CCP/PPR by turning the shaft by hand (motor disconnected) and checking the position results with M122 B50
                              • Disconnected all other CAN-Boards from the printer
                              • Disabled Input shaping
                              • Tried with a second 1HCL board
                              • Tested with a different motor

                              The Step Phase and desired step phase plot is still all over the place.

                              Step phase_desired step phase.png

                              I have tried tuning the motor. But I get stuck at the derivative value that does not really influence the graph.

                              R70 I0 D0
                              R70 I0 D0.png
                              R70 I0 D0.3
                              R70 I0 D0.3.png

                              lirwin17undefined 1 Reply Last reply Reply Quote 0
                              • lirwin17undefined
                                lirwin17 @MaxGyver
                                last edited by

                                Hi @maxgyver ,

                                The Step Phase and desired step phase plot is still all over the place.

                                This graph looks good 👍
                                Step phase basically means the current rotational position of the motor (step phase = current step position * 90 mod 360). As the motor rotates 4 steps, I would expect to see the graph you give - it increases by 360 degrees, but rolls over once due to that mod 360.
                                The main point about step phase is that it roughly follows desired step phase - which it does 🎉

                                But I get stuck at the derivative value that does not really influence the graph.

                                Hmm okay, each setup will have different requirements for the D parameters - especially if an axis is particularly heavy. It might just be that you need to increase the D parameter to see an impact - but you're definitely right to start small to reduce the risk of causing unstable oscillations.
                                If you're worried that the D parameter is having no effect at all, you should be able to toggle on the recording of the PID control variables, so you'll be able to see the actual D value that's being calculated, and the effect it's having on the overall PID control signal. If you find that it is too small, you can increase the D value.
                                But do heed the warning on the tuning page:
                                94d1f7ef-7c9f-4309-966e-e474a22d7683-image.png

                                We've already had some issues with the latest beta firmware being out of date - which I won't rule out causing these issues. As promised, we've just published an 'unofficial' firmware at this dropbox link.
                                Feel free to install this updated firmware and see if it has any effect - but don't forget to undo the multiplication by 4 that we did on your CPR! This updated firmware works as-per the docs, so requires a CPR value for the C parameter 🙂

                                alankilianundefined MaxGyverundefined 2 Replies Last reply Reply Quote 1
                                • alankilianundefined
                                  alankilian @lirwin17
                                  last edited by alankilian

                                  HERE'S an article I wrote (oh, god, 21 years ago) about how to tune a PID system.

                                  It's for DC servo motor with an encoder, but all the theory applies to steppers also.

                                  It looks like you've got EXCELLENT logging and plotting ability, so you should be able to tune fairly well.

                                  As I've said in the past, I'm not sure what people think they are going to get out of closed-loop steppers that they don't get from open-loop steppers other than recovery if you crash your head and miss a bunch of steps.

                                  It is not going to get you better accuracy than open-loop if you are not crashing. In fact, I'd be willing to bet that accuracy goes way down to about 2 or 3 steps even when well tuned. (I'm ready and willing to be proven wrong, this is based on decades of tuning DC servos closed-loop with a lot of different mechanical systems.)

                                  SeemeCNC Rostock Max V3 converted to V3.2 with a Duet2 Ethernet Firmware 3.2 and SE300

                                  1 Reply Last reply Reply Quote 1
                                  • MaxGyverundefined
                                    MaxGyver @lirwin17
                                    last edited by MaxGyver

                                    @lirwin17 said in Duet3D 1HCL - Closed Loop Controller Beta test:

                                    This graph looks good
                                    Step phase basically means the current rotational position of the motor (step phase = current step position * 90 mod 360). As the motor rotates 4 steps, I would expect to see the graph you give - it increases by 360 degrees, but rolls over once due to that mod 360.
                                    The main point about step phase is that it roughly follows desired step phase - which it does

                                    Aaaah okay, that makes sense 🙂

                                    I just installed the latest firmware. The D an I parameter plots are now much more comparable to the one's in the manual, and changes in the parameters can now be seen in the plot. BTW, I often get some parameters as this zigzag lines... 🤷

                                    R75 I0 D0.26
                                    R75 I0 D0.26.png
                                    R75 I2000 D0.26
                                    R75 I2000 D0.26.png

                                    One more Thing:
                                    EDIT: (I wrote mm/s instead of mm/min. Absolute no go, especially if you call yourself an engineer 😬 ) Thank's @T3P3Tony for pointing that out!

                                    I noticed that when I put the motor in closed loop mode the maximum achievable speed is reduced to about 22000mm/min. In open loop mode I run at 36000mm/min easily. 🤔

                                    @alankilian Thank's I will have a look!

                                    Cheers,
                                    Max

                                    lirwin17undefined T3P3Tonyundefined 2 Replies Last reply Reply Quote 0
                                    • lirwin17undefined
                                      lirwin17
                                      last edited by lirwin17

                                      @alankilian

                                      HERE'S an article I wrote (oh, god, 21 years ago) about how to tune a PID system.

                                      Looks like a great article! Thanks for linking it. I might add it to a 'further resources' section on the tuning docs 🙂

                                      It looks like you've got EXCELLENT logging and plotting ability, so you should be able to tune fairly well.

                                      Thankyou 🙇

                                      As I've said in the past, I'm not sure what people think they are going to get out of closed-loop steppers that they don't get from open-loop steppers other than recovery if you crash your head and miss a bunch of steps.

                                      You're definitely right there - but recovery like that can be a big advantage if you're dealing with especially large/costly prints. I used to do some work on a 1m^3 build volume printer that could easily churn through £1000 of filament on a single print. Because the extrusions it laid down were so big, if one was unlucky enough to slightly bend upwards into the path of the head, it could easily cause skipped steps and trash a very expensive print. IMHO Closed loop definitely makes sense as a sort of 'insurance' system in these cases - pay a little more upfront for closed loop motors to avoid the risk of trashing a £1000 print.

                                      But closed loop does also have some other advantages:

                                      • Less power usage, so motors run cooler. Generally when a motor is at a constant speed in closed loop mode (especially when that speed is 0) it will not be running at full current. This is especially pronounced on z-axis motors where 99% of the time the motors can be practically off, and yet they will still hold position if nudged. As opposed to an open loop system running a holding current through them all the time
                                      • You can get higher speeds whilst maintaining accuracy! Hopefully something I might work on in my spare time is seeing just how fast a closed loop drive can run whilst still maintaining accuracy. Watch this space... Having closed loop on all your drives means you can finally answer the question "Just how fast can I run whilst maintaining an accuracy of < x steps"

                                      It is not going to get you better accuracy than open-loop if you are not crashing. In fact, I'd be willing to bet that accuracy goes way down to about 2 or 3 steps even when well tuned. (I'm ready and willing to be proven wrong, this is based on decades of tuning DC servos closed-loop with a lot of different mechanical systems.)

                                      I defer to your decades of experience here, although on my Ender 3 this is the kind of movement profile I get back from a simple 5mm (~25 step) move:

                                      5bc174eb-9a2c-4b8e-9f8b-83d7cfbedea6-image.png

                                      And plotting the error alone:

                                      ddc4cf8e-25fb-489c-9476-f37b1e8af655-image.png

                                      In the roughly 'steady state' section of the move the error very rarely exceeded 0.1 steps (both graph's y axes are in units of steps - my old high school teachers would be yelling at me to label that 😜)
                                      As you would expect the most error comes in the initial transient part as the acceleration increases - we're hopefully looking to eliminate that in the near future with a feed-forward mechanism, that feeds forward the next move into the control algorithm.

                                      Although as we've already said, the target audience for these probably isn't ender 3's so maybe I've made a moot point! Either way I'm really interested to see how it performs on larger axes, and whether your prediction holds true, or if we can maintain this level of performance!

                                      alankilianundefined 1 Reply Last reply Reply Quote 0
                                      • lirwin17undefined
                                        lirwin17 @MaxGyver
                                        last edited by

                                        @maxgyver

                                        I just installed the latest firmware. The D an I parameter plots are now much more comparable to the one's in the manual, and changes in the parameters can now be seen in the plot

                                        Ah excellent! Sorry about that. At least the new firmware is working & out there now.

                                        BTW, I often get some parameters as this zigzag lines...

                                        Hmm yeah... I'll look into this. It looks like sometimes it's just reading back 0 when it should't be. I'm confident this is a issue with the data transmission between the board & DWC though - the closed loop system itself should still be performing well 🙏 I'll get back to you on this 🙂

                                        I noticed that when I put the motor in closed loop mode the maximum achievable speed is reduced to about 22000mm/s. In open loop mode I run at 36000mm/s easily.

                                        I'll definitely look into this - we don't want to be reducing our top speed with closed loop!

                                        1 Reply Last reply Reply Quote 0
                                        • T3P3Tonyundefined
                                          T3P3Tony administrators @MaxGyver
                                          last edited by

                                          @maxgyver said in Duet3D 1HCL - Closed Loop Controller Beta test:

                                          I noticed that when I put the motor in closed loop mode the maximum achievable speed is reduced to about 22000mm/s. In open loop mode I run at 36000mm/s easily.

                                          Can I just double check you mean 36000mm/s and not either 3600mm/s or 36000mm/m ?36000mm/s would be a "F" parameter of F2160000

                                          www.duet3d.com

                                          MaxGyverundefined supertb1undefined 3 Replies Last reply Reply Quote 0
                                          • MaxGyverundefined
                                            MaxGyver @T3P3Tony
                                            last edited by

                                            @lirwin17 Wonderful, thanks a lot for your effort and support!

                                            @t3p3tony said in Duet3D 1HCL - Closed Loop Controller Beta test:

                                            Can I just double check you mean 36000mm/s and not either 3600mm/s or 36000mm/m ?36000mm/s would be a "F" parameter of F2160000

                                            Sry rookie mistake! I did indeed mean mm/min and not mm/s 😬

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