Jump to content
OMRON Forums

hannsx

Members
  • Posts

    102
  • Joined

  • Last visited

Posts posted by hannsx

  1. Hi, I am operating a PowerBrickLV with 5/15A axes. My problem is, that the phase searching with the stepper routine does not work reliably. How is it, that it works some times and not the other. My fix is too manually phase the motor. However then I experience another problem. The sense of direction for commutating changes randomly it seems. So I have to check if it runs, and if not I change the sign on the parameters Motor[x].Pwmsf and Motor[x].PhaseOffset. How is that possible? I would think that the direction sense for commutating is given by the hardware and could not change.... Is that correct or a bug?

     

    [EDIT]

    -->Solution: Swapping two motor leads.

    [EDIT]

  2. Hi, I am operating a PowerBrickLV with 5/15A. We now have a machine including a brushless motor with a continuous current of 8.7A and only 0.75Nm/A. Unfortunately there is high friction on the bearing because it has to be very stiff. Therefore the PowerBrickLV can't provide the required current to drive that motor.

    We wondered if it was possiblel to combine two channels to get get more current for the motor. I guess that is a stupid question. The 5A maximum of the PowerBrickLV is really just under the current that is needed to drive the motor. We would get around with 6A. Is it thinkable to push the limit of the continuous current to 6A? Or is that the certain death of the PowerBrickLV?

    Best regards,

    hannsx

  3. If you are using the current loop feedback gains that you posted in another thread, these gains are at least an order of magnitude higher than is typical. This could easily result in repeated overcorrection causing the high frequency oscillation you see.

     

    I experimented with different settings. I got the best results with very low gains. finally I set the integral gain to 0, the forward gain to 1 or less and the backward gain to either 0 or 1. At the moment we cannot test the galil motion controllers we operated in the past because they have some problems. Furthermore my boss believes it is due to vibrations and does not want to put more time into this. Also we won't repair the galils. So right now I can't say that the galil performes better on our setup. We were using the galil dmc4080. It has approximately the same current specs and resolution as our PowerBrickLV so there is no reason why there should be any difference in the performance. If I gain any new insight into this I will post it. I guess the resolution of the adc input and the dac amplifier is crucial. I already saw that when I switched from the 33.85A max gain Channel to the 6.77A max gain Channel. It would be interesting to see how much better it gets if I can further increase it.

     

    I have to walk back a little on my comment. I now am working with a voice coil motor on another setup. I deviates max +/-3nm from its position. I consider this to be super preicse under the conditions I operate it. Actually I would also be satisfied with that under best conditions. And I even achieve that on the 33.85A channel. On the 6.77A Channel, I can drive the voice smoother and it does not get into resonant oscillations that as quick. So I guess the problem on the other setup is of a mechanical kind, e.g. no stable and calm support for the motors. I achieved the greatest improvements by tuning the current loop to a soft response.

  4. If you are using the current loop feedback gains that you posted in another thread, these gains are at least an order of magnitude higher than is typical. This could easily result in repeated overcorrection causing the high frequency oscillation you see.

     

    I experimented with different settings. I got the best results with very low gains. finally I set the integral gain to 0, the forward gain to 1 or less and the backward gain to either 0 or 1. At the moment we cannot test the galil motion controllers we operated in the past because they have some problems. Furthermore my boss believes it is due to vibrations and does not want to put more time into this. Also we won't repair the galils. So right now I can't say that the galil performes better on our setup. We were using the galil dmc4080. It has approximately the same current specs and resolution as our PowerBrickLV so there is no reason why there should be any difference in the performance. If I gain any new insight into this I will post it. I guess the resolution of the adc input and the dac amplifier is crucial. I already saw that when I switched from the 33.85A max gain Channel to the 6.77A max gain Channel. It would be interesting to see how much better it gets if I can further increase it.

  5. It looks like, if the motor worked in counts you should have the right information in your post (as long as ki is not scaled) to use it with the scale factor.

     

    Can you share the project?

     

    Yes, of course. I cannot attach it as a zip-file. What kind of files can I attach? I would not want to attach each file byitself.

  6. I believe this line is a mistake, the integral gain does not need to be scaled.

    Motor[4].Servo.Ki = 0.0015 / Mtr4ScaleFactor

     

    Are you using Motor[4].Servo.Kvff or Motor[4].Servo.Kaff?

     

     

    Thank you for your tip, but it did not improve the performance. Before I thought I had to scale all parameters, I did not examine the Servo-Block-Diagram for it. I do not use either Kvff or Kaff.

  7. I tried that now and I do not get the same Performance when I scale the motor units. I guess there is an error in the way I scale the parameters. This is my setup code. Let me know if you see any errors or flaws in it.

     

    // ULT127-A-45-A-N-001

    /////////////////////////////////////////////////////////////////////////////////

    // Motor[4] // Brushless-Motor 9,440,000 cts/rev / 12 pole pairs ///////

    /////////////////////////////////////////////////////////////////////////////////

    Motor[4].pLimits = 0

    Motor[4].LimitBits = 9

    Motor[4].AdcMask = $FFFC0000

    Motor[4].AmpFaultLevel = 1

    Motor[4].PhaseCtrl = 4

    Motor[4].PhaseOffset = 683

    Motor[4].PwmSf = 0.95 * 16384

    Motor[4].PosSf = 360/9440000

    Motor[4].Pos2Sf = 360/9440000

    global Mtr4ScaleFactor = Motor[4].PosSf

     

    // Einstellungen fuer die Kommutierung

    Motor[4].pPhaseEnc=PowerBrick[0].Chan[3].PhaseCapt.a

    Motor[4].PhaseEncLeftshift = 0

    Motor[4].PhaseEncRightshift = 0

    Motor[4].PhasePosSf = 2048 / ( Mtr4CtsPerCommCycle * 256 )

    PowerBrick[0].Chan[3].EncCtrl = 3

    Motor[4].pAmpFault = PowerBrick[0].Chan[3].Status.a

    Motor[4].MaxDac = Ch4PeakCur * 28378 / Ch4MaxAdc

    Motor[4].I2tSet = Ch4ContCur * 28378 / Ch4MaxAdc

    Motor[4].I2tTrip = ( pow(Motor[4].MaxDac,2) - pow(Motor[4].I2TSet,2) ) * Ch4TimeAtPeak

    Motor[4].PhaseFindingDac = Motor[4].I2TSet / 2

    Motor[4].PhaseFindingTime = Mtr4PhasingTime * 5

    Motor[4].AbsPhasePosOffset = 2048 / 12000

     

    Motor[4].IiGain = 3.2463031

    Motor[4].IpfGain = 0

    Motor[4].IpbGain = 46.935429

    Motor[4].Servo.Kp = 1.8 / Mtr4ScaleFactor

    Motor[4].Servo.Kvfb = 150 / Mtr4ScaleFactor

    Motor[4].Servo.Ki = 0.0015 / Mtr4ScaleFactor

     

    // Here I transform the values which I set in [sec] in the settings file

    Motor[4].jogspeed= ( Mtr4JogSpeed * Mtr4ScaleFactor ) / ( 1000 )

    Motor[4].JogTa= -( ( 1000 * 1000 ) / ( Mtr4Accel * Mtr4ScaleFactor ) )

    Motor[4].JogTs= -( (1000 * 1000 * 1000) / ( Mtr4Jerk * Mtr4ScaleFactor ) )

     

    Motor[4].MaxSpeed= ( Mtr4MaxJogSpeed * Mtr4ScaleFactor ) / 1000

    Motor[4].InvAmax= ( 1000 * 1000 ) / ( Mtr4MaxAccel * Mtr4ScaleFactor )

    Motor[4].InvDmax= ( 1000 * 1000 ) / ( Mtr4MaxAccel * Mtr4ScaleFactor )

    Motor[4].InvJmax= ( 1000 * 1000 * 1000 ) / ( Mtr4MaxJerk * Mtr4ScaleFactor )

     

    Motor[4].HomeVel = Motor[4].JogSpeed

     

    Motor[4].WarnFeLimit=40000 * Mtr4ScaleFactor

    Motor[4].FatalFeLimit=80000 * Mtr4ScaleFactor

    Motor[4].FeFatal=1

    Motor[4].Servo.MaxPosErr=40000 * Mtr4ScaleFactor

    Motor[4].Servo.MaxInt=40000 * Mtr4ScaleFactor

    Motor[4].InPosBand= 0.5 * Mtr4ScaleFactor

    Motor[4].Servo.BreakPosErr = 0 * Mtr4ScaleFactor

    Motor[4].Servo.Kbreak = 0

    motor[4].servo.swzvint=0

  8. Please post the graph of your current loop tuning. If there are problems in the current loop it can cause problems in the position loop.

     

    I experimented with the tuning of the current loop and got the best results when I tuned it very smooth and slow. That is shown the first picture.

     

    I also took a looked at the motion of the motor when it is in rest. It looks almost the same as the following error I have, when it is in closed loop. It is shown in the second picture.

    CurrentLoop_StepResponse.thumb.png.6f4a793ad73f7d3f6b383c1e02831afd.png

    RestingMotion.thumb.png.415d530a082fca2d9bc9eb2f295fe418.png

  9. When you are trying to control to the nanometer level, there are all sorts of factors that can cause multiple nanometers of transient errors, both mechanical and electrical. A good control loop can minimize the magnitude of the resulting errors, but never eliminate them completely. It is worth the effort to try to identify the sources of these disturbances.

     

    With a crude peak-counting "Fourier transform" of your plots, I think I see significant 15 Hz and 120 Hz components to your errors. (If you were in North America using 60 Hz power, I would be recommending you look at power line issues, but I expect you are using 50 Hz power -- correct?) With less confidence, I think I see an ~2000 Hz component to your errors.

     

    Mechanically, you want to be sure you do a very good job on the vibration isolation of your stage. When we test nanometer-level control, we often do the job at 5:30am, before the HVAC comes on in the building and before trucks start going by.

     

    Electrically, you want to do the best job you can to prevent electromagnetic noise from getting to your feedback sensor. Putting chokes on the cable to the VCM is highly recommended to reduce switching noise. (Many people use linearly modulated amplifiers for nanometer-level control for this reason.) Careful shielding and grounding of your cables is very important as well.

     

    If there are distinct spectral components to your errors, as I think I see, and you cannot eliminate the source of them, you can try "notch" (band-reject) filters in the servo loop. For the higher frequency components, a low-pass filter in the servo loop (with a few hundred Hz break point) can help.

     

    The electromagnetic noise issue certainly is a possible problem in my prototype setup and wiring. You guessed right, I am located in Germany, Hamburg.

  10. Hi,

    I now am able to test the voice coil motor again and I have only been partly successive. Though I managed to get the precision up to +/- 10nm, I want to get it to +/- 1nm, just as the other Motors which I only are precise to +/-1 encoder unit.

    I attached the step responses I got while tuning it. When I zoom in on the following error I see these oscillations which the control semmingly isn't able to flatten out. I wonder why that is. Does this type of behaviour point to any problem you know of? I can also post my setup-files if that would be of any use,

    best regards,

    hannsx

    StepResponse.thumb.png.611c283bb6c20a9d07230ef3db6e9c23.png

    StepResponse_Detail01.thumb.png.585ad9f1947bdfd97fddf85fa3f8d9c4.png

    StepResponse_Detail02.thumb.png.dccd3206a9535e7090e13dd57ca0e0e9.png

  11. Ok, thank you for this guideline. This way I can make sure everything works as expected. I thought it might be a good Idea to have each channel operating only at its required phase frequency because of CPU load. But maybe that is negligible and just makes the settings unnecessarily prone to errors.
  12. I don't see what you are trying to accomplish by setting a lower hardware phase clock frequency in the second ASIC. (Your setting would divide by 8, not by 2!)

     

    The phase clock frequency set by the first ASIC (Gate3[0]) interrupts the CPU to tell it to start the software phase tasks, including any phase commutation and current loop. It will do these tasks for all of the motors, even those that use the second ASIC (Gate3[1]). If Gate3[1] is using a lower phase clock frequency internally, multiple software phase cycles will use the same data from the ASIC.

     

    I would first just try using a 20kHz phase, 20kHz servo, and 20kHz or 30kHz PWM for your voice coil motors and see if you get the performance you need. Then you can decide if you need to somehow use other settings for standard actuators (if any).

     

    Ok, that is a good point. So do I understand it right, that if I use Gate3[1].ServoClockMult, in case I wanted to have a higher phase-frequency, that does not increase the frequency at which the CPU calculates the phase commutation and the current loop too? Are these operations always based on the phase-frequency of the master IC?

  13. Both the scale factors PosSf and Pos2Sf, and the gain terms are simple multiplications. For example, if you have Pos2Sf=1.0 and Kvfb=400, if you change Pos2Sf to 0.001 and Kvfb to 400,000, you will get the same result.

     

    The double-precision (64-bit) floating-point math used here has so much resolution and range that there are no numerical issues in doing this type of change.

     

    Ok, thanks - that should make it a lot easier.

  14. I tried to tune the motors In scaled units. From earlier experiments I learned that the scaling of the servo-parameters is not always inverse to the scaling. But maybe it was because of my bad tuning. So do the equations give an exact inverse relationship between PosSf, Pos2Sf and the servo - parameters? I did not expect that because the equations usually turns into one with the servo-parameters showing up in the nominator and denominator and maybe not in a linear way.
  15. You are correct that there is a single phase clock frequency and a single servo clock frequency for the entire system. These signals interrupt the processor to start the phase task and servo task updates for all of the motors.

     

    But each motor channel on a Power Brick LV can be set to its own PWM frequency. fPWM can be set to fPhase * (N+1)/2, with N (Gate3.Chan[j].PwmFreqMult) having a range of 0 to 7.

     

    For a very high-response actuator such as a voice coil motor, we recommend high servo clock frequency (for the position/velocity loop), phase clock frequency (for the current loop), and high PWM frequency (to reduce switching-induced jitter).

     

    For fast-tool servos such as this, you may want to run servo and phase at 20 kHz, and PWM at 30 kHz. If you also have some standard servo motors, you may want to use the "servo-in-phase" feature (setting Motor[x].PhaseCtrl bit 3 [value 8] to 1). It is common in this type of application to set the servo clock to ~5 kHz and the phase clock to ~20 kHz, with the standard motors closing their position/velocity loops at the servo clock rate, and the fast tools closing theirs at the phase clock rate. This is what that feature is for.

     

    That sounds like a good solution. I dove into the UserManual again and read about the clock settings. If I understand it right it is also possible to set one Gate, for example Gate3[0] to 20kHz. For that Gate I would set the parameter Gate3[0].PhaseServoDir=0. Then I would set Gate3[1].PhaseServoDir=3 and Gate3[1].PhaseClockDiv=3. That would give me half the phase frequency of Gate3[0] on Gate3[1], right? Unfortunately I cannot test it right now, but I will do that that as soon as possible. I guess that two phase signals have messed with the controlling ability.

  16. What is the reason you need a particular phase frequency?

     

    I try to improve the Performance of our control. Our Group built an experiment to scan a sample through the x-ray for 3d-tomography. Therefore we need nm-resolution. Up to now we have a lot of different controllers from galil for the different motor-types. We plan to control all these motors with the PowerBrickLV. The Voice Coils do the scanning-motion. For them I intended to have a high phase rate of about 30 kHz or whatever works best. Then there is a rotational stage and a tripod, each based on working with brushless motors. Those could have the phase-rate.

  17. Update:

     

    I discovered a problem which I did not consider before. I thought it would be possible to set the IC-Channels on my PowerBrickLV on different phase frequencies. But as there is only one parameter available for Sys.ServoPeriod and Sys.PhaseOverServoPeriod it can only be correct for one IC. Is it possible to set this value independently for each IC?

  18. Using a PowerBrickLV 5/15A

     

    Hi, we realized that we do not reach the same accuracy when tuning a motor and scaling motor units to user units. It becomes worse as the the scaling increases. In the worst case we have ~26222 motor units per user unit. We assume that there are rounding errors causing the problem. Therefore we wondered if there is a function which allows us to work in raw motor units and get the position output in user units. Ideally we would also like to be able to input the acceleration and speed parameters in user units.

    If it is not possible my workaround would be to have a plc running in the background which does the conversion, or is there maybe a best practice?

     

    Best regards,

    hannsx

  19. Using a PowerBrickLV 5/15A

     

    Hi,

    we use voice-coil motors to scan a sample at nanometer scale with an x-ray.

    So far we used a galil-controller to do that. Now we want to use the pmac for this purpose. We tuned the motors with the pmac and did not get better than +/- 100nm.

    So the voice-coil is fluctuating nervously in that range.

     

    The voice-coil is pushing a flexor bearing, which acts as a spring force. Therefore the voice-coil has to control permantly. We did so far only use the Kp, Kvfb and Ki parameters, as we did on the galil motion-controler. Are there special things to consider when controlling voice-coils? What can I do to improve the control?

     

    best regards,

    hannsx

  20. Hannsx,

     

    If you're referring to the holes in the casing for mounting screws, the drawing in the top left of the page Eric referred to shows just that:

     

    Hi AAnikstein, I am referring to the screws holding the case together, not the holes for the mounting screws.

  21. Mounting information and drawing can be found in the Power Brick LV manual.

    http://forums.deltatau.com/filedepot/download.php?f=Power%20PMAC/Manuals/Hardware%20Reference%20Manual/Power%20Brick%20LV%20User%20Manual.pdf [FILE REMOVED]

     

    The section starts on page 22 with the CAD drawing on page 24.

     

    Hi Eric, thank you for your tip, I know these drawings. What I am looking for is a drawing which defines the positions of the screws on the casing.

×
×
  • Create New...