syncInterrupt.cpp
Use a periodic interrupt from the controller. Requires RTOS.
#include <windows.h>
#include "rsi.h"
using namespace RSI::RapidCode::SynqNet;
#define SYNC_PERIOD (1) // interrupt every SynqNet/MotionController sample
#define AXIS_COUNT (6) // how many axes will we process each sample
#define MS_PER_SECOND (1000.0)
void syncInterruptMain()
{
MotionController *controller;
Axis *axes[AXIS_COUNT];
double encoderPositions[AXIS_COUNT];
short torqueOutputs[AXIS_COUNT] = {0, 0, 0, 0, 0, 0};
long currentCounter = 0;
long previousCounter = 0;
long deltaSamples = 0;
long iterations = 0;
unsigned long cpuFreq = 0;
double deltaTime = 0.0;
double minTime = 1000000.0;
double maxTime = 0.0;
long i = 0;
long errorCount = 0;
try
{
controller = MotionController::CreateFromBoard(0);
for(i = 0; i < AXIS_COUNT; i++)
{
axes[i] = controller->AxisGet(i);
}
controller->ServiceThreadEnableSet(false);
cpuFreq = controller->OS->PerformanceTimerFrequencyGet();
printf("CPU Frequency is: %u Hz\n", cpuFreq);
printf("Host will have %ld microseconds to process data.\n", controller->SyncInterruptHostProcessTimeGet() );
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
controller->SyncInterruptPeriodSet(SYNC_PERIOD);
controller->SyncInterruptEnableSet(true);
while( controller->OS->KeyGet(RSIWaitPOLL) < 0)
{
controller->SyncInterruptWait();
if(controller->SyncInterruptHostProcessStatusBitGet() == true)
{
printf("\n\n Oops, we took too long processing the last interrupt. \n");
controller->SyncInterruptHostProcessStatusClear();
}
currentCounter = controller->OS->PerformanceTimerCountGet();
deltaSamples = currentCounter - previousCounter;
previousCounter = currentCounter;
deltaTime = (double)( deltaSamples * (double)(1/(double)cpuFreq)) * MS_PER_SECOND;
if(iterations > 1)
{
if(deltaTime > maxTime)
{
maxTime = deltaTime;
}
if(deltaTime < minTime)
{
minTime = deltaTime;
}
printf("IRQ %ld: %3.3lf ms Min: %3.3lf Max: %3.3lf \n", iterations, deltaTime, minTime, maxTime );
}
controller->SyncInterruptHostProcessFlagSet(true);
for(int i = 0; i < AXIS_COUNT; i++)
{
encoderPositions[i] = axes[i]->EncoderPositionGet(RSIMotorEncoderPRIMARY);
}
for(int i = 0; i < AXIS_COUNT; i++)
{
axes[i]->FilterCoeffSet(RSIFilterGainPIDCoeffOUTPUT_OFFSET, 0, torqueOutputs[i] );
}
controller->SyncInterruptHostProcessFlagSet(false);
iterations++;
}
controller->SyncInterruptEnableSet(false);
}
catch (RsiError *err)
{
printf("%s\n", err->text);
}
printf("Press a key to exit.\n");
while( controller->OS->KeyGet(RSIWaitPOLL) < 0)
{
controller->OS->Sleep(100);
}
}