The ASI stages store relative movements as an integer in units of encoder ticks. Therefore, if we request repeated relative movements of a non-integer encoder tick value, we will accumulate error. Since we move ~20K steps in units of 1[um], it is possible to introduce about 20[um] of error at the end of this movement. This phenomenon is documented in the MOVEREL command.
The fix is to communicate with the box using absolute movements. Since we don't know when the NI card is outputting triggers, it would be prudent to setup a transaction where we fill up the Tigerbox buffer with as many moves as possible, and then regularly query the buffer size and refill it such that it never goes empty while being externally triggered.
Since the current refactor need not be any more accurate than the existing code, this feature can wait for a while.
The ASI stages store relative movements as an integer in units of encoder ticks. Therefore, if we request repeated relative movements of a non-integer encoder tick value, we will accumulate error. Since we move ~20K steps in units of 1[um], it is possible to introduce about 20[um] of error at the end of this movement. This phenomenon is documented in the MOVEREL command.
The fix is to communicate with the box using absolute movements. Since we don't know when the NI card is outputting triggers, it would be prudent to setup a transaction where we fill up the Tigerbox buffer with as many moves as possible, and then regularly query the buffer size and refill it such that it never goes empty while being externally triggered.
Since the current refactor need not be any more accurate than the existing code, this feature can wait for a while.