Page 1 of 1

Emergency Stop based on external signal

Posted: Sun Jul 01, 2018 7:22 am
by SashaLag
Hi,

I would like to implement an Emergency Stop routine based on a signal received from an external device through USB. I know there are delays involved in this problem (because of the operating system, because of the USB and because of different controllers utilized) but I want to do it anyway.

Now, my program has to move a stepper motor with precise position ending so I suppose, CONTROL_MODE_RUN and sslep(certain amount) may not the best solution (am I wrong?). So be it CONTROL_MODE_STEP.

It moves correctly with these instructions:

Code: Select all

for (int j = 0; j < NumAcquisition1; ++j) {
   RotSteps = (TotalSteps1 / (NumAcquisition1 - 1)) * j;
   printf("\nSegment: %d\n", j);
   PhidgetStepper_setTargetPosition(BedMotor, BedSteps);
   ssleep(5);
}
but I really don't know how to implement this Emergency Stop in Phidget Environment. I have a background on microcontrollers, so there I would implement an Interrupt routine, but here I don't know which route to follow. Does this instruction

Code: Select all

PhidgetReturnCodePhidgetStepper_setTargetPosition_async(
PhidgetStepperHandle ch,
double targetPosition,
void (CCONV *asyncHandler)(PhidgetHandle phid, void *ctx, PhidgetReturnCode res),
void *ctx
) 
fullfill my needs? If so, can you explain to me what to insert instead of void (CCONV *asyncHandler)(PhidgetHandle phid, void *ctx, PhidgetReturnCode res)?

Thank you in advance!

Re: Emergency Stop based on external signal

Posted: Tue Jul 03, 2018 10:07 am
by mparadis
You can tell the motor to stop by setting the targetPosition to the currentPosition.

The difference between setTargetPositon and setTargetPosition_async is that they async version is non-blocking, which is only useful if there are timing-critical things you want to do immediately after stopping.

In order to implement a stop, you'll need to use events. For example, if you have a Phidget with a digital input that reads your stop signal, you could set up an OnStateChange event for the digital input, and then inside that handler put code that sets targetPosition equal to currentPosition. You'll need to pass a pointer to the Stepper handle into the event handler for this. Passing the pointer in is explained here.

Re: Emergency Stop based on external signal

Posted: Mon Jul 09, 2018 3:51 am
by SashaLag
ah, it's clear to me now! Thank you for the explanation, really appreciated!