Jump to content
OMRON Forums

iclim

Members
  • Posts

    51
  • Joined

  • Last visited

Posts posted by iclim

  1. Curt,

     

    Thanks for the reply. I still am a little confused about what you said. If the internal code reads the value of pPhaseEnc and then stores that value in the PrevPhaseEnc before the user phase function is even called, then how can the user phase function calculate a delta phase position?

     

    I will illustrate my point with psuedo code

    //Delta Tau internal code does something like this 
    PresentEnc = *Mptr->pPhaseEnc;                      //For example PresentEnc = 10 
    DeltaEnc = PresentEnc - Mptr->PrevPhaseEnc;    //Lets say the previous was 5, so DeltaEnc  = 5 
    PrevPhaseEnc = PresentEnc; //Now PrevPhase = 10 
    
    //Now the user code is called 
    PresentEnc = *Mptr->pPhaseEnc;                      //Which is still 10 
    DeltaEnc = PresentEnc - Mptr->PrevPhaseEnc;    //However since PrevPhaseEnc was already update to 10.  The Delta is 0
    PrevPhaseEnc = PresentEnc;                            //Redundant step 
    

     

    Hence I am still a little confused by this.

     

    The reason why I am asking is that we have implemented a user phase function and the only means to get it to work is to store the prev enc in a different memory location. I would like to use PrevPhaseEnc

  2. All,

     

    We managed to get the resolver working.

     

    Here is the solution that we found.

     

    Things that must known and set before even attempting to setup the resolver.

    1. The usual MacroEnable on both the PPMAC and GEO Macros (MI996) must be set to enable the I/O Nodes.

     

    2. In our test we used Macro Node 8 and 9 for a resolver. According to documentation you would expect the ADC values of the resolver to be on I/O Nodes 10 and 11. This is NOT the case. Both servo nodes 8 and 9 will use node 10 for their ADC values. Hence only one resolver can be setup at a time. Either MI101 = 12 OR MI102 = 12. They CANNOT equal 12 at the same time.

     

    3. Use Gate3[n].MacroInA[1] and Gate3[n].MacroInA[2] to obtain the ADC values

     

    Once the above is done the remaining setup is pretty straight forward. Set the gains to ensure no signal clipping occurs. I used a PLC script to get the values from the Macro registers and followed the instructions listed on the MACRO User Manual. We did not need to apply a shift (MI941)

     

    Here is a trace of the Macro registers.

    ADCOutputs.png.fef7af451e65f7760a3d7d64d9a8dae5.png

     

    This still results in a noisy signal. We used a basic second order filter in the phase frequency to filter out the signal.

    Here is the raw signal

    RawPhasePos.thumb.png.4d22fc29aa0694c8cd6861bf7d541194.png

     

    Here is the filtered signal

    FilteredPhasePos.thumb.png.cf16fa6e7adbe5e2f6ce243c1d45d6e5.png

  3. Hi,

     

    I have found some strange behaviour with the Motor[x].PrevPhaseEnc when implementing a User_Phase routine.

     

    To simplify my concerns and confirm that it was not my code, I made a simple counter which counts to 1000

     

    void user_counters(struct MotorData *Mptr)
    {
    Mptr->PhasePos += 1; 
    
    if(Mptr->PhasePos > 1000)
    {
    	Mptr->PhasePos = 0;
    }
    return;
    }
    

     

    Now at the same time I setup my pointer pPhaseEnc to Gate3[0].MacroIn[9][0] i.e.

     

    Motor[8].pPhaseEnc=Acc5E3[0].MacroInA[9][0].a
    

     

    Now as you can see from the user code, at no point do I ever write to the Motor[x].PrevPhaseEnc register i.e. Mptr->PrevPhaseEnc = (int)blah;

     

    However upon enabling the Motor[8].PhaseCtrl=4. Here is a trace of the behaviour of PrevPhaseEnc

    PrevPhaseEnc.png.942b79fb857c403482a6116765e5dcbe.png

     

    From my investigations it looks like the content of Acc5E3[0].MacroInA[9][0].a is being copied into Motor[x].PrevPhaseEnc

     

    Hence when you implement a user phase routine the phase position delta is always zero. I currently have circum-navigated this issue by using a different memory address, however is there something that I need to change to stop this from occurring?

     

    Thanks

  4. Steve,

     

    No such luck.

     

    Here is my PLC program which I used to removed the padding bits

     

    #define adcA			P100
    #define adcB			P101
    #define PosFeedback		P102
    
    #define MacroServoNodeNumber 9
    #define MacroIONodeNumber	 11
    
    open plc 2
    
    //Get resolver values of ADCs for Macro node 9 
    adcA = Gate3[0].MacroInA[MacroIONodeNumber][1]; //ADC A 
    adcB = Gate3[0].MacroInA[MacroIONodeNumber][2]; //ADC B 
    
    //Remove lower 16 bits of padding
    adcA = adcA >> 16;
    adcB = adcB >> 16;
    
    PosFeedback = Gate3[0].MacroInA[MacroServoNodeNumber][0] >> 13
    PosFeedback = PosFeedback & $000FFF
    
    close
    /****************************************/
    

     

    I am attaching a trace of two rotations, as you can see there is a rather noisy resolver output.

    SingleTurn.png.4cd31b1ec2e06a4096f51955b5854956.png

     

    Also here is the output for the MacroEnable registers. I tried turning on all IO on the station to ensure that I did not miss anything.

    Gate3[0].MacroEnableA=$fff3300
    Gate3[0].MacroEnableA=$FFFFF00
    ms9,mi996
    $0000000fbf00
    ms9,mi996=$FBFCC
    enable plc 2
    

     

    Also to confirm that the adc values are not being placed in any other I/O registers I had the following watch setup

    WatchWind.png.90cd1420ba7993b4fde705ebc2dae853.png

     

    As you can see it does not appear that the Adc values are being written to any Macro registers.

     

    Please advise

  5. Does anyone know the address of the filtered encoder position register?

     

    For example

     

    EncTable[x].pEnc point to Acc5E3[0].MacroIn[0].a

     

    However if we apply a first order low pass filter to this register i.e.

     

    EncTable[x].index1 = 0

    EncTable[x].index2 = 250

     

    Where is the filtered result stored? And what is the structure of this register.

     

    I ask this question as our

    Motor[x].pPhaseEnc = Acc5E3[0].MacroIn[0].a

     

    Hence I believe the commutation is using a non filtered version of the resolver feedback

     

    Ideally I would like

    Motor[x].pPhaseEnc = FilteredValueofRotorPosition.a

     

    Thanks

  6. I addition to this question, we are trying to perform commutation and current loop control for a brushless DC motor.

     

    We have tuned the current loops and are satisfied with the results, however there is quite a lot of noise coming back from resolver position. We have tried both 1st and 2nd order filters, but it appears that they have little affect on the Motor[x].PhasePos. I am attaching a trace of the Motor[x].PhasePos and Motor[x].ActPos with the motor stationary

     

    2nd Order Filter at 100Hz and damping at 0.7

    encTable[x].index1 = 80

    encTable[x].index2 = 155

    encTable[x].index4 = 2

     

    2ndOrder.png.19fabff560c9746c4d668ce5b904ca37.png

     

    1st Order Filter

    encTable[x].index1= 0

    encTable[x].index2= 250

     

    1stOder.png.7bf18b639618d81e5dd1e70f8dcf0823.png

     

    Also note that our

    Motor[x].PhasePosSf = 0.000244140625

    - 8 pole motor

    - Remove lower 13bits

    - 4096 of feedback counts per rotation

     

    Can you please help.

     

    Thank you

  7. Hello,

     

    We are trying to setup a resolver on a Geo Macro Drive and the Power PMAC.

     

    We have successfully setup the amplitude and frequency of the excitation and have confirmed that the position feedback is working.

     

    However upon trying the Setting up the Phase Shift (MI941) Manually method (pg 73 of Geo Macro Manual) we are not having any luck.

     

    We are using the following plc to determine the values:

     

    #define adcA P20
    #define adcB P21
    #define PosFeedback P24
    
    
    open plc 2
    
    //Get resolver values of ADCs for Macro node 9 
    adcA = Gate3[0].MacroInA[9][1]; //ADC A 
    adcB = Gate3[0].MacroInA[9][2]; //ADC B 
    
    //Remove lower 16 bits of padding
    adcA = adcA >> 16;
    adcB = adcB >> 16;
    
    //Remove lower 8 bits of padding 
    PosFeedback = Gate3[0].MacroInA[9][0];
    PosFeedback = PosFeedback >> 13;
    
    close
    

     

    We are assuming that the two ADC values are coming from (for Node 9 servo on bank A)

    Gate3[0].MacroInA[9][1]; //ADC A

    Gate3[0].MacroInA[9][2]; //ADC B

     

    However it appears that our values for adcA and adcB do not change by much when changing MI941.

     

    Could we please have guidance on how to perform this on the Power PMAC

     

    Thank you

  8. On a note to this I found the "PositionControl" configurations settings file which is pretty self explanatory.

     

    So we at the moment at least can save the setup per IP.

     

    Still it would be great to have a mechanism to load different configurations.

     

    If anyone is interested the project configuration files are located

    C:\Program Files (x86)\Delta Tau Data Systems Inc\2.0\Power PMAC Suite\INI

     

    Assuming you used the default installation location

  9. Hello,

     

    We have 4 Power PMAC in use.

     

    If we setup the counts per unit Position window for one IP, when we change to a different IP, it will remember the previous IP's setting.

     

    A couple of questions.

     

    1. In future versions can you please integrate a means for the IDE to associate a set of counts per unit to an IP so that we do not have to continually change the number of motors and counts per unit? Or is there already a mechanism to do this which we are unaware of?

     

    2. For the current version of the IDE. Can you please tell me the file that is used to save the counts per unit, number of motors etc so that we can save versions per PPMAC so that we can save some setup time. We really do have quite a lot of motor nodes...

     

    Thank you

  10. Hello,

     

    I would like to write a program which writes directly to the memory address for the position target of a co ordinate system. Is there a means to do this rather than performing a move through a single line motion program?

     

    The reason behind this is that we want to use the PPMAC to track a position target which is sent over the network.

     

    To perform this I would like to setup a TCP/IP server on the PPMAC which receives a position target from a client and then updates the memory address containing the position target.

     

    Also if someone else has done this before and has example code they want to share, that would also be greatly appreciated.

     

    Thanks

    Choon

  11. Hello Steve,

     

    I have a few concerns:

     

    1. I have set the ADC offsets already.

     

    2. My main concern is that if you physically hold the output shaft of the motor, when it is holding a constant position target you can feel the vibrations in the motor shaft, which in a high precision position application is not be acceptable

     

    3. This issue is not present on our other PMAC which uses the same setup.

     

    Thank you

  12. What is the inductance of your motor? Do you have a ferrite core on the motor leads? That might help.

    Ph-Ph = 18.5mH, exact same setup used in production and same issue does not exist

     

     

    What are your current loop gains (Motor[x].IiGain, Motor[x].IpbGain, Motor[x].IpfGain)?

    Motor[x].IiGain = 0.152

    Motor[x].IpbGain = 0

    Motor[x].IpfGain = 2.3

     

    What is the value of Sys.PhaseCycleExt?

    It is set to 1

     

     

    What are your clock settings on the Power PMAC and on the Slave (Geo MACRO)?

    Standard settings

    Gate3[0].PhaseFreq=9035.69161891937256

    Gate3[0].ServoClockDiv=3

     

    MACRO MI992 == 3275 (18.004khz)

    MACRO MI997 (Phase Clock Freq Control) = 0

     

    We are checking our power supplies to the unit later on.

  13. Hello,

     

    I was hoping you could shed some light on an issue that we have encountered.

     

    Upon performing manual current loop tuning, when the current has reached steady state I am noticing cyclic dips in the current (which the integrator responds to). I have attached a picture

     

    currentIssue.png.ad9aea9cf7dde789d57c80f36da6cf59.png

     

    We are using an ACC-5E3 card with Geo MACRO Drives

     

    I have checked all of the commutation and direct PWM setting along with the pointers to the Geo MACRO registers.

     

    Do you have any suggestions?

  14. Hello,

     

    We are running into an issue with the new IDE, where after a few minutes the connection to the PPMAC is lost.

     

    I have attached a picture of the issue that we are facing including the TaskManager.

     

    It is important to note that this issue was not present on the previous version of the IDE and the only change that was made was updating to the latest IDE.

     

    We also have a development PPMAC which we use where the processor is loaded less and the issue has not been encountered.

     

    ConnectionIssue.thumb.jpg.4e88f2ff9a8133f4b366a5ea05855509.jpg

  15. Hello,

     

    We have a Power PMAC with the ACC-5E3 card connected to Geo Macro Drives controlling brushless DC motors.

     

    I have a question regarding the assignment of the EncTable[x].pEnc.

     

    In the Power PMAC User manual it states to point to the address of the Macro registers. e.g.

    EncTable[x].pEnc = Acc5E3[n].MacroInA[j][0].a

     

    However in the Turbo PMAC/PMAC2 Software Reference on page 219 it states.

     

    When performing commutation of motors over the MACRO ring, it is advisable to get servo position

    feedback data not directly from the MACRO ring registers, as shown above, but from the motor’s

    previous phase position register instead. This is where the commutation algorithm has stored the position

    it read from the ring (with Ixx83) for use in its next cycle.

    Using this register prevents the possibility of jitter if the conversion table execution can be pushed too late

    in the cycle

     

    i.e. EncTable[x].pEnc = Motor[n].PrevPhaseEnc.a

     

    Can you please clarify if the Turbo PMAC methods should still be used with the Power PMACS? Or if there might be advantages/disadvantages to it.

×
×
  • Create New...