Jump to content
OMRON Forums

Setting up a resolver in PPMAC


Recommended Posts



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;



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

Link to comment
Share on other sites

  • Replies 13
  • Created
  • Last Reply

Top Posters In This Topic

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




1st Order Filter

encTable[x].index1= 0

encTable[x].index2= 250




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

Link to comment
Share on other sites



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



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



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.

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



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


Please advise

Link to comment
Share on other sites

MI975 permits the enabling of MACRO I/O nodes on MACRO IC 0. MI975 is a 16-bit value – bits 0 to 15 – with bit n controlling the enabling of MACRO node n. If the bit is set to 0, the node is disabled; if the bit is set to 1, the node is enabled. The I/O nodes on the 16-Axis MACRO Station are nodes 2, 3, 6, 7, 10, and 11, which can be enabled by MI975 bits of these numbers. Only bits 2, 3, 6, 7, 10, and 11 of MI975 should ever be set to 1.


MI975 is used at power-on/reset to determine which I/O MACRO nodes are to be enabled. The net result can be read in Station variable MI996. To get a value of MI975 to take effect, the value must be saved (MSSAVE{node}) and the Station reset (MS$$${node}).


You may need to activate an added lower I/O node to provide a placeholder for the built-in I/O:

MI975=$C40 //activate nodes 10,11 (for ADCs) and 6 (built-in I/O placeholder)

Link to comment
Share on other sites



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.



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



Here is the filtered signal


Link to comment
Share on other sites

So after trying a plethora of low pass filters. We cannot achieve the performance that we require with the limited 12 bits (4096 counts) per revolution. In addition the significant noise to signal ratio does not allow us to use the velocity signal to achieve a good damping ratio.


Before I completely give up on this idea, I wanted to ask if anyone has experience with applications of the Geo Macro resolver function, their definition of acceptable performance and what they needed to implement to achieve acceptable performance.


For reference

I have used 2nd order filters for

Inner Velocity, Position and Encoder

Link to comment
Share on other sites

Since this product has only 12 bits for the resolution and if you have a higher noise floor in your system we would recommend using a tracking filter. If EncTable[n].index2 is set to a value 32 or greater, a digital tracking filter is enabled for the entry. In the tracking filter, index2 serves as the “proportional” gain term, index1 serves as the “mantissa” of the “integral” gain term, and index4 serves as the “exponent” of the “integral” gain term. All are 8-bit unsigned integer values, with a range of 0 to 255. For implementation details (and filter equations) see the section "Tracking-Filter Operations: index1, index2 (index2 > 31), index4" in the Power PMAC User's Manual starting on page 151.
Link to comment
Share on other sites

Thank you for the suggestions.


I already had implemented a low pass tracking filter. FYI my gains were

index1 = 80

index2 = 140

index4 = 2


Which I believe is about a 100Hz cutoff at 2.25kHz Servo period.


I also tried implementing the same filter for the phasing of the motor.

Link to comment
Share on other sites

This topic is now closed to further replies.

  • Create New...