sbondhus Posted May 12, 2014 Share Posted May 12, 2014 I have a project that currently uses a user-written servo routine for all kinematics and controls for a variety of motors and returns the user-calculated commanded voltage output from the servo routine to drive the motor. Two other motors are also assigned to this servo routine, though the intent and implementation (before my time on the project) for these two motors was to use the built-in Delta Tau servo routine (something like "return pshm->ServoCtrl(Mptr);"). The original coders of these routines used Mptr->DesPos and ->DesVel to attempt to command the motor to the desired position. This is similar to the method described in this previous post. I have tried using our code as it stands, as well as writing my own simple project based on the post linked above, and neither of them worked as desired. When I tried the example project linked above, I was able to command motion, but the motion didn't seem to follow any of the desired constraints (e.g. .JogSpeed, .MaxSpeed, .MinPos, etc). My question is this: If we want to continue commanding positions for this motor with the same routines we already have defined, but control it using the Delta Tau built-in PID controller, what is the most appropriate way to do that? The position we want to command to these motors is returned from function call in a separate user-written servo routine and stored in shared memory. Pseudo-Code for what we want to do: user_written_servo_routine_1(struct MotorData *Mptr) { Read sensors from input controls store sensor values in shared memory } user_written_servo_routine_2(struct MotorData *Mptr) { Update motor with desired position based on sensor readings obtained during user_written_servo_routine_1 return pshm->ServoCtrl(Mptr); ? } or, instead of commanding via a returned value in a servo routine, could we... user_written_servo_routine_2(struct MotorData *Mptr) { Format string based on sensor readings obtained during user_written_servo_routine_1 use Command(string) to issue jog command to desired motor } or, instead of using a servo routine to issue the command, read the desired position from shared memory and use a Motion Program to command the motor (I'm currently a little hesitant of this approach since we have no other Motion Programs in our project and none of our motors are currently assigned to specific coordinate systems, but if this is the correct approach I'm open to using it. Link to comment Share on other sites More sharing options...
steve.milici Posted May 14, 2014 Share Posted May 14, 2014 It would be better to use a motion program. Moving the motor in the other fashion does not allow PMAC to impose any of the trajectory constraints that you want. Link to comment Share on other sites More sharing options...
curtwilson Posted May 14, 2014 Share Posted May 14, 2014 If you must poke values directly into a motor register servo cycle by servo cycle, you can use one of three registers: Motor[x].Desired.Pos Motor[x].MasterPos Motor[x].CompDesPos Power PMAC will automatically sum these three into the net Motor[x].DesPos and calculate Motor[x].DesVel from this. Motor[x].Desired.Pos can be used if no trajectories are being calculated for the motor. Motor[x].MasterPos can be used if no position following is active for the motor (Motor[x].MasterCtrl=0). Motor[x].CompDesPos can be used if no cam table or compensation table targeting this register is active. Link to comment Share on other sites More sharing options...
sjlee5 Posted May 14, 2014 Share Posted May 14, 2014 I suggest you to use "Motor[x].MasterPos". And there are reserved bits(bit2,3) in "Motor[x].MasterCtrl". If you use reserved bit 3 then you can control using or not. My code is like this. double dPrevDesPos, dCurrDesPos, dDeltaPos; double user_written_servo_routine_2(struct MotorData *Mptr) { if (Mptr->MasterCtrl&0x08) { dCurrDesPos = *((double *)pushm+10); // if use Sys.Ddata[10] dDeltaPos = dCurrDesPos - dPrevDesPos; Mptr->MasterPos += dDeltaPos; dPrevDesPos = dCurrDesPos; } else { dPrevDesPos = *((double *)pushm+10); } return pshm->ServoCtrl(Mptr); } I don't know there would be other problems. Please refer to my code. Link to comment Share on other sites More sharing options...
sbondhus Posted May 20, 2014 Author Share Posted May 20, 2014 Many thanks for all of your responses. I think we have a few good options now, and we got it working. Link to comment Share on other sites More sharing options...
Recommended Posts