Difference between revisions of "KMotionDef"

From Dynomotion

Jump to: navigation, search
(No summary)
(No summary)
Line 1: Line 1:
 
===KMotionDef.h===
 
===KMotionDef.h===
 +
The KMotionDef.h, is a C header file which lists all variables and functions available to [[KFLOP C Programs]]. The KMotionDef.h file can be located in the  <KMotion Installation Dir >\DSP_KFLOP\ directory.
  
The KMotionDef.h, is a C header file which lists all variables and functions available to [[KFLOP C Programs]]. The KMotionDef.h file can be found at <KMotion Installation Directory>\DSP_KFLOP\
 
  
  
 
====The Big List====
 
====The Big List====
Please Note - at the moment this is a direct copy and paste of the KMotionDef.h file. As time allows, it will gradually link to other pages containing further details and examples of related variables and functions. If you wish to contribute to this task, please register.
+
<span style="color: #ff0000;">Please Note - at the moment this is a direct copy and paste of the KMotionDef.h file. As time allows, it will gradually link to other pages containing further details and examples of related variables and functions. If you wish to contribute to this task, please register.</span>
  
 +
<span style="color: #0000ff;">To make already linked variables/functions stand out, the original unedited text has been coloured Blue. As the page is edited and linked, it will revert to normal wiki text colours.</span>
  
//<br />//  KMotionDef.h - MAIN HEADER FILE FOR USER C PROGRAMS<br />//<br />//  Copyright Dynomotion 2/20/2004<br />//<br />//  Include this header file in User C programs that execute<br />//  in the DSP to define all User accessible KMotion functions,<br />//  constants, and data structures
 
  
#ifndef KMotionDef_h<br />#define KMotionDef_h
+
<span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">//  KMotionDef.h - MAIN HEADER FILE FOR USER C PROGRAMS</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">//  Copyright Dynomotion 2/20/2004</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">//  Include this header file in User C programs that execute</span><br /><span style="color: #0000ff;">//  in the DSP to define all User accessible KMotion functions,</span><br /><span style="color: #0000ff;">//  constants, and data structures</span>
  
#define KFLOP<br />#define C6722
+
# <span style="color: #0000ff;">ifndef KMotionDef_h</span><br /><span style="color: #0000ff;">#define KMotionDef_h</span>
  
#define BOARD "KFLOP"
+
# <span style="color: #0000ff;">define KFLOP</span><br /><span style="color: #0000ff;">#define C6722</span>
  
extern const char VersionAndBuildTime[];  // string with version and build time
+
# <span style="color: #0000ff;">define BOARD "KFLOP"</span>
  
#define CLOCKFREQ   50.0e6   // 200 MHz/4  
+
<span style="color: #0000ff;">extern const char VersionAndBuildTime[];  // string with version and build time</span>
  
typedef int BOOL;
+
# <span style="color: #0000ff;">define CLOCKFREQ   50.0e6   // 200 MHz/4  </span>
  
#ifndef _SIZE_T<br />#define _SIZE_T<br />typedef unsigned int size_t;<br />#endif
+
<span style="color: #0000ff;">typedef int BOOL;</span>
  
#ifndef NULL<br />#define NULL    0<br />#endif
+
# <span style="color: #0000ff;">ifndef _SIZE_T</span><br /><span style="color: #0000ff;">#define _SIZE_T</span><br /><span style="color: #0000ff;">typedef unsigned int size_t;</span><br /><span style="color: #0000ff;">#endif</span>
  
#ifndef FALSE<br />#define FALSE 0<br />#endif<br />#ifndef TRUE<br />#define TRUE 1<br />#endif    <br />#ifndef PI<br />#define PI 3.14159265358979323846264<br />#endif    <br />#ifndef PI_F<br />#define PI_F 3.1415926535f<br />#endif    <br />#ifndef TWO_PI_F<br />#define TWO_PI_F (2.0f * 3.1415926535f)<br />#endif    <br />#ifndef PI_2F<br />#define PI_2F (3.1415926535f * 0.5f) <br />#endif    <br />#ifndef TWO_PI<br />#define TWO_PI (2.0 * 3.14159265358979323846264)<br />#endif   
+
# <span style="color: #0000ff;">ifndef NULL</span><br /><span style="color: #0000ff;">#define NULL    0</span><br /><span style="color: #0000ff;">#endif</span>
  
<br />#include "PC-DSP.h"   // contains common structures shared by PC and DSP
+
# <span style="color: #0000ff;">ifndef FALSE</span><br /><span style="color: #0000ff;">#define FALSE 0</span><br /><span style="color: #0000ff;">#endif</span><br /><span style="color: #0000ff;">#ifndef TRUE</span><br /><span style="color: #0000ff;">#define TRUE 1</span><br /><span style="color: #0000ff;">#endif    </span><br /><span style="color: #0000ff;">#ifndef PI</span><br /><span style="color: #0000ff;">#define PI 3.14159265358979323846264</span><br /><span style="color: #0000ff;">#endif    </span><br /><span style="color: #0000ff;">#ifndef PI_F</span><br /><span style="color: #0000ff;">#define PI_F 3.1415926535f</span><br /><span style="color: #0000ff;">#endif    </span><br /><span style="color: #0000ff;">#ifndef TWO_PI_F</span><br /><span style="color: #0000ff;">#define TWO_PI_F (2.0f * 3.1415926535f)</span><br /><span style="color: #0000ff;">#endif    </span><br /><span style="color: #0000ff;">#ifndef PI_2F</span><br /><span style="color: #0000ff;">#define PI_2F (3.1415926535f * 0.5f) </span><br /><span style="color: #0000ff;">#endif    </span><br /><span style="color: #0000ff;">#ifndef TWO_PI</span><br /><span style="color: #0000ff;">#define TWO_PI (2.0 * 3.14159265358979323846264)</span><br /><span style="color: #0000ff;">#endif   </span>
  
// Global Host Status that the PC Application can specify as it Requests Global Status<br />// to inform KFLOP User threads of its current state.  ie Job Actively running<br />// up to 32 bits of status can be specified.  See PC-DSP.h for normal bit defines<br />extern int volatile HostStatus;
+
<br /><span style="color: #0000ff;">#include "PC-DSP.h"   // contains common structures shared by PC and DSP</span>
  
#define JOB_ACTIVE (HostStatus & HOST_JOB_ACTIVE_BIT)
+
<span style="color: #0000ff;">// Global Host Status that the PC Application can specify as it Requests Global Status</span><br /><span style="color: #0000ff;">// to inform KFLOP User threads of its current state.  ie Job Actively running</span><br /><span style="color: #0000ff;">// up to 32 bits of status can be specified.  See PC-DSP.h for normal bit defines</span><br /><span style="color: #0000ff;">extern int volatile HostStatus;</span>
  
 +
# <span style="color: #0000ff;">define JOB_ACTIVE (HostStatus & HOST_JOB_ACTIVE_BIT)</span>
  
// standard math funtions
 
  
extern float sqrtf (float x);<br />extern float expf  (float x);<br />extern float logf  (float x);<br />extern float log10f(float x);<br />extern float powf  (float x, float y);<br />extern float sinf  (float x);<br />extern float cosf  (float x);<br />extern float tanf  (float x);<br />extern float asinf (float x);<br />extern float acosf (float x);<br />extern float atanf (float x);<br />extern float atan2f(float y, float x); <br />extern float fast_fabsf (float y);
+
<span style="color: #0000ff;">// standard math funtions</span>
  
extern double sqrt (double x);<br />extern double exp  (double x);<br />extern double log  (double x);<br />extern double log10(double x);<br />extern double pow  (double x, double y);<br />extern double sin  (double x);<br />extern double cos  (double x);<br />extern double tan  (double x);<br />extern double asin (double x);<br />extern double acos (double x);<br />extern double atan (double x);<br />extern double atan2(double y, double x); <br />extern double fast_fabs (double y);
+
<span style="color: #0000ff;">extern float sqrtf (float x);</span><br /><span style="color: #0000ff;">extern float expf  (float x);</span><br /><span style="color: #0000ff;">extern float logf  (float x);</span><br /><span style="color: #0000ff;">extern float log10f(float x);</span><br /><span style="color: #0000ff;">extern float powf  (float x, float y);</span><br /><span style="color: #0000ff;">extern float sinf  (float x);</span><br /><span style="color: #0000ff;">extern float cosf  (float x);</span><br /><span style="color: #0000ff;">extern float tanf  (float x);</span><br /><span style="color: #0000ff;">extern float asinf (float x);</span><br /><span style="color: #0000ff;">extern float acosf (float x);</span><br /><span style="color: #0000ff;">extern float atanf (float x);</span><br /><span style="color: #0000ff;">extern float atan2f(float y, float x); </span><br /><span style="color: #0000ff;">extern float fast_fabsf (float y);</span>
  
<br />#define FPGA_ADDR ((volatile unsigned char *)0x91000000)   // Base of FPGA addresses<br />#define FPGA(X) (FPGA_ADDR[(X)*4+2])<br />#define FPGA_ADDRW ((volatile unsigned short int *)0x91000000)   // Base of FPGA addresses<br />#define FPGAW(X) (FPGA_ADDRW[(X)*2+1])<br />    <br />// This structure is set to default every time the program runs UNTIL<br />// the program image has been FLASHED using the FLASH command<br />// from then on it will not be cleared, so data that was present at the<br />// time it was flashed will persist    
+
<span style="color: #0000ff;">extern double sqrt (double x);</span><br /><span style="color: #0000ff;">extern double exp  (double x);</span><br /><span style="color: #0000ff;">extern double log  (double x);</span><br /><span style="color: #0000ff;">extern double log10(double x);</span><br /><span style="color: #0000ff;">extern double pow  (double x, double y);</span><br /><span style="color: #0000ff;">extern double sin  (double x);</span><br /><span style="color: #0000ff;">extern double cos  (double x);</span><br /><span style="color: #0000ff;">extern double tan  (double x);</span><br /><span style="color: #0000ff;">extern double asin (double x);</span><br /><span style="color: #0000ff;">extern double acos (double x);</span><br /><span style="color: #0000ff;">extern double atan (double x);</span><br /><span style="color: #0000ff;">extern double atan2(double y, double x); </span><br /><span style="color: #0000ff;">extern double fast_fabs (double y);</span>
  
#define N_USER_DATA_VARS 200<br />                    <br />typedef struct<br />{<br />    int RunOnStartUp; // word Bits 1-7 selects which threads to execute on startup   <br />    unsigned int EntryPoints[N_USER_THREADS];   // each downloaded program's entry point<br />    int UserData[N_USER_DATA_VARS]; // General purpose way to share and or save user program data<br />} PERSIST;
+
<br /><span style="color: #0000ff;">#define FPGA_ADDR ((volatile unsigned char *)0x91000000)   // Base of FPGA addresses</span><br /><span style="color: #0000ff;">#define FPGA(X) (FPGA_ADDR[(X)*4+2])</span><br /><span style="color: #0000ff;">#define FPGA_ADDRW ((volatile unsigned short int *)0x91000000)   // Base of FPGA addresses</span><br /><span style="color: #0000ff;">#define FPGAW(X) (FPGA_ADDRW[(X)*2+1])</span><br /><span style="color: #0000ff;">    </span><br /><span style="color: #0000ff;">// This structure is set to default every time the program runs UNTIL</span><br /><span style="color: #0000ff;">// the program image has been FLASHED using the FLASH command</span><br /><span style="color: #0000ff;">// from then on it will not be cleared, so data that was present at the</span><br /><span style="color: #0000ff;">// time it was flashed will persist    </span>
  
extern PERSIST persist;   
+
# <span style="color: #0000ff;">define N_USER_DATA_VARS 200</span><br /><span style="color: #0000ff;">                    </span><br /><span style="color: #0000ff;">typedef struct</span><br /><span style="color: #0000ff;">{</span><br /><span style="color: #0000ff;">    int RunOnStartUp; // word Bits 1-7 selects which threads to execute on startup   </span><br /><span style="color: #0000ff;">    unsigned int EntryPoints[N_USER_THREADS];   // each downloaded program's entry point</span><br /><span style="color: #0000ff;">    int UserData[N_USER_DATA_VARS]; // General purpose way to share and or save user program data</span><br /><span style="color: #0000ff;">} PERSIST;</span>
  
extern int StatusRequestCounter;  // increments each time host requests status
+
<span style="color: #0000ff;">extern PERSIST persist;   </span>
  
// data gathering variables
+
<span style="color: #0000ff;">extern int StatusRequestCounter;  // increments each time host requests status</span>
  
#define MAX_GATHER_VALUES 32
+
<span style="color: #0000ff;">// data gathering variables</span>
  
#define GATHER_NULL_TYPE 7<br />#define GATHER_ADC_TYPE 6<br />#define GATHER_DOUBLE_TYPE 5<br />#define GATHER_FLOAT_TYPE 4<br />#define GATHER_LASTPWMC_TYPE 3<br />#define GATHER_LASTPWM_TYPE 2<br />#define GATHER_INT_TYPE 1<br />#define GATHER_END_TYPE 0
+
# <span style="color: #0000ff;">define MAX_GATHER_VALUES 32</span>
  
typedef struct  // define a size and address to store<br /><br />    int type;    // GATHER_XXXXX_TYPE, 0=end of list<br />    void *addr;<br />} GATHER_VALUE_DEF;<br /> <br />typedef struct<br />{<br />    double *bufptr;         // data gathering buffer pointer<br />    double *endptr;         // done if bufptr = endptr    <br />    <br />    double Dest;             // Save where the injection will be relative to<br />    <br />    int Inject;             // if set, 1st address is to be copied from buffer to the address <br />    <br />    GATHER_VALUE_DEF list[MAX_GATHER_VALUES];   // list of addresses to gather (null after last value)<br />} GATHER;
+
# <span style="color: #0000ff;">define GATHER_NULL_TYPE 7</span><br /><span style="color: #0000ff;">#define GATHER_ADC_TYPE 6</span><br /><span style="color: #0000ff;">#define GATHER_DOUBLE_TYPE 5</span><br /><span style="color: #0000ff;">#define GATHER_FLOAT_TYPE 4</span><br /><span style="color: #0000ff;">#define GATHER_LASTPWMC_TYPE 3</span><br /><span style="color: #0000ff;">#define GATHER_LASTPWM_TYPE 2</span><br /><span style="color: #0000ff;">#define GATHER_INT_TYPE 1</span><br /><span style="color: #0000ff;">#define GATHER_END_TYPE 0</span>
  
extern GATHER gather;    <br />                    
+
<span style="color: #0000ff;">typedef struct  // define a size and address to store</span><br /><span style="color: #0000ff;">{  </span><br /><span style="color: #0000ff;">    int type;    // GATHER_XXXXX_TYPE, 0=end of list</span><br /><span style="color: #0000ff;">    void *addr;</span><br /><span style="color: #0000ff;">} GATHER_VALUE_DEF;</span><br /><span style="color: #0000ff;"> </span><br /><span style="color: #0000ff;">typedef struct</span><br /><span style="color: #0000ff;">{</span><br /><span style="color: #0000ff;">    double *bufptr;         // data gathering buffer pointer</span><br /><span style="color: #0000ff;">    double *endptr;         // done if bufptr = endptr    </span><br /><span style="color: #0000ff;">    </span><br /><span style="color: #0000ff;">    double Dest;             // Save where the injection will be relative to</span><br /><span style="color: #0000ff;">    </span><br /><span style="color: #0000ff;">    int Inject;             // if set, 1st address is to be copied from buffer to the address </span><br /><span style="color: #0000ff;">    </span><br /><span style="color: #0000ff;">    GATHER_VALUE_DEF list[MAX_GATHER_VALUES];   // list of addresses to gather (null after last value)</span><br /><span style="color: #0000ff;">} GATHER;</span>
  
#define MAX_GATHER_DATA 1000000 // Size of gather buffer (number of doubles, 8 bytes each).                   <br />extern double *gather_buffer;   // Large buffer for data gathering, Bode plots, or User use
+
<span style="color: #0000ff;">extern GATHER gather;    </span><br /><span style="color: #0000ff;">                    </span>
  
#define N_CPLX 2048
+
# <span style="color: #0000ff;">define MAX_GATHER_DATA 1000000 // Size of gather buffer (number of doubles, 8 bytes each).                   </span><br /><span style="color: #0000ff;">extern double *gather_buffer;   // Large buffer for data gathering, Bode plots, or User use</span>
  
extern float *input;
+
# <span style="color: #0000ff;">define N_CPLX 2048</span>
  
void SetupGatherAllOnAxis(int c, int n_Samples);  // Prepares to gather info for an axis<br />void TriggerGather();                             // starts gathering defined items into gather buffer
+
<span style="color: #0000ff;">extern float *input;</span>
  
 +
<span style="color: #0000ff;">void SetupGatherAllOnAxis(int c, int n_Samples);  // Prepares to gather info for an axis</span><br /><span style="color: #0000ff;">void TriggerGather();                             // starts gathering defined items into gather buffer</span>
  
<br />#define TRAJECTORY_OFF 0          // no trajectory generation<br />#define TRAJECTORY_INDEPENDENT 1  // simple independent axis (3rd order funtion of time)<br />#define TRAJECTORY_LINEAR 2       // linear interpolated from coord system 0    (x = c*p+d)<br />#define TRAJECTORY_CIRCULAR 3     // circular interpolated from coord system 0  (x = c*sin(p*a+b)+d)<br />#define TRAJECTORY_SPECIAL 4      // Special Command to clear/set IO bit<br />          // do the operation<br />          // 0 = clearbit<br />          // 1 = setbit<br />          // 2 = wait for bit low<br />          // 3 = wait for bit high<br />          // 4 = beginning of Rapid<br />          // 5 = end of Rapid<br />          <br />          //    param 0 = bit number
 
  
 +
<br /><span style="color: #0000ff;">#define TRAJECTORY_OFF 0          // no trajectory generation</span><br /><span style="color: #0000ff;">#define TRAJECTORY_INDEPENDENT 1  // simple independent axis (3rd order funtion of time)</span><br /><span style="color: #0000ff;">#define TRAJECTORY_LINEAR 2       // linear interpolated from coord system 0    (x = c*p+d)</span><br /><span style="color: #0000ff;">#define TRAJECTORY_CIRCULAR 3     // circular interpolated from coord system 0  (x = c*sin(p*a+b)+d)</span><br /><span style="color: #0000ff;">#define TRAJECTORY_SPECIAL 4      // Special Command to clear/set IO bit</span><br /><span style="color: #0000ff;">          // do the operation</span><br /><span style="color: #0000ff;">          // 0 = clearbit</span><br /><span style="color: #0000ff;">          // 1 = setbit</span><br /><span style="color: #0000ff;">          // 2 = wait for bit low</span><br /><span style="color: #0000ff;">          // 3 = wait for bit high</span><br /><span style="color: #0000ff;">          // 4 = beginning of Rapid</span><br /><span style="color: #0000ff;">          // 5 = end of Rapid</span><br /><span style="color: #0000ff;">          </span><br /><span style="color: #0000ff;">          //    param 0 = bit number</span>
  
<br />#define TRAJECTORY_EXPONENTIAL 5  // independent axis (exponentially approach Dest a=Ratio per tick, b=Dest)
 
  
#define LAST_MOTION_JOG 0    // type of last independent motion was a jog<br />#define LAST_MOTION_MOVE 1    // type of last independent motion was a move<br />#define LAST_MOTION_MULTI 2    // type of last independent motion was a multi axis move (G0 type)<br />#define LAST_MOTION_EXP 3    // type of last independent motion was an exponential
+
<br /><span style="color: #0000ff;">#define TRAJECTORY_EXPONENTIAL 5  // independent axis (exponentially approach Dest a=Ratio per tick, b=Dest)</span>
  
<br />typedef struct  // linear (only c and d are used),or sine equation<br /><br />    double a;    <br />    double b;    <br />    double c;    <br />    double d;   // always t^0 constant coefficient (starting position)<br />} TRIP_CIRCLE_LINEAR;
+
# <span style="color: #0000ff;">define LAST_MOTION_JOG 0    // type of last independent motion was a jog</span><br /><span style="color: #0000ff;">#define LAST_MOTION_MOVE 1    // type of last independent motion was a move</span><br /><span style="color: #0000ff;">#define LAST_MOTION_MULTI 2    // type of last independent motion was a multi axis move (G0 type)</span><br /><span style="color: #0000ff;">#define LAST_MOTION_EXP 3    // type of last independent motion was an exponential</span>
  
typedef struct  // linear (only c and d are used)<br />{  <br />    double c;    <br />    double d;   // always t^0 constant coefficient (starting position)<br />} TRIP_LINEAR;
+
<br /><span style="color: #0000ff;">typedef struct  // linear (only c and d are used),or sine equation</span><br /><span style="color: #0000ff;">{  </span><br /><span style="color: #0000ff;">    double a;    </span><br /><span style="color: #0000ff;">    double b;    </span><br /><span style="color: #0000ff;">    double c;    </span><br /><span style="color: #0000ff;">    double d;   // always t^0 constant coefficient (starting position)</span><br /><span style="color: #0000ff;">} TRIP_CIRCLE_LINEAR;</span>
  
//<br />// Motion structure for a coordinate system<br />//<br />// 3rd order polynomial for the parametric parameter <br />//<br />// defines a parametric parameter p that varies from 0->1 over the<br />// segment of motion as a function of time.  All the associated axes <br />// derive their position from this (either circular or linear) <br />// using either a circular formula or linear formula
+
<span style="color: #0000ff;">typedef struct  // linear (only c and d are used)</span><br /><span style="color: #0000ff;">{  </span><br /><span style="color: #0000ff;">    double c;    </span><br /><span style="color: #0000ff;">    double d;   // always t^0 constant coefficient (starting position)</span><br /><span style="color: #0000ff;">} TRIP_LINEAR;</span>
  
typedef struct  <br />{   <br />    char trajectory_mode;    // Off, circular, or linear<br />    unsigned char x_axis;    // associated x axis / or special command <br />    unsigned char y_axis;    // associated y axis<br />    unsigned char z_axis;    // associated z axis<br />    unsigned char a_axis;    // associated a axis<br />    unsigned char b_axis;    // associated b axis<br />    unsigned char c_axis;    // associated c axis<br />    unsigned char u_axis;    // associated u axis<br />    unsigned char v_axis;    // associated v axis<br /> short int special_param; // special param 0<br /> double t;   // time duration (in sec) of trip state<br />    double a;   // t^3 coefficient  (Jerk)<br />    double b;   // t^2 coefficient  (initial acceleration)<br />    double c;   // t^1 coefficient  (initial velocity)<br />    double d;   // t^0 constant coefficient (starting position) <br />    TRIP_CIRCLE_LINEAR X,Y;<br />    TRIP_LINEAR Z,A,B,C,U,V;<br />} PARAMETRIC_COEFF;
+
<span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// Motion structure for a coordinate system</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// 3rd order polynomial for the parametric parameter </span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// defines a parametric parameter p that varies from 0->1 over the</span><br /><span style="color: #0000ff;">// segment of motion as a function of time.  All the associated axes </span><br /><span style="color: #0000ff;">// derive their position from this (either circular or linear) </span><br /><span style="color: #0000ff;">// using either a circular formula or linear formula</span>
  
 +
<span style="color: #0000ff;">typedef struct  </span><br /><span style="color: #0000ff;">{   </span><br /><span style="color: #0000ff;">    char trajectory_mode;    // Off, circular, or linear</span><br /><span style="color: #0000ff;">    unsigned char x_axis;    // associated x axis / or special command </span><br /><span style="color: #0000ff;">    unsigned char y_axis;    // associated y axis</span><br /><span style="color: #0000ff;">    unsigned char z_axis;    // associated z axis</span><br /><span style="color: #0000ff;">    unsigned char a_axis;    // associated a axis</span><br /><span style="color: #0000ff;">    unsigned char b_axis;    // associated b axis</span><br /><span style="color: #0000ff;">    unsigned char c_axis;    // associated c axis</span><br /><span style="color: #0000ff;">    unsigned char u_axis;    // associated u axis</span><br /><span style="color: #0000ff;">    unsigned char v_axis;    // associated v axis</span><br /><span style="color: #0000ff;"> short int special_param; // special param 0</span><br /><span style="color: #0000ff;"> double t;   // time duration (in sec) of trip state</span><br /><span style="color: #0000ff;">    double a;   // t^3 coefficient  (Jerk)</span><br /><span style="color: #0000ff;">    double b;   // t^2 coefficient  (initial acceleration)</span><br /><span style="color: #0000ff;">    double c;   // t^1 coefficient  (initial velocity)</span><br /><span style="color: #0000ff;">    double d;   // t^0 constant coefficient (starting position) </span><br /><span style="color: #0000ff;">    TRIP_CIRCLE_LINEAR X,Y;</span><br /><span style="color: #0000ff;">    TRIP_LINEAR Z,A,B,C,U,V;</span><br /><span style="color: #0000ff;">} PARAMETRIC_COEFF;</span>
  
<br />typedef struct  // 3rd order polynomial for a single trip state<br />{  <br />    int trajectory_mode;<br />    double t;   // time duration (in sec) of trip state<br />    double a;   // t^3 coefficient  (Jerk)<br />    double b;   // t^2 coefficient  (initial acceleration)<br />    double c;   // t^1 coefficient  (initial velocity)<br />    double d;   // t^0 constant coefficient (starting position)<br />} TRIP_COEFF;<br />            <br />typedef struct  // 2nd order IIR Filter<br />{<br />    float A1;   // output coefficient Z-1<br />    float A2;   // output coefficient Z-2<br />    float B0;   // input  coefficient Z-0   <br />    float B1;   // input  coefficient Z-1<br />    float B2;   // input  coefficient Z-2<br />    float d0,d1; // delay values<br />} IIR;
 
  
// MOTION TRAJECTORY STRUCTURES<br />    <br />extern double CS0_t;    // Current Coordinated Motion Segment Times<br />extern double CS0_TimeExecuted;  // Sum of all previous Coordinated Motion Segments Executed<br />extern double CS0_TimeDownloaded; // Sum of all Coord Motion Segments downloaded from Host<br />extern double CS0_TimeLost;   // Sum of all Coord Motion Segments downloaded from Host that have been discarded (buffer wrap)<br />extern double CS0_TimeBase;       // how much coordinated motion is advanced each tick<br />extern double CS0_TimeBaseDelta;   // max amount coordinated motion time base is changed per tick<br />extern float CS0_DecelTime;   // how long to take to stop the coordinated motion (computed by StopMotion)<br />extern double CS0_TimeBaseDesired; // Last Desired rate-of-time (TIMEBASE = real time)
+
<br /><span style="color: #0000ff;">typedef struct  // 3rd order polynomial for a single trip state</span><br /><span style="color: #0000ff;">{  </span><br /><span style="color: #0000ff;">    int trajectory_mode;</span><br /><span style="color: #0000ff;">    double t;   // time duration (in sec) of trip state</span><br /><span style="color: #0000ff;">    double a;   // t^3 coefficient  (Jerk)</span><br /><span style="color: #0000ff;">    double b;   // t^2 coefficient  (initial acceleration)</span><br /><span style="color: #0000ff;">    double c;   // t^1 coefficient  (initial velocity)</span><br /><span style="color: #0000ff;">    double d;   // t^0 constant coefficient (starting position)</span><br /><span style="color: #0000ff;">} TRIP_COEFF;</span><br /><span style="color: #0000ff;">            </span><br /><span style="color: #0000ff;">typedef struct  // 2nd order IIR Filter</span><br /><span style="color: #0000ff;">{</span><br /><span style="color: #0000ff;">    float A1;   // output coefficient Z-1</span><br /><span style="color: #0000ff;">    float A2;   // output coefficient Z-2</span><br /><span style="color: #0000ff;">    float B0;   // input  coefficient Z-0   </span><br /><span style="color: #0000ff;">    float B1;   // input  coefficient Z-1</span><br /><span style="color: #0000ff;">    float B2;   // input  coefficient Z-2</span><br /><span style="color: #0000ff;">    float d0,d1; // delay values</span><br /><span style="color: #0000ff;">} IIR;</span>
  
extern BOOL CS0_DoingRapid;    // Flag indicating Rapid in Progress so use normal Time Base ignoring FRO (except for FeedHold)      <br />extern BOOL CS0_Flushed;    // Coordinated motion Terminated so no longer necessary to worry about starvation       <br />extern BOOL CS0_HoldAtEnd;    // Coordinated motion to not Terminate but rather Hold when reaching end of buffer      
+
<span style="color: #0000ff;">// MOTION TRAJECTORY STRUCTURES</span><br /><span style="color: #0000ff;">    </span><br /><span style="color: #0000ff;">extern double CS0_t;    // Current Coordinated Motion Segment Times</span><br /><span style="color: #0000ff;">extern double CS0_TimeExecuted;  // Sum of all previous Coordinated Motion Segments Executed</span><br /><span style="color: #0000ff;">extern double CS0_TimeDownloaded; // Sum of all Coord Motion Segments downloaded from Host</span><br /><span style="color: #0000ff;">extern double CS0_TimeLost;   // Sum of all Coord Motion Segments downloaded from Host that have been discarded (buffer wrap)</span><br /><span style="color: #0000ff;">extern double CS0_TimeBase;       // how much coordinated motion is advanced each tick</span><br /><span style="color: #0000ff;">extern double CS0_TimeBaseDelta;   // max amount coordinated motion time base is changed per tick</span><br /><span style="color: #0000ff;">extern float CS0_DecelTime;   // how long to take to stop the coordinated motion (computed by StopMotion)</span><br /><span style="color: #0000ff;">extern double CS0_TimeBaseDesired; // Last Desired rate-of-time (TIMEBASE = real time)</span>
  
extern float CS0_NomDecel2TB2;   // Nominal Decel Time/(2 TIMEBASE^2) = Factor to relate buffer time to TimeBase to be able to stop
+
<span style="color: #0000ff;">extern BOOL CS0_DoingRapid;    // Flag indicating Rapid in Progress so use normal Time Base ignoring FRO (except for FeedHold)      </span><br /><span style="color: #0000ff;">extern BOOL CS0_Flushed;    // Coordinated motion Terminated so no longer necessary to worry about starvation       </span><br /><span style="color: #0000ff;">extern BOOL CS0_HoldAtEnd;    // Coordinated motion to not Terminate but rather Hold when reaching end of buffer      </span>
  
extern int CS0_StoppingState;    // emergency stop in progress, 0 = not stopping, 1=stopping coord motion, 2=stopping indep, 3=fully stopped, 4=ind stopped<br />extern PARAMETRIC_COEFF *CoordSystem0;  // current pointer into Coordinated Motion<br />extern PARAMETRIC_COEFF *LastCoordSystem0;<br />extern int ParametricIndex;    // Index of where to put next downloaded Coord Motion Segment or command<br />extern BOOL ParametricIndexWrapped;  // Indicates that Coord Motion Buffer has wrapped and additional segments will cause segments to be lost<br />extern PARAMETRIC_COEFF *ParametricCoeffs;  // Points to beginning of Coord Motion Buffer<br />extern PARAMETRIC_COEFF *ParametricCoeffsEnd;  // Points to End+1 of Allocated Coord Motion Buffer (MAX_SEGMENTS)<br />extern PARAMETRIC_COEFF *LastCoordSystem0;  // Pointer to last Segment executed when finished<br />extern PARAMETRIC_COEFF *LastValidTrajSegment; // Last Segment actually Executed
+
<span style="color: #0000ff;">extern float CS0_NomDecel2TB2;   // Nominal Decel Time/(2 TIMEBASE^2) = Factor to relate buffer time to TimeBase to be able to stop</span>
  
void StopCoordinatedMotion(void);   // bring any coordinated motion to a emergency stop ASAP<br />void ResumeCoordinatedMotion(void); // resume coordinated/Indep motion after an emergency stop<br />void ClearStopImmediately(void); // Clear Stop Condition without resuming<br />void UpdateStoppingState(void);  // Update Stopping Status (only required for indep stopping)<br />float GetNominalFROChangeTime(void);// computed time to change from FRO 1.0 to 0.0 for all defined CoordSystem Axes and their specified Vel, Accel, jerk<br />void SetFRO(float FRO); // change from current to the specified FRO (FRO=1.0=Realtime)using a nominal rate based on computed time to change from 1.0 to 0.0<br />void SetRapidFRO(float FRO); // change from current to the specified Rapid FRO (FRO=1.0=Realtime)using a nominal rate based on computed time to change from 1.0 to 0.0<br />void SetFROTemp(float FRO); // Temporarily change from current to the specified FRO using a nominal rate, override FeedHold, don't save as LastFRO <br />void SetFROwRate(float FRO, float DecelTime); // change from current to the specified FRO (FRO=1.0=Realtime)using a rate based on caller specified time to change from 1.0 to 0.0<br />void SetRapidFROwRate(float FRO, float DecelTime); // change from current to the specified Rapid FRO (FRO=1.0=Realtime)using a rate based on caller specified time to change from 1.0 to 0.0<br />void SetFROwRateTemp(float FRO, float DecelTime); //  Temporarily change from current to the specified FRO using a rate based on caller specified time, override FeedHold, don't save as LastFRO<br />extern float CS0_LastFRO;         // Last Desired FRO (used for Resume after FeedHold or for changes in FRO while in FeedHold) <br />extern float CS0_LastRapidFRO;      // Last Desired FRO (used for Resume after FeedHold during Rapid)
+
<span style="color: #0000ff;">extern int CS0_StoppingState;    // emergency stop in progress, 0 = not stopping, 1=stopping coord motion, 2=stopping indep, 3=fully stopped, 4=ind stopped</span><br /><span style="color: #0000ff;">extern PARAMETRIC_COEFF *CoordSystem0;  // current pointer into Coordinated Motion</span><br /><span style="color: #0000ff;">extern PARAMETRIC_COEFF *LastCoordSystem0;</span><br /><span style="color: #0000ff;">extern int ParametricIndex;    // Index of where to put next downloaded Coord Motion Segment or command</span><br /><span style="color: #0000ff;">extern BOOL ParametricIndexWrapped;  // Indicates that Coord Motion Buffer has wrapped and additional segments will cause segments to be lost</span><br /><span style="color: #0000ff;">extern PARAMETRIC_COEFF *ParametricCoeffs;  // Points to beginning of Coord Motion Buffer</span><br /><span style="color: #0000ff;">extern PARAMETRIC_COEFF *ParametricCoeffsEnd;  // Points to End+1 of Allocated Coord Motion Buffer (MAX_SEGMENTS)</span><br /><span style="color: #0000ff;">extern PARAMETRIC_COEFF *LastCoordSystem0;  // Pointer to last Segment executed when finished</span><br /><span style="color: #0000ff;">extern PARAMETRIC_COEFF *LastValidTrajSegment; // Last Segment actually Executed</span>
  
// Called after adding something to the Cood Motion Buffer.  Increments the Coord Motion Buffer pointer <br />// while keeping track of how much time is currently in the buffer (CS0_TimeDownloaded), also how much <br />// was over written due to buffer wrapping (CS0_TimeLost) to be able to determine the extent that it is <br />// possible to reverse, and keep the buffer terminated with TRAJECTORY_OFF<br />void IncParametricIndex(void);
+
<span style="color: #0000ff;">void StopCoordinatedMotion(void);   // bring any coordinated motion to a emergency stop ASAP</span><br /><span style="color: #0000ff;">void ResumeCoordinatedMotion(void); // resume coordinated/Indep motion after an emergency stop</span><br /><span style="color: #0000ff;">void ClearStopImmediately(void); // Clear Stop Condition without resuming</span><br /><span style="color: #0000ff;">void UpdateStoppingState(void);  // Update Stopping Status (only required for indep stopping)</span><br /><span style="color: #0000ff;">float GetNominalFROChangeTime(void);// computed time to change from FRO 1.0 to 0.0 for all defined CoordSystem Axes and their specified Vel, Accel, jerk</span><br /><span style="color: #0000ff;">void SetFRO(float FRO); // change from current to the specified FRO (FRO=1.0=Realtime)using a nominal rate based on computed time to change from 1.0 to 0.0</span><br /><span style="color: #0000ff;">void SetRapidFRO(float FRO); // change from current to the specified Rapid FRO (FRO=1.0=Realtime)using a nominal rate based on computed time to change from 1.0 to 0.0</span><br /><span style="color: #0000ff;">void SetFROTemp(float FRO); // Temporarily change from current to the specified FRO using a nominal rate, override FeedHold, don't save as LastFRO </span><br /><span style="color: #0000ff;">void SetFROwRate(float FRO, float DecelTime); // change from current to the specified FRO (FRO=1.0=Realtime)using a rate based on caller specified time to change from 1.0 to 0.0</span><br /><span style="color: #0000ff;">void SetRapidFROwRate(float FRO, float DecelTime); // change from current to the specified Rapid FRO (FRO=1.0=Realtime)using a rate based on caller specified time to change from 1.0 to 0.0</span><br /><span style="color: #0000ff;">void SetFROwRateTemp(float FRO, float DecelTime); //  Temporarily change from current to the specified FRO using a rate based on caller specified time, override FeedHold, don't save as LastFRO</span><br /><span style="color: #0000ff;">extern float CS0_LastFRO;         // Last Desired FRO (used for Resume after FeedHold or for changes in FRO while in FeedHold) </span><br /><span style="color: #0000ff;">extern float CS0_LastRapidFRO;      // Last Desired FRO (used for Resume after FeedHold during Rapid)</span>
  
<br />#define MAX_TRIP 20  // max trip states for individual axis moves<br />extern TRIP_COEFF TripCoeffs[N_CHANNELS][MAX_TRIP];  // Trip Coeff lists for each channel
+
<span style="color: #0000ff;">// Called after adding something to the Cood Motion Buffer.  Increments the Coord Motion Buffer pointer </span><br /><span style="color: #0000ff;">// while keeping track of how much time is currently in the buffer (CS0_TimeDownloaded), also how much </span><br /><span style="color: #0000ff;">// was over written due to buffer wrapping (CS0_TimeLost) to be able to determine the extent that it is </span><br /><span style="color: #0000ff;">// possible to reverse, and keep the buffer terminated with TRAJECTORY_OFF</span><br /><span style="color: #0000ff;">void IncParametricIndex(void);</span>
  
// Limit Switch Options
+
<br /><span style="color: #0000ff;">#define MAX_TRIP 20  // max trip states for individual axis moves</span><br /><span style="color: #0000ff;">extern TRIP_COEFF TripCoeffs[N_CHANNELS][MAX_TRIP];  // Trip Coeff lists for each channel</span>
  
// Bit 0 1=Stop Motor on Neg Limit, 0=Ignore Neg limit<br />// Bit 1 1=Stop Motor on Pos Limit, 0=Ignore Pos limit<br />// Bit 2 Neg Limit Polarity 0=stop on high, 1=stop on low<br />// Bit 3 Pos Limit Polarity 0=stop on high, 1=stop on low<br />//<br />// Bits 4-7 Action - 0 Kill Motor Drive<br />//                   1 Disallow drive in direction of limit<br />//                   2 Stop movement<br />//<br />// Bit 8=use Extended Limit Bit Numbers (LimitNegSwitchBit,LimitPosSwitchBit)<br />//<br />// (for legacy support allow packed 8-bit numbers)<br />// Bits 16-23 Neg Limit I/O Bit number<br />// Bits 24-31 Pos Limit I/O Bit number
+
<span style="color: #0000ff;">// Limit Switch Options</span>
  
 +
<span style="color: #0000ff;">// Bit 0 1=Stop Motor on Neg Limit, 0=Ignore Neg limit</span><br /><span style="color: #0000ff;">// Bit 1 1=Stop Motor on Pos Limit, 0=Ignore Pos limit</span><br /><span style="color: #0000ff;">// Bit 2 Neg Limit Polarity 0=stop on high, 1=stop on low</span><br /><span style="color: #0000ff;">// Bit 3 Pos Limit Polarity 0=stop on high, 1=stop on low</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// Bits 4-7 Action - 0 Kill Motor Drive</span><br /><span style="color: #0000ff;">//                   1 Disallow drive in direction of limit</span><br /><span style="color: #0000ff;">//                   2 Stop movement</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// Bit 8=use Extended Limit Bit Numbers (LimitNegSwitchBit,LimitPosSwitchBit)</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// (for legacy support allow packed 8-bit numbers)</span><br /><span style="color: #0000ff;">// Bits 16-23 Neg Limit I/O Bit number</span><br /><span style="color: #0000ff;">// Bits 24-31 Pos Limit I/O Bit number</span>
  
<br />//  M A I N   S T R U C T U R E   T H A T   D E F I N E S   A N   A X I S
 
  
typedef struct<br />{   <br />    int ChanNumber;                 // channel number 0-3<br />    int Enable;                     // enables feedback<br />    int InputMode;                  // sets position input mode (See Axis Input Modes)<br />    int OutputMode;     // sets servo/motor mode    (See Axis Output Modes)<br />    int LimitSwitchOptions;         // see above for description<br />    int LimitSwitchNegBit;   // Neg Limit I/O Bit number<br />    int LimitSwitchPosBit;   // Pos Limit I/O Bit number<br /> int MasterAxis;     // -1 if none, else master axis channel to slave to<br /> double SlaveGain;    // Multiplicative Factor for slave motion <br />    double MaxFollowingError;       // Kill motor if error exceeds this value<br />    double LastFollowingError;      // Last Measured Following Error<br />    double t;                       // current time in secs within the trip state<br />    double Dest;                    // current dest position for servo<br /> double UnfilteredDest;   // unfiltered current dest position for servo (before CM smoothing)<br />    double DestOffset;              // Additional offset to position (used by Injection)<br />    float Vel;                      // max velocity for the move trajectory<br />    float Accel;                    // max Acceleration for the move trajectory<br />    float Jerk;                     // max Jerk (rate of change of Accel) for the move<br />    float FFAccel;                  // Acceleration feed forward<br />    float FFVel;                    // Velocity feed forward<br />    double Position;                // encoder, ADC, Resolver, reading<br />    double invDistPerCycle;         // for stepper distance for one complete cycle (4 full steps)<br />                                    // for brushless 3-4 phase encoder counts for one complete cycle<br />                                    // (saved as reciprical for speed)      <br />    float StepperAmplitude;         // Microstepper Amplitude in PWM counts to apply (moving slow, without lead comp)<br />    float Output;                   // Value output to PWM or DAC or CL Stepper offset <br />    float prev_output;              // previous Output so Slave can track Master when in CL Stepper <br />    float Lead;                     // Lead compensation to correct for step motor inductance<br />    TRIP_COEFF *pcoeff;             // pointer to coeff that interrupt routine uses, NULL if done <br />    double last_position;           // last measured error<br />    double last_dest;               // last destination from beginning of prev servo interrupt<br /> double prev_dest;    // prev destination from end of prev servo interrupt (will incl User changes to Dest)<br /> int LastNonZeroDir;    // Last direction we actually moved some amount(+1=Positive, 0=undefined, -1=negative)<br /> int DirectionOfMotion;   // Dest change was in this direction (+1=Positive, 0=none, -1=negative)<br /> float last_vel;                 // last destination velocity<br />    float x1last,x2last;            // used with lead compensation <br />    int   OutputChan0,OutputChan1;  // pwm or DAC channels to use     <br />    int   InputChan0,InputChan1;    // Encoder or ADC channels to use <br />    float InputOffset0,InputGain0;  // offsets and gains for Resolver Input 0,1 (x'=ax+b)<br />    float InputOffset1,InputGain1;  //   or for ADC, or (InputGain0=-1 reverses encoder)<br /> float OutputGain;    // Scale or Reverse Output Magnitude or Direction<br /> float OutputOffset;    // Offset the output<br />    float CommutationOffset;        // 3 or 4 phase commutation offset, PhaseA = sin((Position+CommutationOffset)*invDistPerCycle)<br />    float last_theta;               // last resolver theta reading<br />    float theta_correction;         // resolver correction offset to correct for nonlinearities<br />    signed char last_enc;           // last fpga encoder reading<br />    float P,I,D;                    // pid gain values<br />    float MaxI;                     // max integrator windup<br />    float MaxErr;                   // error saturates at this value<br />    float integrator;               // current integrator vlue<br />    float MaxOutput;                // max allowed servo output<br />    float DeadBandRange;            // Range about zero where gain change occurs<br />    float DeadBandGain;             // Additional gain within DeadBand Range<br /> int LastMotionType;    // Type of last move - used in Immediate Stop/Resume<br /> double LastMotionDest;   // Where last move was to go - used in Immediate Stop/Resume<br /> float ExpMotionVc;    // Velocity point on exp curve where Max Accel is obtained<br /> float ExpMotionXc;    // Distance point on exponential curve where Max Accel is obtained<br /> float SoftLimitNeg;    // Negative Soft Limit (counts)<br /> float SoftLimitPos;    // Positive Soft Limit (counts)<br /> int BacklashMode;    // Type of correction:  Currently only BACKLASH_OFF, BACKLASH_LINEAR<br /> float BacklashAmount;   // Amount of Backlash to be applied<br /> float BacklashRate;    // Rate Backlash shoule be applied, counts/sec<br /> int BacklashDirection;   // Last non zero direction moved<br /> float PrevBacklashDest;   // Prev Destination where backlash was determined to allow small hysteresis<br /> float Backlash;     // current amount of compensation being applied
+
<br /><span style="color: #0000ff;">//  M A I N   S T R U C T U R E   T H A T   D E F I N E S   A N   A X I S</span>
  
    TRIP_COEFF *c;                // move profile polynomial coefficients list (up tp MAX_TRIP)<br />    IIR iir[N_IIR_FILTERS];         // several IIR filters<br />}CHAN;
+
<span style="color: #0000ff;">typedef struct</span><br /><span style="color: #0000ff;">{   </span><br /><span style="color: #0000ff;">    int ChanNumber;                 // channel number 0-3</span><br /><span style="color: #0000ff;">    int Enable;                     // enables feedback</span><br /><span style="color: #0000ff;">    int InputMode;                  // sets position input mode (See Axis Input Modes)</span><br /><span style="color: #0000ff;">    int OutputMode;     // sets servo/motor mode    (See Axis Output Modes)</span><br /><span style="color: #0000ff;">    int LimitSwitchOptions;         // see above for description</span><br /><span style="color: #0000ff;">    int LimitSwitchNegBit;   // Neg Limit I/O Bit number</span><br /><span style="color: #0000ff;">    int LimitSwitchPosBit;   // Pos Limit I/O Bit number</span><br /><span style="color: #0000ff;"> int MasterAxis;     // -1 if none, else master axis channel to slave to</span><br /><span style="color: #0000ff;"> double SlaveGain;    // Multiplicative Factor for slave motion </span><br /><span style="color: #0000ff;">    double MaxFollowingError;       // Kill motor if error exceeds this value</span><br /><span style="color: #0000ff;">    double LastFollowingError;      // Last Measured Following Error</span><br /><span style="color: #0000ff;">    double t;                       // current time in secs within the trip state</span><br /><span style="color: #0000ff;">    double Dest;                    // current dest position for servo</span><br /><span style="color: #0000ff;"> double UnfilteredDest;   // unfiltered current dest position for servo (before CM smoothing)</span><br /><span style="color: #0000ff;">    double DestOffset;              // Additional offset to position (used by Injection)</span><br /><span style="color: #0000ff;">    float Vel;                      // max velocity for the move trajectory</span><br /><span style="color: #0000ff;">    float Accel;                    // max Acceleration for the move trajectory</span><br /><span style="color: #0000ff;">    float Jerk;                     // max Jerk (rate of change of Accel) for the move</span><br /><span style="color: #0000ff;">    float FFAccel;                  // Acceleration feed forward</span><br /><span style="color: #0000ff;">    float FFVel;                    // Velocity feed forward</span><br /><span style="color: #0000ff;">    double Position;                // encoder, ADC, Resolver, reading</span><br /><span style="color: #0000ff;">    double invDistPerCycle;         // for stepper distance for one complete cycle (4 full steps)</span><br /><span style="color: #0000ff;">                                    // for brushless 3-4 phase encoder counts for one complete cycle</span><br /><span style="color: #0000ff;">                                    // (saved as reciprical for speed)      </span><br /><span style="color: #0000ff;">    float StepperAmplitude;         // Microstepper Amplitude in PWM counts to apply (moving slow, without lead comp)</span><br /><span style="color: #0000ff;">    float Output;                   // Value output to PWM or DAC or CL Stepper offset </span><br /><span style="color: #0000ff;">    float prev_output;              // previous Output so Slave can track Master when in CL Stepper </span><br /><span style="color: #0000ff;">    float Lead;                     // Lead compensation to correct for step motor inductance</span><br /><span style="color: #0000ff;">    TRIP_COEFF *pcoeff;             // pointer to coeff that interrupt routine uses, NULL if done </span><br /><span style="color: #0000ff;">    double last_position;           // last measured error</span><br /><span style="color: #0000ff;">    double last_dest;               // last destination from beginning of prev servo interrupt</span><br /><span style="color: #0000ff;"> double prev_dest;    // prev destination from end of prev servo interrupt (will incl User changes to Dest)</span><br /><span style="color: #0000ff;"> int LastNonZeroDir;    // Last direction we actually moved some amount(+1=Positive, 0=undefined, -1=negative)</span><br /><span style="color: #0000ff;"> int DirectionOfMotion;   // Dest change was in this direction (+1=Positive, 0=none, -1=negative)</span><br /><span style="color: #0000ff;"> float last_vel;                 // last destination velocity</span><br /><span style="color: #0000ff;">    float x1last,x2last;            // used with lead compensation </span><br /><span style="color: #0000ff;">    int   OutputChan0,OutputChan1;  // pwm or DAC channels to use     </span><br /><span style="color: #0000ff;">    int   InputChan0,InputChan1;    // Encoder or ADC channels to use </span><br /><span style="color: #0000ff;">    float InputOffset0,InputGain0;  // offsets and gains for Resolver Input 0,1 (x'=ax+b)</span><br /><span style="color: #0000ff;">    float InputOffset1,InputGain1;  //   or for ADC, or (InputGain0=-1 reverses encoder)</span><br /><span style="color: #0000ff;"> float OutputGain;    // Scale or Reverse Output Magnitude or Direction</span><br /><span style="color: #0000ff;"> float OutputOffset;    // Offset the output</span><br /><span style="color: #0000ff;">    float CommutationOffset;        // 3 or 4 phase commutation offset, PhaseA = sin((Position+CommutationOffset)*invDistPerCycle)</span><br /><span style="color: #0000ff;">    float last_theta;               // last resolver theta reading</span><br /><span style="color: #0000ff;">    float theta_correction;         // resolver correction offset to correct for nonlinearities</span><br /><span style="color: #0000ff;">    signed char last_enc;           // last fpga encoder reading</span><br /><span style="color: #0000ff;">    float P,I,D;                    // pid gain values</span><br /><span style="color: #0000ff;">    float MaxI;                     // max integrator windup</span><br /><span style="color: #0000ff;">    float MaxErr;                   // error saturates at this value</span><br /><span style="color: #0000ff;">    float integrator;               // current integrator vlue</span><br /><span style="color: #0000ff;">    float MaxOutput;                // max allowed servo output</span><br /><span style="color: #0000ff;">    float DeadBandRange;            // Range about zero where gain change occurs</span><br /><span style="color: #0000ff;">    float DeadBandGain;             // Additional gain within DeadBand Range</span><br /><span style="color: #0000ff;"> int LastMotionType;    // Type of last move - used in Immediate Stop/Resume</span><br /><span style="color: #0000ff;"> double LastMotionDest;   // Where last move was to go - used in Immediate Stop/Resume</span><br /><span style="color: #0000ff;"> float ExpMotionVc;    // Velocity point on exp curve where Max Accel is obtained</span><br /><span style="color: #0000ff;"> float ExpMotionXc;    // Distance point on exponential curve where Max Accel is obtained</span><br /><span style="color: #0000ff;"> float SoftLimitNeg;    // Negative Soft Limit (counts)</span><br /><span style="color: #0000ff;"> float SoftLimitPos;    // Positive Soft Limit (counts)</span><br /><span style="color: #0000ff;"> int BacklashMode;    // Type of correction:  Currently only BACKLASH_OFF, BACKLASH_LINEAR</span><br /><span style="color: #0000ff;"> float BacklashAmount;   // Amount of Backlash to be applied</span><br /><span style="color: #0000ff;"> float BacklashRate;    // Rate Backlash shoule be applied, counts/sec</span><br /><span style="color: #0000ff;"> int BacklashDirection;   // Last non zero direction moved</span><br /><span style="color: #0000ff;"> float PrevBacklashDest;   // Prev Destination where backlash was determined to allow small hysteresis</span><br /><span style="color: #0000ff;"> float Backlash;     // current amount of compensation being applied</span>
  
// continuously sent by DMA to DACs<br />extern short int DAC_Buffer[N_DACS];   //  format    12 bits data <br />#define DAC(ch, v) DAC_Buffer[ch]=((v-2048)&0xfff)  // set DAC channel to value (range -2048/+2047)
+
<span style="color: #0000ff;">    TRIP_COEFF *c;                // move profile polynomial coefficients list (up tp MAX_TRIP)</span><br /><span style="color: #0000ff;">    IIR iir[N_IIR_FILTERS];         // several IIR filters</span><br /><span style="color: #0000ff;">}CHAN;</span>
  
extern int ADC_BufferIn[N_ADCS];     //  format   12 bits data <br />#define ADC(ch) (ADC_BufferIn[ch]-2048)   // return ADC reading of specified channel (range -2048/2047)extern int ADC_BufferIn[N_ADCS];     //  format   4-dummy bits 12 bits data 16 dummy
+
<span style="color: #0000ff;">// continuously sent by DMA to DACs</span><br /><span style="color: #0000ff;">extern short int DAC_Buffer[N_DACS];   //  format    12 bits data </span><br /><span style="color: #0000ff;">#define DAC(ch, v) DAC_Buffer[ch]=((v-2048)&0xfff)  // set DAC channel to value (range -2048/+2047)</span>
  
extern int ADC_BufferInSnap[2*N_ADCS_SNAP];   //  Snap Amp Current ADC format  16-bits data
+
<span style="color: #0000ff;">extern int ADC_BufferIn[N_ADCS];     //  format   12 bits data </span><br /><span style="color: #0000ff;">#define ADC(ch) (ADC_BufferIn[ch]-2048)   // return ADC reading of specified channel (range -2048/2047)extern int ADC_BufferIn[N_ADCS];     //  format   4-dummy bits 12 bits data 16 dummy</span>
  
#define FULL_RANGE_CURRENT 4.85f<br />#define MeasuredAxisAmps(axis) ((ADC(axis+4)+2048)*(FULL_RANGE_CURRENT/4096.0f))  // returns measured current in an axis (Amperes)
+
<span style="color: #0000ff;">extern int ADC_BufferInSnap[2*N_ADCS_SNAP];   /Snap Amp Current ADC format  16-bits data</span>
  
// On board Power Amp PWM control
+
# <span style="color: #0000ff;">define FULL_RANGE_CURRENT 4.85f</span><br /><span style="color: #0000ff;">#define MeasuredAxisAmps(axis) ((ADC(axis+4)+2048)*(FULL_RANGE_CURRENT/4096.0f))  // returns measured current in an axis (Amperes)</span>
  
#define MAX_PWMR_VALUE 400  // Max value for PWMs in Recirculate mode<br />void WritePWMR(int ch, int v);  // Write to PWM - Recirculate mode (+ or - power then shorted)<br />#define MAX_PWM_VALUE 230  // Max value for PWMs in antiphase mode<br />void WritePWM(int ch, int v);   // Write to PWM - locked anti-phase mode (+ power then - power)
+
<span style="color: #0000ff;">// On board Power Amp PWM control</span>
  
#define MAX_PWMC_VALUE 1000  // Max value for PWMs in Current Mode (SnapAmps only)<br />void WritePWMC(int ch, int v);  // Write to PWM - Current Loop mode - Always optimal decay
+
# <span style="color: #0000ff;">define MAX_PWMR_VALUE 400  // Max value for PWMs in Recirculate mode</span><br /><span style="color: #0000ff;">void WritePWMR(int ch, int v);  // Write to PWM - Recirculate mode (+ or - power then shorted)</span><br /><span style="color: #0000ff;">#define MAX_PWM_VALUE 230  // Max value for PWMs in antiphase mode</span><br /><span style="color: #0000ff;">void WritePWM(int ch, int v);   // Write to PWM - locked anti-phase mode (+ power then - power)</span>
  
extern int SnapAmpPresent;         // 1 = SnapAmp Present 0= Not Present<br />extern int DisableSnapAmpDetectOnBoot;  // disables using Bits 12,13, and 15 on JP7 detect AutoDetect SnapAmps<br />void WriteSnapAmp(int add, int data);  // write a 16-bit word directly to SnapAmp FPGA <br />int ReadSnapAmp(int add);     // read a 16-bit word directly from SnapAmp FPGA
+
# <span style="color: #0000ff;">define MAX_PWMC_VALUE 1000  // Max value for PWMs in Current Mode (SnapAmps only)</span><br /><span style="color: #0000ff;">void WritePWMC(int ch, int v);  // Write to PWM - Current Loop mode - Always optimal decay</span>
  
<br />// Digital I/O bit PWM control (8 I/O bits on KFlop JP6 may be pulsed)
+
<span style="color: #0000ff;">extern int SnapAmpPresent;         // 1 = SnapAmp Present 0= Not Present</span><br /><span style="color: #0000ff;">extern int DisableSnapAmpDetectOnBoot;  // disables using Bits 12,13, and 15 on JP7 detect AutoDetect SnapAmps</span><br /><span style="color: #0000ff;">void WriteSnapAmp(int add, int data);  // write a 16-bit word directly to SnapAmp FPGA </span><br /><span style="color: #0000ff;">int ReadSnapAmp(int add);     // read a 16-bit word directly from SnapAmp FPGA</span>
  
#define N_IO_PWMS 8    // Number of pwms that may be assigned to GPIO bits  <br />#define IO_PWMS 0xD0     // FPGA offset to IO PWM registers (2 bytes each - value, enable(bit0))<br />#define IO_PWMS_PRESCALE 0x2f   // FPGA offset to IO PWM Pre-Scale clock divider 0-255, 0 = 16.6MHz, 1=8.33MHz, ...<br />#define IO_PWM_MAX_VALUE 255    // 0 = 0%, 255 = 100 % duty cycle
+
<br /><span style="color: #0000ff;">// Digital I/O bit PWM control (8 I/O bits on KFlop JP6 may be pulsed)</span>
  
// addr to r/w encoder noise rejection filter value (0..255), <br />// Bit8 switches Encoders Ch4-7 from JP5 to JP6, <br />// Bit9 switches Encoders Ch0-3 from JP7 to JP4<br />#define ENC_NOISE_FILTER_ADD  0x05   <br />#define ENC_0_3_JP4 0x200<br />#define ENC_4_7_JP6 0x100<br />#define ENC_NOISE_FILTER_DEFAULT_VAL 7 // noise rejection filter default value (100MHz/3/7/2 = 2MHz)
+
# <span style="color: #0000ff;">define N_IO_PWMS 8    // Number of pwms that may be assigned to GPIO bits  </span><br /><span style="color: #0000ff;">#define IO_PWMS 0xD0     // FPGA offset to IO PWM registers (2 bytes each - value, enable(bit0))</span><br /><span style="color: #0000ff;">#define IO_PWMS_PRESCALE 0x2f   // FPGA offset to IO PWM Pre-Scale clock divider 0-255, 0 = 16.6MHz, 1=8.33MHz, ...</span><br /><span style="color: #0000ff;">#define IO_PWM_MAX_VALUE 255    // 0 = 0%, 255 = 100 % duty cycle</span>
  
<br />#define ENC_NOISE_ERR_ADD 0x08  // encoder sudden change by 2 error address<br />#define ENC_NOISE_ERR_BIT0 4  // encoder sudden change by 2 error bit for encoder 0<br />#define ENC_NOISE_ERR_BIT1 5  // encoder sudden change by 2 error bit for encoder 1<br />#define ENC_NOISE_ERR_BIT2 6  // encoder sudden change by 2 error bit for encoder 2<br />#define ENC_NOISE_ERR_BIT3 7  // encoder sudden change by 2 error bit for encoder 3
+
<span style="color: #0000ff;">// addr to r/w encoder noise rejection filter value (0..255), </span><br /><span style="color: #0000ff;">// Bit8 switches Encoders Ch4-7 from JP5 to JP6, </span><br /><span style="color: #0000ff;">// Bit9 switches Encoders Ch0-3 from JP7 to JP4</span><br /><span style="color: #0000ff;">#define ENC_NOISE_FILTER_ADD  0x05   </span><br /><span style="color: #0000ff;">#define ENC_0_3_JP4 0x200</span><br /><span style="color: #0000ff;">#define ENC_4_7_JP6 0x100</span><br /><span style="color: #0000ff;">#define ENC_NOISE_FILTER_DEFAULT_VAL 7 // noise rejection filter default value (100MHz/3/7/2 = 2MHz)</span>
  
 +
<br /><span style="color: #0000ff;">#define ENC_NOISE_ERR_ADD 0x08  // encoder sudden change by 2 error address</span><br /><span style="color: #0000ff;">#define ENC_NOISE_ERR_BIT0 4  // encoder sudden change by 2 error bit for encoder 0</span><br /><span style="color: #0000ff;">#define ENC_NOISE_ERR_BIT1 5  // encoder sudden change by 2 error bit for encoder 1</span><br /><span style="color: #0000ff;">#define ENC_NOISE_ERR_BIT2 6  // encoder sudden change by 2 error bit for encoder 2</span><br /><span style="color: #0000ff;">#define ENC_NOISE_ERR_BIT3 7  // encoder sudden change by 2 error bit for encoder 3</span>
  
// FPGA Step and Direction Frequency Generators (8) are available<br />//<br />// <br />#define NSTEPDIR 8
 
  
// address of 6 bit pulse length 0-63= # 16.666MHz clocks, <br />// bit6 muxes generators 0-3 from JP7 to JP4 and JP6, <br />// bit7 reverses polarity (0=pulses low & Pos Dir high, 1=pulses high & Pos Dir Low)<br />#define STEP_PULSE_LENGTH_ADD 0x06
+
<span style="color: #0000ff;">// FPGA Step and Direction Frequency Generators (8) are available</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// </span><br /><span style="color: #0000ff;">#define NSTEPDIR 8</span>
  
#define STEP_PULSE_LENGTH_DEFAULT 32 // default pulse length of ~ 2us
+
<span style="color: #0000ff;">// address of 6 bit pulse length 0-63= # 16.666MHz clocks, </span><br /><span style="color: #0000ff;">// bit6 muxes generators 0-3 from JP7 to JP4 and JP6, </span><br /><span style="color: #0000ff;">// bit7 reverses polarity (0=pulses low & Pos Dir high, 1=pulses high & Pos Dir Low)</span><br /><span style="color: #0000ff;">#define STEP_PULSE_LENGTH_ADD 0x06</span>
  
#define STEP_RATE_ADD 0x3c // write a 32 bit word - Bit31=enable, Bit27=Drive, Bits24-26=chan, 0-23= signed fraction of 16.666MHz<br />#define STEP_POSITION_ADD0 0x40 // read a 16 bit word - step count0 - 9 bits signed position and 7 bits of fraction<br />#define STEP_POSITION_ADD1 0x42 // read a 16 bit word - step count1 - 9 bits signed position and 7 bits of fraction<br />#define STEP_POSITION_ADD2 0x44 // read a 16 bit word - step count2 - 9 bits signed position and 7 bits of fraction<br />#define STEP_POSITION_ADD3 0x46 // read a 16 bit word - step count3 - 9 bits signed position and 7 bits of fraction<br />#define STEP_POSITION_ADD4 0x48 // read a 16 bit word - step count4 - 9 bits signed position and 7 bits of fraction<br />#define STEP_POSITION_ADD5 0x4a // read a 16 bit word - step count5 - 9 bits signed position and 7 bits of fraction<br />#define STEP_POSITION_ADD6 0x4c // read a 16 bit word - step count6 - 9 bits signed position and 7 bits of fraction<br />#define STEP_POSITION_ADD7 0x4e // read a 16 bit word - step count7 - 9 bits signed position and 7 bits of fraction
+
# <span style="color: #0000ff;">define STEP_PULSE_LENGTH_DEFAULT 32 // default pulse length of ~ 2us</span>
  
<br />extern int KanalogPresent;     // 1=Kanalog Present<br />extern int DisableKanalogDetectOnBoot;  // disables using Bits 16-20 and 23 on JP4 to detect AutoDetect Kanalog
+
# <span style="color: #0000ff;">define STEP_RATE_ADD 0x3c // write a 32 bit word - Bit31=enable, Bit27=Drive, Bits24-26=chan, 0-23= signed fraction of 16.666MHz</span><br /><span style="color: #0000ff;">#define STEP_POSITION_ADD0 0x40 // read a 16 bit word - step count0 - 9 bits signed position and 7 bits of fraction</span><br /><span style="color: #0000ff;">#define STEP_POSITION_ADD1 0x42 // read a 16 bit word - step count1 - 9 bits signed position and 7 bits of fraction</span><br /><span style="color: #0000ff;">#define STEP_POSITION_ADD2 0x44 // read a 16 bit word - step count2 - 9 bits signed position and 7 bits of fraction</span><br /><span style="color: #0000ff;">#define STEP_POSITION_ADD3 0x46 // read a 16 bit word - step count3 - 9 bits signed position and 7 bits of fraction</span><br /><span style="color: #0000ff;">#define STEP_POSITION_ADD4 0x48 // read a 16 bit word - step count4 - 9 bits signed position and 7 bits of fraction</span><br /><span style="color: #0000ff;">#define STEP_POSITION_ADD5 0x4a // read a 16 bit word - step count5 - 9 bits signed position and 7 bits of fraction</span><br /><span style="color: #0000ff;">#define STEP_POSITION_ADD6 0x4c // read a 16 bit word - step count6 - 9 bits signed position and 7 bits of fraction</span><br /><span style="color: #0000ff;">#define STEP_POSITION_ADD7 0x4e // read a 16 bit word - step count7 - 9 bits signed position and 7 bits of fraction</span>
  
extern int KStepPresent;       // 1=KStep Present - set this to mux inputs into virtual bits 48-63
+
<br /><span style="color: #0000ff;">extern int KanalogPresent;     // 1=Kanalog Present</span><br /><span style="color: #0000ff;">extern int DisableKanalogDetectOnBoot;  // disables using Bits 16-20 and 23 on JP4 to detect AutoDetect Kanalog</span>
  
// Kanalog FPGA Registers for internal use only<br />#define KAN_TRIG_REG 0xA0  // triggers a transfer to/from Kanalog, 1-enables Kanalog, 2-enables RS232, 3-both<br />#define KAN_DAC_REGS 0x80    // 8 - 12 bit r/w regs<br />#define KAN_FET_OPTO 0x88    // 1 - 16 bit 15-8 FET drivers, 7-0 Opto Outputs<br />#define KAN_GPOUT    0x89    // 1 - 8 bit   7-0 GP 3.3V OUTPUTS<br />#define KAN_ADC_REGS 0x90    // 8 - 12 bit r/w regs<br />#define KAN_OPTOIN_GPIN 0x98   // 1 - 16 bit 15-8 OptoInputs, 7-0 GP 3.3V inputs
+
<span style="color: #0000ff;">extern int KStepPresent;       // 1=KStep Present - set this to mux inputs into virtual bits 48-63</span>
  
// Kanalog IO Bit numbers<br />#define KAN_INPUTS 128   // 16 Bits 128-143 (128-135 GPIN, 136-143 Opto in)<br />#define KAN_NINPUTS 16   // 16 Input Bits<br />#define KAN_OUTPUTS 144   // 24 Bits 144-167 (144-151 Opto out, 152-159 FET/Relay Drivers, 160-167 GPOUT)<br />#define KAN_NOUTPUTS 24   // 24 output Bits
+
<span style="color: #0000ff;">// Kanalog FPGA Registers for internal use only</span><br /><span style="color: #0000ff;">#define KAN_TRIG_REG 0xA0  // triggers a transfer to/from Kanalog, 1-enables Kanalog, 2-enables RS232, 3-both</span><br /><span style="color: #0000ff;">#define KAN_DAC_REGS 0x80    // 8 - 12 bit r/w regs</span><br /><span style="color: #0000ff;">#define KAN_FET_OPTO 0x88    // 1 - 16 bit 15-8 FET drivers, 7-0 Opto Outputs</span><br /><span style="color: #0000ff;">#define KAN_GPOUT    0x89    // 1 - 8 bit   7-0 GP 3.3V OUTPUTS</span><br /><span style="color: #0000ff;">#define KAN_ADC_REGS 0x90    // 8 - 12 bit r/w regs</span><br /><span style="color: #0000ff;">#define KAN_OPTOIN_GPIN 0x98   // 1 - 16 bit 15-8 OptoInputs, 7-0 GP 3.3V inputs</span>
  
 +
<span style="color: #0000ff;">// Kanalog IO Bit numbers</span><br /><span style="color: #0000ff;">#define KAN_INPUTS 128   // 16 Bits 128-143 (128-135 GPIN, 136-143 Opto in)</span><br /><span style="color: #0000ff;">#define KAN_NINPUTS 16   // 16 Input Bits</span><br /><span style="color: #0000ff;">#define KAN_OUTPUTS 144   // 24 Bits 144-167 (144-151 Opto out, 152-159 FET/Relay Drivers, 160-167 GPOUT)</span><br /><span style="color: #0000ff;">#define KAN_NOUTPUTS 24   // 24 output Bits</span>
  
// 3 Phase manual control. Angle is specified in cycles.<br />// cycles is a double precision value an may be a very<br />// large number.  Only the fractional part will be used.  <br />#define MAXV 230.0f // Max allowed 3 phase vector (512/2/sin(60) - EOFF*4)<br />void Write3PH(CHAN *ch0, float v, double angle_in_cycles); // put a voltage v on a 3 Phase motor at specified commutation angle<br />void Write4PH(CHAN *ch0, float v, double angle_in_cycles); // put a voltage v on a 4 Phase motor at specified commutation angle
 
  
<br />extern int LastPWM[N_PWMS+2*N_PWMS_SNAP];    // +/- 255 counts
+
<span style="color: #0000ff;">// 3 Phase manual control. Angle is specified in cycles.</span><br /><span style="color: #0000ff;">// cycles is a double precision value an may be a very</span><br /><span style="color: #0000ff;">// large number.  Only the fractional part will be used.  </span><br /><span style="color: #0000ff;">#define MAXV 230.0f // Max allowed 3 phase vector (512/2/sin(60) - EOFF*4)</span><br /><span style="color: #0000ff;">void Write3PH(CHAN *ch0, float v, double angle_in_cycles); // put a voltage v on a 3 Phase motor at specified commutation angle</span><br /><span style="color: #0000ff;">void Write4PH(CHAN *ch0, float v, double angle_in_cycles); // put a voltage v on a 4 Phase motor at specified commutation angle</span>
  
int ReadADC(int ch);           // User Programs should use ADC() command instead<br />void WriteDAC(int ch, int v);  // User Programs should use DAC() command instead
+
<br /><span style="color: #0000ff;">extern int LastPWM[N_PWMS+2*N_PWMS_SNAP];    // +/- 255 counts</span>
  
 +
<span style="color: #0000ff;">int ReadADC(int ch);           // User Programs should use ADC() command instead</span><br /><span style="color: #0000ff;">void WriteDAC(int ch, int v);  // User Programs should use DAC() command instead</span>
  
//  S P I N D L E   A N D   T H R E A D I N G   S U P P O R T
 
  
// main Spindle data structure which maintains Spindle <br />// Position Info and threading control
+
<span style="color: #0000ff;">//  S P I N D L E   A N D   T H R E A D I N G   S U P P O R T</span>
  
typedef struct <br />{<br /> double Position;   // position in revs<br /> double StartPosition;  // position in revs to begin threading<br /> double LastUpdatePosition; // last position in revs where speed was computed<br /> double RevsPerCount;  // inverse of counts/rev<br /> double UpdateTick;   // which servo tic we should calc RPM<br /> double DeltaTicks;   // # Servo tics between speed measurement<br /> double AdjTimeFilt;   // Lead Adjusted, filtered, time<br /> double LastCSTime;   // Previous Coordinate System Time<br /> double *pEncoderPos;  // pointer to Spindle Position <br /> double K;     // Tau low pass filter coefficient<br /> float TrueSpeedRPS;   // last measured speed<br /> float InvBaseSpeedRPS;  // Reciprocal of Base speed of which trajectory was planned<br /> double InvBaseSpeedRPSK1; // InvBaseSpeedRPS * (1-K)<br /> float InvUpdateTime;  // Reciprocal of update time to avoid division<br /> float Tau;     // Time constant for spindle filtering<br /> int Type;     // Type=0 None, Type=1 uses encoder to measure spindle position<br /> int ThreadingActive;  // True when threading is in progress
+
<span style="color: #0000ff;">// main Spindle data structure which maintains Spindle </span><br /><span style="color: #0000ff;">// Position Info and threading control</span>
  
} SPINDLE;
+
<span style="color: #0000ff;">typedef struct </span><br /><span style="color: #0000ff;">{</span><br /><span style="color: #0000ff;"> double Position;   // position in revs</span><br /><span style="color: #0000ff;"> double StartPosition;  // position in revs to begin threading</span><br /><span style="color: #0000ff;"> double LastUpdatePosition; // last position in revs where speed was computed</span><br /><span style="color: #0000ff;"> double RevsPerCount;  // inverse of counts/rev</span><br /><span style="color: #0000ff;"> double UpdateTick;   // which servo tic we should calc RPM</span><br /><span style="color: #0000ff;"> double DeltaTicks;   // # Servo tics between speed measurement</span><br /><span style="color: #0000ff;"> double AdjTimeFilt;   // Lead Adjusted, filtered, time</span><br /><span style="color: #0000ff;"> double LastCSTime;   // Previous Coordinate System Time</span><br /><span style="color: #0000ff;"> double *pEncoderPos;  // pointer to Spindle Position </span><br /><span style="color: #0000ff;"> double K;     // Tau low pass filter coefficient</span><br /><span style="color: #0000ff;"> float TrueSpeedRPS;   // last measured speed</span><br /><span style="color: #0000ff;"> float InvBaseSpeedRPS;  // Reciprocal of Base speed of which trajectory was planned</span><br /><span style="color: #0000ff;"> double InvBaseSpeedRPSK1; // InvBaseSpeedRPS * (1-K)</span><br /><span style="color: #0000ff;"> float InvUpdateTime;  // Reciprocal of update time to avoid division</span><br /><span style="color: #0000ff;"> float Tau;     // Time constant for spindle filtering</span><br /><span style="color: #0000ff;"> int Type;     // Type=0 None, Type=1 uses encoder to measure spindle position</span><br /><span style="color: #0000ff;"> int ThreadingActive;  // True when threading is in progress</span>
  
extern SPINDLE Spindle;
+
<span style="color: #0000ff;">} SPINDLE;</span>
  
void ConfigureSpindle(int Type, int Axis, float UpdateTimeSecs, float Tau, float CountsPerRev);  // configures for type of Spindle feedback<br />void TrigThreading(float BaseSpeedRPS); // triggers threading coordinated motion, BaseSpeed is the ideal Spindle speed thatthe motion was planned for
+
<span style="color: #0000ff;">extern SPINDLE Spindle;</span>
  
 +
<span style="color: #0000ff;">void ConfigureSpindle(int Type, int Axis, float UpdateTimeSecs, float Tau, float CountsPerRev);  // configures for type of Spindle feedback</span><br /><span style="color: #0000ff;">void TrigThreading(float BaseSpeedRPS); // triggers threading coordinated motion, BaseSpeed is the ideal Spindle speed thatthe motion was planned for</span>
  
//  T I M E   F U N C T I O N S
 
  
double Time_sec();// returns total time since power up in seconds
+
<span style="color: #0000ff;">//  T I M E   F U N C T I O N S</span>
  
void WaitUntil(double time_sec);// wait until a specified time
+
<span style="color: #0000ff;">double Time_sec();// returns total time since power up in seconds</span>
  
void Delay_sec(double sec);// Delay time in seconds
+
<span style="color: #0000ff;">void WaitUntil(double time_sec);// wait until a specified time</span>
  
// (returns current time)<br />double WaitNextTimeSlice(void);// wait until a thread's new time slice begins
+
<span style="color: #0000ff;">void Delay_sec(double sec);// Delay time in seconds</span>
  
 +
<span style="color: #0000ff;">// (returns current time)</span><br /><span style="color: #0000ff;">double WaitNextTimeSlice(void);// wait until a thread's new time slice begins</span>
  
#define TIMER0  (*(volatile int *)0x42000010) // 32 bit raw hardware timer counts at CLOCKFREQ (see PC_DSP.h) 
 
  
extern volatile double ServoTick;         // increments each servo interrupt<br />extern volatile unsigned int LastTimer0;  // Last timer value when the ServoTick was incremented
 
  
 +
# <span style="color: #0000ff;">define TIMER0  (*(volatile int *)0x42000010) // 32 bit raw hardware timer counts at CLOCKFREQ (see PC_DSP.h) </span>
  
 <br />extern CHAN chan[N_CHANNELS];   // the axes channel related structures<br />extern CHAN *ch0;               // global pointer to axis 0 <br />extern CHAN *ch1;               // global pointer to axis 1 <br />extern CHAN *ch2;               // global pointer to axis 2 <br />extern CHAN *ch3;               // global pointer to axis 3 <br />extern CHAN *ch4;               // global pointer to axis 4 <br />extern CHAN *ch5;               // global pointer to axis 5 <br />extern CHAN *ch6;               // global pointer to axis 6 <br />extern CHAN *ch7;               // global pointer to axis 7
+
<span style="color: #0000ff;">extern volatile double ServoTick;         // increments each servo interrupt</span><br /><span style="color: #0000ff;">extern volatile unsigned int LastTimer0;  // Last timer value when the ServoTick was incremented</span>
  
<br />// This status contains the majority of all status<br />// so that it can be uploaded as a bulk transfer<br />extern MAIN_STATUS MainStatus;
 
  
 +
<span style="color: #0000ff;"> </span><br /><span style="color: #0000ff;">extern CHAN chan[N_CHANNELS];   // the axes channel related structures</span><br /><span style="color: #0000ff;">extern CHAN *ch0;               // global pointer to axis 0 </span><br /><span style="color: #0000ff;">extern CHAN *ch1;               // global pointer to axis 1 </span><br /><span style="color: #0000ff;">extern CHAN *ch2;               // global pointer to axis 2 </span><br /><span style="color: #0000ff;">extern CHAN *ch3;               // global pointer to axis 3 </span><br /><span style="color: #0000ff;">extern CHAN *ch4;               // global pointer to axis 4 </span><br /><span style="color: #0000ff;">extern CHAN *ch5;               // global pointer to axis 5 </span><br /><span style="color: #0000ff;">extern CHAN *ch6;               // global pointer to axis 6 </span><br /><span style="color: #0000ff;">extern CHAN *ch7;               // global pointer to axis 7</span>
  
void DisableAxis(int ch); // Disable the Axis, Servo output is set to zero
+
<br /><span style="color: #0000ff;">// This status contains the majority of all status</span><br /><span style="color: #0000ff;">// so that it can be uploaded as a bulk transfer</span><br /><span style="color: #0000ff;">extern MAIN_STATUS MainStatus;</span>
  
<br />void EnableAxisDest(int ch, double Dest); // enable the Axis and set the destination
 
  
<br />void EnableAxis(int ch); // enable the Axis at the current encoder position
+
<span style="color: #0000ff;">void DisableAxis(int ch); // Disable the Axis, Servo output is set to zero</span>
  
<br />// do this before enabling servo or when<br />// filter coefficients change<br />void ResetFilters(int ch); // Resets Filter history to known state
+
<br /><span style="color: #0000ff;">void EnableAxisDest(int ch, double Dest); // enable the Axis and set the destination</span>
  
<br />void Zero(int ch);  // Zero the Encoder Position and Current Commanded Position
+
<br /><span style="color: #0000ff;">void EnableAxis(int ch); // enable the Axis at the current encoder position</span>
  
// Basic motion commands to move one axis<br />void Move(int ch, double x);   // move using absolute coordinates<br />void MoveAtVel(int chno, double x, float MaxVel);        // move using absolute coordinates and specify the velocity<br />void MoveRel(int ch, double dx);    // move relative to current destination<br />void MoveRelAtVel(int chno, double x, float MaxVel);        //  move relative to current destinatio and specify the velocity<br />void Jog(int ch, double vel);       // move continiously at specified velocity<br />void MoveExp(int chno, double x, double Tau);  // exponentially approach a target at time constant Tau
+
<br /><span style="color: #0000ff;">// do this before enabling servo or when</span><br /><span style="color: #0000ff;">// filter coefficients change</span><br /><span style="color: #0000ff;">void ResetFilters(int ch); // Resets Filter history to known state</span>
  
int CheckDone(int ch);  // returns 1 if axis is Done, 0 if not, -1 if axis is disabled
+
<br /><span style="color: #0000ff;">void Zero(int ch);  // Zero the Encoder Position and Current Commanded Position</span>
  
<br />// Basic motion commands to move 3 axes <br />// <br />void MoveXYZABC(double x, double y, double z, double a, double b, double c); // Moves 6 axes (each axis moves independently)<br />int CheckDoneXYZABC(); // Check if all CS axis have completed , returns 1 if all complete, -1 if any is disabled, otherwise 0
+
<span style="color: #0000ff;">// Basic motion commands to move one axis</span><br /><span style="color: #0000ff;">void Move(int ch, double x);   // move using absolute coordinates</span><br /><span style="color: #0000ff;">void MoveAtVel(int chno, double x, float MaxVel);        // move using absolute coordinates and specify the velocity</span><br /><span style="color: #0000ff;">void MoveRel(int ch, double dx);    // move relative to current destination</span><br /><span style="color: #0000ff;">void MoveRelAtVel(int chno, double x, float MaxVel);        //  move relative to current destinatio and specify the velocity</span><br /><span style="color: #0000ff;">void Jog(int ch, double vel);       // move continiously at specified velocity</span><br /><span style="color: #0000ff;">void MoveExp(int chno, double x, double Tau);  // exponentially approach a target at time constant Tau</span>
  
<br />int CheckDoneBuf();   // returns 1 if Done, 0 if not, -1 if any axis in CS disabled<br />int CheckDoneGather();<br />void StartMove(int ch);
+
<span style="color: #0000ff;">int CheckDone(int ch);  // returns 1 if axis is Done, 0 if not, -1 if axis is disabled</span>
  
void SetupForMove(double From, double To, float MaxVel, CHAN *ch, int CoeffOffset,<br />                                                  int NoJerkControlAtStart, <br />                                                  int NoJerkControlAtEnd,<br />                                                  int Start,<br />              int *Nstates);<br />                                                  <br />void SetupForMotionPause(double x,CHAN *ch,int CoeffOffset, double time);  // stay still                                                  
+
<br /><span style="color: #0000ff;">// Basic motion commands to move 3 axes </span><br /><span style="color: #0000ff;">// </span><br /><span style="color: #0000ff;">void MoveXYZABC(double x, double y, double z, double a, double b, double c); // Moves 6 axes (each axis moves independently)</span><br /><span style="color: #0000ff;">int CheckDoneXYZABC(); // Check if all CS axis have completed , returns 1 if all complete, -1 if any is disabled, otherwise 0</span>
  
// coordinate systems #0 - axis definitions<br />extern int CS0_axis_x; // Axis channel number to use as x<br />extern int CS0_axis_y; // Axis channel number to use as y  <br />extern int CS0_axis_z; // Axis channel number to use as z  <br />extern int CS0_axis_a; // Axis channel number to use as a  <br />extern int CS0_axis_b; // Axis channel number to use as b  <br />extern int CS0_axis_c; // Axis channel number to use as c  <br />extern int CS0_axis_u; // Axis channel number to use as u  <br />extern int CS0_axis_v; // Axis channel number to use as v 
+
<br /><span style="color: #0000ff;">int CheckDoneBuf();   // returns 1 if Done, 0 if not, -1 if any axis in CS disabled</span><br /><span style="color: #0000ff;">int CheckDoneGather();</span><br /><span style="color: #0000ff;">void StartMove(int ch);</span>
  
void DefineCoordSystem(int axisx, int axisy, int axisz, int axisa); // define axis chan numbers to use as x,y,z,a (set -1 to disable)<br />void DefineCoordSystem6(int axisx, int axisy, int axisz, int axisa, int axisb, int axisc); // define axis chan numbers to use as x,y,z,a,b,c (set -1 to disable)<br />void DefineCoordSystem8(int axisx, int axisy, int axisz, int axisa, int axisb, int axisc, int axisu, int axisv); // define axis chan numbers to use as x,y,z,a,b,c,u,v (set -1 to disable)
+
<span style="color: #0000ff;">void SetupForMove(double From, double To, float MaxVel, CHAN *ch, int CoeffOffset,</span><br /><span style="color: #0000ff;">                                                  int NoJerkControlAtStart, </span><br /><span style="color: #0000ff;">                                                  int NoJerkControlAtEnd,</span><br /><span style="color: #0000ff;">                                                  int Start,</span><br /><span style="color: #0000ff;">              int *Nstates);</span><br /><span style="color: #0000ff;">                                                  </span><br /><span style="color: #0000ff;">void SetupForMotionPause(double x,CHAN *ch,int CoeffOffset, double time);  // stay still                                                  </span>
  
<br />// A Low Pass filter can be applied to all 8 axes of coordinated motion<br />// by setting the KLP coefficient.  To compute an appropriate coefficient<br />// from a time constant Tau in seconds use KLP = exp(-TIMEBASE/Tau);<br /> <br />extern double KLP;  // coordinated motion low pass filter coefficient
+
<span style="color: #0000ff;">// coordinate systems #0 - axis definitions</span><br /><span style="color: #0000ff;">extern int CS0_axis_x; // Axis channel number to use as x</span><br /><span style="color: #0000ff;">extern int CS0_axis_y; // Axis channel number to use as y  </span><br /><span style="color: #0000ff;">extern int CS0_axis_z; // Axis channel number to use as z  </span><br /><span style="color: #0000ff;">extern int CS0_axis_a; // Axis channel number to use as a  </span><br /><span style="color: #0000ff;">extern int CS0_axis_b; // Axis channel number to use as b  </span><br /><span style="color: #0000ff;">extern int CS0_axis_c; // Axis channel number to use as c  </span><br /><span style="color: #0000ff;">extern int CS0_axis_u; // Axis channel number to use as u  </span><br /><span style="color: #0000ff;">extern int CS0_axis_v; // Axis channel number to use as v </span>
  
// TauKLP = -TIMEBASE/log(KLP);  automatically computed by ExecBuf command<br />extern float TauKLP;      // "smoothing" related time constant used for End Motion
+
<span style="color: #0000ff;">void DefineCoordSystem(int axisx, int axisy, int axisz, int axisa); // define axis chan numbers to use as x,y,z,a (set -1 to disable)</span><br /><span style="color: #0000ff;">void DefineCoordSystem6(int axisx, int axisy, int axisz, int axisa, int axisb, int axisc); // define axis chan numbers to use as x,y,z,a,b,c (set -1 to disable)</span><br /><span style="color: #0000ff;">void DefineCoordSystem8(int axisx, int axisy, int axisz, int axisa, int axisb, int axisc, int axisu, int axisv); // define axis chan numbers to use as x,y,z,a,b,c,u,v (set -1 to disable)</span>
  
extern float SplineTauFactor;  // Final Spline motion to target will have a time duration of this number of TauKLP (defaults to 2)
+
<br /><span style="color: #0000ff;">// A Low Pass filter can be applied to all 8 axes of coordinated motion</span><br /><span style="color: #0000ff;">// by setting the KLP coefficient.  To compute an appropriate coefficient</span><br /><span style="color: #0000ff;">// from a time constant Tau in seconds use KLP = exp(-TIMEBASE/Tau);</span><br /><span style="color: #0000ff;"> </span><br /><span style="color: #0000ff;">extern double KLP;  // coordinated motion low pass filter coefficient</span>
  
<br />// Stop profile generation<br />// which will stop updating (freeze) the destination <br />// new commands can then be placed into the queue
+
<span style="color: #0000ff;">// TauKLP = -TIMEBASE/log(KLP);  automatically computed by ExecBuf command</span><br /><span style="color: #0000ff;">extern float TauKLP;      // "smoothing" related time constant used for End Motion</span>
  
void StopMotion(CHAN *ch);
+
<span style="color: #0000ff;">extern float SplineTauFactor;  // Final Spline motion to target will have a time duration of this number of TauKLP (defaults to 2)</span>
  
// put a trajectory off into the queue <br /> <br />void SetupForMotionEnd(CHAN *ch, int CoeffOffset) ;
+
<br /><span style="color: #0000ff;">// Stop profile generation</span><br /><span style="color: #0000ff;">// which will stop updating (freeze) the destination </span><br /><span style="color: #0000ff;">// new commands can then be placed into the queue</span>
  
<br />// Digital I/O Functions <br /> <br />#define BIT_SET  0x100      // rel address in FPGA where bit set ports reside<br />#define BIT_CLR  0x110      // rel address in FPGA where bit clear ports reside<br />#define BIT_DIR  0x120      // rel address in FPGA where bit Direction ports reside<br />#define BIT_READ 0x130      // rel address in FPGA where bit read ports reside
+
<span style="color: #0000ff;">void StopMotion(CHAN *ch);</span>
  
// Fixed I/O bit definitions
+
<span style="color: #0000ff;">// put a trajectory off into the queue </span><br /><span style="color: #0000ff;"> </span><br /><span style="color: #0000ff;">void SetupForMotionEnd(CHAN *ch, int CoeffOffset) ;</span>
  
#define LED0 46  // KFLOP LED #0 bit number<br />#define LED1 47  // KFLOP LED #1 bit number
+
<br /><span style="color: #0000ff;">// Digital I/O Functions </span><br /><span style="color: #0000ff;"> </span><br /><span style="color: #0000ff;">#define BIT_SET  0x100      // rel address in FPGA where bit set ports reside</span><br /><span style="color: #0000ff;">#define BIT_CLR  0x110      // rel address in FPGA where bit clear ports reside</span><br /><span style="color: #0000ff;">#define BIT_DIR  0x120      // rel address in FPGA where bit Direction ports reside</span><br /><span style="color: #0000ff;">#define BIT_READ 0x130      // rel address in FPGA where bit read ports reside</span>
  
<br />// Virtual I/O bits<br />extern int VirtualBits;     // Virtual I/O bits simulated in memory, use SetBit/ClearBit/SetStateBit(32-63 to reference)
+
<span style="color: #0000ff;">// Fixed I/O bit definitions</span>
  
// Virtual I/O bits Extended 1024-2047<br />extern int VirtualBitsEx[N_VIRTUAL_BITS_EX/32]; // 1024 Expanded Virtual Bits (1024-2047)
+
# <span style="color: #0000ff;">define LED0 46  // KFLOP LED #0 bit number</span><br /><span style="color: #0000ff;">#define LED1 47  // KFLOP LED #1 bit number</span>
  
extern int BitDirShadow[2];   // direction of all 64 I/O bits<br />extern int BitDirShadowSnap0;   // direction of 14 Snap Amp, 1st board, I/O bits<br />extern int BitDirShadowSnap1;   // direction of 14 Snap Amp, 2nd board, I/O bits
+
<br /><span style="color: #0000ff;">// Virtual I/O bits</span><br /><span style="color: #0000ff;">extern int VirtualBits;     // Virtual I/O bits simulated in memory, use SetBit/ClearBit/SetStateBit(32-63 to reference)</span>
  
void SetBitDirection(int bit, int dir); // define bit as input (0) or output (1) <br />int GetBitDirection(int bit);           // returns whether bit is defined as input (0) or output (1)<br />void SetBit(int bit);                   // set a bit high (bit must be defined as an output, see SetBitDirection)<br />void ClearBit(int bit);                 // set a bit low (bit must be defined as an output, see SetBitDirection)<br />void SetStateBit(int bit, int state);   // set a bit high or low (bit must be defined as an output, see SetBitDirection)<br />int ReadBit(int bit);                   // read the state of an I/O bit
+
<span style="color: #0000ff;">// Virtual I/O bits Extended 1024-2047</span><br /><span style="color: #0000ff;">extern int VirtualBitsEx[N_VIRTUAL_BITS_EX/32]; // 1024 Expanded Virtual Bits (1024-2047)</span>
  
<br />// Non volatile Flash functions
+
<span style="color: #0000ff;">extern int BitDirShadow[2];   // direction of all 64 I/O bits</span><br /><span style="color: #0000ff;">extern int BitDirShadowSnap0;   // direction of 14 Snap Amp, 1st board, I/O bits</span><br /><span style="color: #0000ff;">extern int BitDirShadowSnap1;   // direction of 14 Snap Amp, 2nd board, I/O bits</span>
  
#define FLASH ((volatile char *)0x90000000)  // beginning of FLASH - first 1MByte is for System Use<br />#define FLASH_USER ((volatile char *)0x90100000)  // 2nd MegByte is for User use<br />#define FLASH_BLOCK_SIZE (0x10000)  // FLASH erases in 64KByte Blocks <br />#define IRAM  ((volatile char *)0x10000000)<br />#define SDRAM ((volatile char *)0x80000000)<br />int ProgramFlash(volatile char *src, int Length, volatile char *dest, char *message);  //Programs Flash source address of data, length in 16-bit words, dest add must be on 64KByte block, optional \n terminated message<br />void SetFlashBank(volatile unsigned short *add);  // sets the currently addressable flash bank (address bits 14-19)
+
<span style="color: #0000ff;">void SetBitDirection(int bit, int dir); // define bit as input (0) or output (1) </span><br /><span style="color: #0000ff;">int GetBitDirection(int bit);           // returns whether bit is defined as input (0) or output (1)</span><br /><span style="color: #0000ff;">void SetBit(int bit);                   // set a bit high (bit must be defined as an output, see SetBitDirection)</span><br /><span style="color: #0000ff;">void ClearBit(int bit);                 // set a bit low (bit must be defined as an output, see SetBitDirection)</span><br /><span style="color: #0000ff;">void SetStateBit(int bit, int state);   // set a bit high or low (bit must be defined as an output, see SetBitDirection)</span><br /><span style="color: #0000ff;">int ReadBit(int bit);                   // read the state of an I/O bit</span>
  
 +
<br /><span style="color: #0000ff;">// Non volatile Flash functions</span>
  
// KONNECT AUX PORT FUNCTIONS<br />// <br />// Example:<br />//<br />// Configure KFLOP to service Konnect 32 Input 16 output IO board<br />// Board address is 0, <br />// 16 Outputs are mapped to Virtual IO 48-63 (VirtualBits)<br />// 32 Inputs are mapped to Virtual IO 1024-1055 (VirtualBits[0])<br />//<br />//  InitAux();<br />//  AddKonnect(0,&VirtualBits,VirtualBitsEx);<br />//
+
# <span style="color: #0000ff;">define FLASH ((volatile char *)0x90000000)  // beginning of FLASH - first 1MByte is for System Use</span><br /><span style="color: #0000ff;">#define FLASH_USER ((volatile char *)0x90100000)  // 2nd MegByte is for User use</span><br /><span style="color: #0000ff;">#define FLASH_BLOCK_SIZE (0x10000)  // FLASH erases in 64KByte Blocks </span><br /><span style="color: #0000ff;">#define IRAM  ((volatile char *)0x10000000)</span><br /><span style="color: #0000ff;">#define SDRAM ((volatile char *)0x80000000)</span><br /><span style="color: #0000ff;">int ProgramFlash(volatile char *src, int Length, volatile char *dest, char *message);  //Programs Flash source address of data, length in 16-bit words, dest add must be on 64KByte block, optional \n terminated message</span><br /><span style="color: #0000ff;">void SetFlashBank(volatile unsigned short *add);  // sets the currently addressable flash bank (address bits 14-19)</span>
  
void InitAux(void);  // Initialize the AUX Port KFLOP JP4 or JP6 and clear list of board to be serviced (only one Aux Port may be used at a time)
 
  
// Board address, address of 32-bit into to get the Output Bits (in low 16 bits), address of where to put 32 Inputs<br />void AddKonnect(int BoardAddress, int *OutputAddress, int *InputAddress);  // add a Konnect Board to list of AUX1 Port Boards to be serviced
+
<span style="color: #0000ff;">// KONNECT AUX PORT FUNCTIONS</span><br /><span style="color: #0000ff;">// </span><br /><span style="color: #0000ff;">// Example:</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// Configure KFLOP to service Konnect 32 Input 16 output IO board</span><br /><span style="color: #0000ff;">// Board address is 0, </span><br /><span style="color: #0000ff;">// 16 Outputs are mapped to Virtual IO 48-63 (VirtualBits)</span><br /><span style="color: #0000ff;">// 32 Inputs are mapped to Virtual IO 1024-1055 (VirtualBits[0])</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">//  InitAux();</span><br /><span style="color: #0000ff;">//  AddKonnect(0,&VirtualBits,VirtualBitsEx);</span><br /><span style="color: #0000ff;">//</span>
  
// Board address, address of 32-bit into to get the Output Bits (in low 16 bits), address of where to put 32 Inputs<br />void AddKonnect_Aux0(int BoardAddress, int *OutputAddress, int *InputAddress); // add a Konnect Board to list of AUX0 Port Boards to be serviced
+
<span style="color: #0000ff;">void InitAux(void);  // Initialize the AUX Port KFLOP JP4 or JP6 and clear list of board to be serviced (only one Aux Port may be used at a time)</span>
  
<br />                                <br />// User Print Routines<br />//<br />// sends a string to the user console of the KMotion<br />// application.  Because other threads may be sending<br />// characters, the strings are buffered in a queue<br />// and sent by the primary thread as soon as there<br />// is no PC input to process.  The string prepends <br />// an escape so the PC application knows for sure<br />// to send this to the Console window and not to <br />// process it as a response to a command that may<br />// be in the pipeline.<br />//<br />//<br />// normally the routine exits to the caller quickly<br />// unless the queue is full, then it must wait
+
<span style="color: #0000ff;">// Board address, address of 32-bit into to get the Output Bits (in low 16 bits), address of where to put 32 Inputs</span><br /><span style="color: #0000ff;">void AddKonnect(int BoardAddress, int *OutputAddress, int *InputAddress);  // add a Konnect Board to list of AUX1 Port Boards to be serviced</span>
  
#define MAX_STRING 128                    <br />#define MAX_NSTRINGS 256  // must be binary   
+
<span style="color: #0000ff;">// Board address, address of 32-bit into to get the Output Bits (in low 16 bits), address of where to put 32 Inputs</span><br /><span style="color: #0000ff;">void AddKonnect_Aux0(int BoardAddress, int *OutputAddress, int *InputAddress); // add a Konnect Board to list of AUX0 Port Boards to be serviced</span>
  
// Note: standard C language printf
+
<br /><span style="color: #0000ff;">                                </span><br /><span style="color: #0000ff;">// User Print Routines</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// sends a string to the user console of the KMotion</span><br /><span style="color: #0000ff;">// application.  Because other threads may be sending</span><br /><span style="color: #0000ff;">// characters, the strings are buffered in a queue</span><br /><span style="color: #0000ff;">// and sent by the primary thread as soon as there</span><br /><span style="color: #0000ff;">// is no PC input to process.  The string prepends </span><br /><span style="color: #0000ff;">// an escape so the PC application knows for sure</span><br /><span style="color: #0000ff;">// to send this to the Console window and not to </span><br /><span style="color: #0000ff;">// process it as a response to a command that may</span><br /><span style="color: #0000ff;">// be in the pipeline.</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// normally the routine exits to the caller quickly</span><br /><span style="color: #0000ff;">// unless the queue is full, then it must wait</span>
  
int printf(const char *format, ...);       // Print formatted string to console<br />int sprintf(char *s, const char *format, ...);  // Print formatted string to string
+
# <span style="color: #0000ff;">define MAX_STRING 128                    </span><br /><span style="color: #0000ff;">#define MAX_NSTRINGS 256  // must be binary   </span>
  
typedef int FILE;<br />FILE *fopen(const char*, const char*);     // Open a text file for writing on the PC (2nd param = "rt" or "wt") <br />int fprintf(FILE *f, const char * format, ...);     // Print formatted string to the PC's Disk File<br />int fclose(FILE *f);                           // Close the disk file on the PC
+
<span style="color: #0000ff;">// Note: standard C language printf</span>
  
int Print(char *s);                        // Print a string to the console window<br />int PrintFloat(char *Format, double v);    // Print a double using printf format, ex "%8.3f\n"<br />int PrintInt(char *Format, int v);         // Print an integer using printf format, ex "result=%4d\n"<br />                                <br />int sscanf(const char *_str, const char *_fmt, ...); //scan string and convert to values
+
<span style="color: #0000ff;">int printf(const char *format, ...);       // Print formatted string to console</span><br /><span style="color: #0000ff;">int sprintf(char *s, const char *format, ...);  // Print formatted string to string</span>
  
#define MAX_READ_DISK_LENGTH 1024 // max allowed length of disk file line length<br />extern volatile int read_disk_buffer_status; //status of read disk buffer 1=line available, 2=error, 3=eof <br />extern char read_disk_buffer[MAX_READ_DISK_LENGTH+1];<br />char *fgets(char *str, int n, FILE *file); //read string from PC disk file, str=buffer, n=buffer length, f=FILE pointer, returns NULL on error<br />int fscanf(FILE *f, const char *format, ...); //read sting from PC Disk file, convert values, returns number of items converted<br />int feof(FILE *f);   // End of file status for disk reading
+
<span style="color: #0000ff;">typedef int FILE;</span><br /><span style="color: #0000ff;">FILE *fopen(const char*, const char*);     // Open a text file for writing on the PC (2nd param = "rt" or "wt") </span><br /><span style="color: #0000ff;">int fprintf(FILE *f, const char * format, ...);     // Print formatted string to the PC's Disk File</span><br /><span style="color: #0000ff;">int fclose(FILE *f);                           // Close the disk file on the PC</span>
  
/*<br /> * MessageBox() Flags thes can be passed to the PC to invoke MessageBoxes<br /> *              for some applications such as KMotionCNC which monitor upload<br /> *              status and present message boxes when requested.  See the pc-dsp.h<br /> *              header for more information<br /> */<br />#define MB_OK                       0x00000000L<br />#define MB_OKCANCEL                 0x00000001L<br />#define MB_ABORTRETRYIGNORE         0x00000002L<br />#define MB_YESNOCANCEL              0x00000003L<br />#define MB_YESNO                    0x00000004L<br />#define MB_RETRYCANCEL              0x00000005L<br />#define MB_CANCELTRYCONTINUE        0x00000006L<br />#define MB_ICONHAND                 0x00000010L<br />#define MB_ICONQUESTION             0x00000020L<br />#define MB_ICONEXCLAMATION          0x00000030L<br />#define MB_ICONASTERISK             0x00000040L<br />#define MB_APPLMODAL                0x00000000L<br />#define MB_SYSTEMMODAL              0x00001000L<br />#define MB_TASKMODAL                0x00002000L<br />#define MB_NOFOCUS                  0x00008000L<br />#define MB_SETFOREGROUND            0x00010000L<br />#define MB_DEFAULT_DESKTOP_ONLY     0x00020000L<br />#define MB_TOPMOST                  0x00040000L<br />#define MB_RIGHT                    0x00080000L
+
<span style="color: #0000ff;">int Print(char *s);                        // Print a string to the console window</span><br /><span style="color: #0000ff;">int PrintFloat(char *Format, double v);    // Print a double using printf format, ex "%8.3f\n"</span><br /><span style="color: #0000ff;">int PrintInt(char *Format, int v);         // Print an integer using printf format, ex "result=%4d\n"</span><br /><span style="color: #0000ff;">                                </span><br /><span style="color: #0000ff;">int sscanf(const char *_str, const char *_fmt, ...); //scan string and convert to values</span>
  
/*<br /> * Dialog Box Command IDs<br /> */<br />#define IDOK                1<br />#define IDCANCEL            2<br />#define IDABORT             3<br />#define IDRETRY             4<br />#define IDIGNORE            5<br />#define IDYES               6<br />#define IDNO                7
+
# <span style="color: #0000ff;">define MAX_READ_DISK_LENGTH 1024 // max allowed length of disk file line length</span><br /><span style="color: #0000ff;">extern volatile int read_disk_buffer_status; //status of read disk buffer 1=line available, 2=error, 3=eof </span><br /><span style="color: #0000ff;">extern char read_disk_buffer[MAX_READ_DISK_LENGTH+1];</span><br /><span style="color: #0000ff;">char *fgets(char *str, int n, FILE *file); //read string from PC disk file, str=buffer, n=buffer length, f=FILE pointer, returns NULL on error</span><br /><span style="color: #0000ff;">int fscanf(FILE *f, const char *format, ...); //read sting from PC Disk file, convert values, returns number of items converted</span><br /><span style="color: #0000ff;">int feof(FILE *f);   // End of file status for disk reading</span>
  
 +
<span style="color: #0000ff;">/*</span><br /><span style="color: #0000ff;"> * MessageBox() Flags thes can be passed to the PC to invoke MessageBoxes</span><br /><span style="color: #0000ff;"> *              for some applications such as KMotionCNC which monitor upload</span><br /><span style="color: #0000ff;"> *              status and present message boxes when requested.  See the pc-dsp.h</span><br /><span style="color: #0000ff;"> *              header for more information</span><br /><span style="color: #0000ff;"> */</span><br /><span style="color: #0000ff;">#define MB_OK                       0x00000000L</span><br /><span style="color: #0000ff;">#define MB_OKCANCEL                 0x00000001L</span><br /><span style="color: #0000ff;">#define MB_ABORTRETRYIGNORE         0x00000002L</span><br /><span style="color: #0000ff;">#define MB_YESNOCANCEL              0x00000003L</span><br /><span style="color: #0000ff;">#define MB_YESNO                    0x00000004L</span><br /><span style="color: #0000ff;">#define MB_RETRYCANCEL              0x00000005L</span><br /><span style="color: #0000ff;">#define MB_CANCELTRYCONTINUE        0x00000006L</span><br /><span style="color: #0000ff;">#define MB_ICONHAND                 0x00000010L</span><br /><span style="color: #0000ff;">#define MB_ICONQUESTION             0x00000020L</span><br /><span style="color: #0000ff;">#define MB_ICONEXCLAMATION          0x00000030L</span><br /><span style="color: #0000ff;">#define MB_ICONASTERISK             0x00000040L</span><br /><span style="color: #0000ff;">#define MB_APPLMODAL                0x00000000L</span><br /><span style="color: #0000ff;">#define MB_SYSTEMMODAL              0x00001000L</span><br /><span style="color: #0000ff;">#define MB_TASKMODAL                0x00002000L</span><br /><span style="color: #0000ff;">#define MB_NOFOCUS                  0x00008000L</span><br /><span style="color: #0000ff;">#define MB_SETFOREGROUND            0x00010000L</span><br /><span style="color: #0000ff;">#define MB_DEFAULT_DESKTOP_ONLY     0x00020000L</span><br /><span style="color: #0000ff;">#define MB_TOPMOST                  0x00040000L</span><br /><span style="color: #0000ff;">#define MB_RIGHT                    0x00080000L</span>
  
// Misc routines
+
<span style="color: #0000ff;">/*</span><br /><span style="color: #0000ff;"> * Dialog Box Command IDs</span><br /><span style="color: #0000ff;"> */</span><br /><span style="color: #0000ff;">#define IDOK                1</span><br /><span style="color: #0000ff;">#define IDCANCEL            2</span><br /><span style="color: #0000ff;">#define IDABORT             3</span><br /><span style="color: #0000ff;">#define IDRETRY             4</span><br /><span style="color: #0000ff;">#define IDIGNORE            5</span><br /><span style="color: #0000ff;">#define IDYES               6</span><br /><span style="color: #0000ff;">#define IDNO                7</span>
  
void DoResolverInput2(CHAN *chx, float x, float y);  // optimized routine to handle sin/cosine resolver input
 
  
extern double ResolverFactor; // defaults to 1000.0/TWO_PI converts sine/cosine angle to reported Position
+
<span style="color: #0000ff;">// Misc routines</span>
  
<br />// M U L T I - T H R E A D   S U P P O R T
+
<span style="color: #0000ff;">void DoResolverInput2(CHAN *chx, float x, float y);  // optimized routine to handle sin/cosine resolver input</span>
  
// user threads are numbered 1 .. n
+
<span style="color: #0000ff;">extern double ResolverFactor; // defaults to 1000.0/TWO_PI converts sine/cosine angle to reported Position</span>
  
void StartThread(int thread);  // starts a downloaded program at it's entry point<br />void PauseThread(int thread);  // stops a thread from executing<br />int ResumeThread(int thread);  // resumes a tread after a pause <br />void ThreadDone(void);         // call to terminate current thread<br />extern int CurrentThread;      // current thread that is/was executing  0 = Pri 1-7 = User Threads
+
<br /><span style="color: #0000ff;">// M U L T I - T H R E A D   S U P P O R T</span>
  
 +
<span style="color: #0000ff;">// user threads are numbered 1 .. n</span>
  
// A User Program Call Back can be defined to be called every Servo Sample<br />// Set to Non-NULL for the the Callback to be made.  The Callback Routine<br />// must return with a few micro seconds or the system may become unstable<br />typedef void USERCALLBACK(void);<br />extern USERCALLBACK *UserCallBack;
+
<span style="color: #0000ff;">void StartThread(int thread);  // starts a downloaded program at it's entry point</span><br /><span style="color: #0000ff;">void PauseThread(int thread);  // stops a thread from executing</span><br /><span style="color: #0000ff;">int ResumeThread(int thread);  // resumes a tread after a pause </span><br /><span style="color: #0000ff;">void ThreadDone(void);         // call to terminate current thread</span><br /><span style="color: #0000ff;">extern int CurrentThread;      // current thread that is/was executing  0 = Pri 1-7 = User Threads</span>
  
<br />// used to allow mutual exclusive access to a resource<br />// (waits until resource is available, then locks it)<br />// if the thread that locked it is no longer active,<br />// release the lock
 
  
void MutexLock(int *mutex);<br />void MutexUnlock(int *mutex);
+
<span style="color: #0000ff;">// A User Program Call Back can be defined to be called every Servo Sample</span><br /><span style="color: #0000ff;">// Set to Non-NULL for the the Callback to be made.  The Callback Routine</span><br /><span style="color: #0000ff;">// must return with a few micro seconds or the system may become unstable</span><br /><span style="color: #0000ff;">typedef void USERCALLBACK(void);</span><br /><span style="color: #0000ff;">extern USERCALLBACK *UserCallBack;</span>
  
// These routines are written in assembly such that<br />// they are atomic and are un-interruptible by using<br />// instructions in delayed branching
+
<br /><span style="color: #0000ff;">// used to allow mutual exclusive access to a resource</span><br /><span style="color: #0000ff;">// (waits until resource is available, then locks it)</span><br /><span style="color: #0000ff;">// if the thread that locked it is no longer active,</span><br /><span style="color: #0000ff;">// release the lock</span>
  
void AtomicSet(int *p, int mask);<br />//{<br />// *p = *p | mask;<br />//}
+
<span style="color: #0000ff;">void MutexLock(int *mutex);</span><br /><span style="color: #0000ff;">void MutexUnlock(int *mutex);</span>
  
void AtomicClear(int *p, int mask);<br />//{<br />// *p = *p & mask;<br />//}
+
<span style="color: #0000ff;">// These routines are written in assembly such that</span><br /><span style="color: #0000ff;">// they are atomic and are un-interruptible by using</span><br /><span style="color: #0000ff;">// instructions in delayed branching</span>
  
// test a location and if zero, set<br />// to value.  returns the original<br />// value.  routine is atomic
+
<span style="color: #0000ff;">void AtomicSet(int *p, int mask);</span><br /><span style="color: #0000ff;">//{</span><br /><span style="color: #0000ff;">// *p = *p | mask;</span><br /><span style="color: #0000ff;">//}</span>
  
int TestAndSet(int *mutex, int value);<br />//{<br />// register result = *mutex;<br />// if (result==0) *mutex=value;<br />// return result;<br />//}
+
<span style="color: #0000ff;">void AtomicClear(int *p, int mask);</span><br /><span style="color: #0000ff;">//{</span><br /><span style="color: #0000ff;">// *p = *p & mask;</span><br /><span style="color: #0000ff;">//}</span>
  
<br />// S N A P   A M P   D E F I N I T I O N S
+
<span style="color: #0000ff;">// test a location and if zero, set</span><br /><span style="color: #0000ff;">// to value.  returns the original</span><br /><span style="color: #0000ff;">// value.  routine is atomic</span>
  
#define KM_SNAP_READ_LOW 0xc<br />#define KM_SNAP_READ_HI  0xd<br />#define KM_SNAP_READ_EXCEPTION 0x10<br />#define KM_SNAP_CLK_ENA 0x09<br />#define KM_SNAP_SHIFT_BYTE 0x0a<br />#define KM_SNAP_WRITE_HIGH_TRIG 0x0b<br />#define KM_SNAP_READ_ADD_TRIG 0x0c<br />#define KM_SNAP_READ_ADD_BITMAP 0x28<br />// FPGA Registers
+
<span style="color: #0000ff;">int TestAndSet(int *mutex, int value);</span><br /><span style="color: #0000ff;">//{</span><br /><span style="color: #0000ff;">// register result = *mutex;</span><br /><span style="color: #0000ff;">// if (result==0) *mutex=value;</span><br /><span style="color: #0000ff;">// return result;</span><br /><span style="color: #0000ff;">//}</span>
  
#define SNAP0 0x40  // Base Addresse SNAP AMP #0 <br />#define SNAP1 0x60  // Base Addresse SNAP AMP #1 
+
<br /><span style="color: #0000ff;">// S N A P   A M P   D E F I N I T I O N S</span>
  
// write addresses
+
# <span style="color: #0000ff;">define KM_SNAP_READ_LOW 0xc</span><br /><span style="color: #0000ff;">#define KM_SNAP_READ_HI  0xd</span><br /><span style="color: #0000ff;">#define KM_SNAP_READ_EXCEPTION 0x10</span><br /><span style="color: #0000ff;">#define KM_SNAP_CLK_ENA 0x09</span><br /><span style="color: #0000ff;">#define KM_SNAP_SHIFT_BYTE 0x0a</span><br /><span style="color: #0000ff;">#define KM_SNAP_WRITE_HIGH_TRIG 0x0b</span><br /><span style="color: #0000ff;">#define KM_SNAP_READ_ADD_TRIG 0x0c</span><br /><span style="color: #0000ff;">#define KM_SNAP_READ_ADD_BITMAP 0x28</span><br /><span style="color: #0000ff;">// FPGA Registers</span>
  
#define SNAP_PWMS 0      // (4) 16 bit PWMs <br />#define SNAP_CLR_ENC_ERRS 8   // any write clears all encoder errors<br />#define SNAP_CUR_LOOP_GAINS 9  // (4) 8 bit Current Loop Gains Default=16<br />#define SNAP_SET_BIT 17    // (14) GPIO bits<br />#define SNAP_CLR_BIT 18    // (14) GPIO bits<br />#define SNAP_DIR_BIT 19    // (14) GPIO bits<br />#define SNAP_SUPPLY_CLAMP0 20  // 16 bit power supply clamp setting side A<br />#define SNAP_SUPPLY_CLAMP_ENA0 21 // 1 bit power supply clamp enable side A<br />#define SNAP_SUPPLY_CLAMP1 22  // 16 bit power supply clamp setting side B<br />#define SNAP_SUPPLY_CLAMP_ENA1 23 // 1 bit power supply clamp enable side B<br />#define SNAP_PEAK_CUR_LIMIT0 24  // 4 bits peak current limit side A<br />#define SNAP_PEAK_CUR_LIMIT1 25  // 4 bits peak current limit side B
+
# <span style="color: #0000ff;">define SNAP0 0x40  // Base Addresse SNAP AMP #0 </span><br /><span style="color: #0000ff;">#define SNAP1 0x60  // Base Addresse SNAP AMP #</span>
  
// read addresses
+
<span style="color: #0000ff;">// write addresses</span>
  
#define SNAP_PWMS 0      // (4) 16 bit PWMs <br />#define SNAP_ENC 8       // (4) 16 bit Encoders (bit15=error 7-0=data) <br />#define SNAP_CURRENT_A0 12   // Measured Current Side A Lead A (14bits)<br />#define SNAP_CURRENT_C0 13   // Measured Current Side A Lead C<br />#define SNAP_CURRENT_A1 14   // Measured Current Side B Lead A<br />#define SNAP_CURRENT_C1 15   // Measured Current Side B Lead C<br />#define SNAP_DIFF_IN 16     // 16 bits (15-8= Diff inputs 7-0=encoder inputs) <br />#define SNAP_IN_BIT 17    // (14) GPIO bits<br />#define SNAP_SUPPLY_VOLT0 22  // Measured Supply Voltage Side A<br />#define SNAP_SUPPLY_VOLT1 23  // Measured Supply Voltage Side B<br />#define SNAP_TEMP0 24    // Measured Temperature Side A<br />#define SNAP_TEMP1 25    // Measured Temperature Side B<br />#define SNAP_STATUS 30    // Status (FAN,OverTemp1,OverTemp0,OVER_CUR1,OVER_CUR0,Fault)<br />#define SNAP_RESET 31    // Reset
+
# <span style="color: #0000ff;">define SNAP_PWMS 0      // (4) 16 bit PWMs </span><br /><span style="color: #0000ff;">#define SNAP_CLR_ENC_ERRS 8   // any write clears all encoder errors</span><br /><span style="color: #0000ff;">#define SNAP_CUR_LOOP_GAINS 9  // (4) 8 bit Current Loop Gains Default=16</span><br /><span style="color: #0000ff;">#define SNAP_SET_BIT 17    // (14) GPIO bits</span><br /><span style="color: #0000ff;">#define SNAP_CLR_BIT 18    // (14) GPIO bits</span><br /><span style="color: #0000ff;">#define SNAP_DIR_BIT 19    // (14) GPIO bits</span><br /><span style="color: #0000ff;">#define SNAP_SUPPLY_CLAMP0 20  // 16 bit power supply clamp setting side A</span><br /><span style="color: #0000ff;">#define SNAP_SUPPLY_CLAMP_ENA0 21 // 1 bit power supply clamp enable side A</span><br /><span style="color: #0000ff;">#define SNAP_SUPPLY_CLAMP1 22  // 16 bit power supply clamp setting side B</span><br /><span style="color: #0000ff;">#define SNAP_SUPPLY_CLAMP_ENA1 23 // 1 bit power supply clamp enable side B</span><br /><span style="color: #0000ff;">#define SNAP_PEAK_CUR_LIMIT0 24  // 4 bits peak current limit side A</span><br /><span style="color: #0000ff;">#define SNAP_PEAK_CUR_LIMIT1 25  // 4 bits peak current limit side B</span>
  
//RS232 FPGA Register Definitions
+
<span style="color: #0000ff;">// read addresses</span>
  
#define RS232_STATUS 0xc1  // Status Reg Address<br />#define RS232_DATA 0xc0   // 8 bit data read/write reg address<br />#define RS232_DATA_READY 0x01 // Data ready to read status mask<br />#define RS232_TRANSMIT_FULL 0x02// Transmit buffer full status mask
+
# <span style="color: #0000ff;">define SNAP_PWMS 0      // (4) 16 bit PWMs </span><br /><span style="color: #0000ff;">#define SNAP_ENC 8       // (4) 16 bit Encoders (bit15=error 7-0=data) </span><br /><span style="color: #0000ff;">#define SNAP_CURRENT_A0 12   // Measured Current Side A Lead A (14bits)</span><br /><span style="color: #0000ff;">#define SNAP_CURRENT_C0 13   // Measured Current Side A Lead C</span><br /><span style="color: #0000ff;">#define SNAP_CURRENT_A1 14   // Measured Current Side B Lead A</span><br /><span style="color: #0000ff;">#define SNAP_CURRENT_C1 15   // Measured Current Side B Lead C</span><br /><span style="color: #0000ff;">#define SNAP_DIFF_IN 16     // 16 bits (15-8= Diff inputs 7-0=encoder inputs) </span><br /><span style="color: #0000ff;">#define SNAP_IN_BIT 17    // (14) GPIO bits</span><br /><span style="color: #0000ff;">#define SNAP_SUPPLY_VOLT0 22  // Measured Supply Voltage Side A</span><br /><span style="color: #0000ff;">#define SNAP_SUPPLY_VOLT1 23  // Measured Supply Voltage Side B</span><br /><span style="color: #0000ff;">#define SNAP_TEMP0 24    // Measured Temperature Side A</span><br /><span style="color: #0000ff;">#define SNAP_TEMP1 25    // Measured Temperature Side B</span><br /><span style="color: #0000ff;">#define SNAP_STATUS 30    // Status (FAN,OverTemp1,OverTemp0,OVER_CUR1,OVER_CUR0,Fault)</span><br /><span style="color: #0000ff;">#define SNAP_RESET 31    // Reset</span>
  
#define RS232_BAUD_REG 0xc1 // Set Baud rate 8-bit divisor Reg Address <br />#define RS232_BAUD_115200  ((16666666/115200/16)-1)// 8-bit divisor value to set 115200 baud<br />#define RS232_BAUD_57600  ((16666666/57600/16)-1) // 8-bit divisor value to set  57600 baud<br />#define RS232_BAUD_38400  ((16666666/38400/16)-1) // 8-bit divisor value to set  38400 baud<br />#define RS232_BAUD_19200  ((16666666/19200/16)-1) // 8-bit divisor value to set  19200 baud<br />#define RS232_BAUD_9600  ((16666666/9600/16)-1) // 8-bit divisor value to set   9600 baud<br />#define RS232_BAUD_4800  ((16666666/4800/16)-1) // 8-bit divisor value to set   4800 baud
+
<span style="color: #0000ff;">//RS232 FPGA Register Definitions</span>
  
void InitRS232(int baud);<br />void EnableRS232Cmds(int baud);
+
# <span style="color: #0000ff;">define RS232_STATUS 0xc1  // Status Reg Address</span><br /><span style="color: #0000ff;">#define RS232_DATA 0xc0   // 8 bit data read/write reg address</span><br /><span style="color: #0000ff;">#define RS232_DATA_READY 0x01 // Data ready to read status mask</span><br /><span style="color: #0000ff;">#define RS232_TRANSMIT_FULL 0x02// Transmit buffer full status mask</span>
  
extern char * volatile pRS232RecIn;  // Buffered Receive Pointer Head<br />extern char *pRS232RecOut;           // Buffered Receive Pointer Tail<br />extern char *pRS232TxIn;             // Buffered Transmit Pointer Head<br />extern char * volatile pRS232TxOut;  // Buffered Transmit Pointer Tail<br />extern int DoRS232Cmds;              // Enables/disables KFLOP Command processor to/from RS232
+
# <span style="color: #0000ff;">define RS232_BAUD_REG 0xc1 // Set Baud rate 8-bit divisor Reg Address </span><br /><span style="color: #0000ff;">#define RS232_BAUD_115200  ((16666666/115200/16)-1)// 8-bit divisor value to set 115200 baud</span><br /><span style="color: #0000ff;">#define RS232_BAUD_57600  ((16666666/57600/16)-1) // 8-bit divisor value to set  57600 baud</span><br /><span style="color: #0000ff;">#define RS232_BAUD_38400  ((16666666/38400/16)-1) // 8-bit divisor value to set  38400 baud</span><br /><span style="color: #0000ff;">#define RS232_BAUD_19200  ((16666666/19200/16)-1) // 8-bit divisor value to set  19200 baud</span><br /><span style="color: #0000ff;">#define RS232_BAUD_9600  ((16666666/9600/16)-1) // 8-bit divisor value to set   9600 baud</span><br /><span style="color: #0000ff;">#define RS232_BAUD_4800  ((16666666/4800/16)-1) // 8-bit divisor value to set   4800 baud</span>
  
char RS232_GetChar(void);   // Get Internally Buffered (1000 chars) RS232 received Data <br />void RS232_PutChar(char c); // Put Internally Buffered (1000 chars) RS232 transmit Data
+
<span style="color: #0000ff;">void InitRS232(int baud);</span><br /><span style="color: #0000ff;">void EnableRS232Cmds(int baud);</span>
  
 +
<span style="color: #0000ff;">extern char * volatile pRS232RecIn;  // Buffered Receive Pointer Head</span><br /><span style="color: #0000ff;">extern char *pRS232RecOut;           // Buffered Receive Pointer Tail</span><br /><span style="color: #0000ff;">extern char *pRS232TxIn;             // Buffered Transmit Pointer Head</span><br /><span style="color: #0000ff;">extern char * volatile pRS232TxOut;  // Buffered Transmit Pointer Tail</span><br /><span style="color: #0000ff;">extern int DoRS232Cmds;              // Enables/disables KFLOP Command processor to/from RS232</span>
  
#endif
+
<span style="color: #0000ff;">char RS232_GetChar(void);   // Get Internally Buffered (1000 chars) RS232 received Data </span><br /><span style="color: #0000ff;">void RS232_PutChar(char c); // Put Internally Buffered (1000 chars) RS232 transmit Data</span>
 +
 
 +
 
 +
 
 +
# <span style="color: #0000ff;">endif</span>

Revision as of 14:07, 11 February 2016

KMotionDef.h

The KMotionDef.h, is a C header file which lists all variables and functions available to KFLOP C Programs. The KMotionDef.h file can be located in the  <KMotion Installation Dir >\DSP_KFLOP\ directory.


The Big List

Please Note - at the moment this is a direct copy and paste of the KMotionDef.h file. As time allows, it will gradually link to other pages containing further details and examples of related variables and functions. If you wish to contribute to this task, please register.

To make already linked variables/functions stand out, the original unedited text has been coloured Blue. As the page is edited and linked, it will revert to normal wiki text colours.


//
//  KMotionDef.h - MAIN HEADER FILE FOR USER C PROGRAMS
//
//  Copyright Dynomotion 2/20/2004
//
//  Include this header file in User C programs that execute
//  in the DSP to define all User accessible KMotion functions,
//  constants, and data structures

  1. ifndef KMotionDef_h
    #define KMotionDef_h
  1. define KFLOP
    #define C6722
  1. define BOARD "KFLOP"

extern const char VersionAndBuildTime[];  // string with version and build time

  1. define CLOCKFREQ   50.0e6   // 200 MHz/4  

typedef int BOOL;

  1. ifndef _SIZE_T
    #define _SIZE_T
    typedef unsigned int size_t;
    #endif
  1. ifndef NULL
    #define NULL    0
    #endif
  1. ifndef FALSE
    #define FALSE 0
    #endif
    #ifndef TRUE
    #define TRUE 1
    #endif   
    #ifndef PI
    #define PI 3.14159265358979323846264
    #endif   
    #ifndef PI_F
    #define PI_F 3.1415926535f
    #endif   
    #ifndef TWO_PI_F
    #define TWO_PI_F (2.0f * 3.1415926535f)
    #endif   
    #ifndef PI_2F
    #define PI_2F (3.1415926535f * 0.5f)
    #endif   
    #ifndef TWO_PI
    #define TWO_PI (2.0 * 3.14159265358979323846264)
    #endif   


#include "PC-DSP.h"   // contains common structures shared by PC and DSP

// Global Host Status that the PC Application can specify as it Requests Global Status
// to inform KFLOP User threads of its current state.  ie Job Actively running
// up to 32 bits of status can be specified.  See PC-DSP.h for normal bit defines
extern int volatile HostStatus;

  1. define JOB_ACTIVE (HostStatus & HOST_JOB_ACTIVE_BIT)


// standard math funtions

extern float sqrtf (float x);
extern float expf  (float x);
extern float logf  (float x);
extern float log10f(float x);
extern float powf  (float x, float y);
extern float sinf  (float x);
extern float cosf  (float x);
extern float tanf  (float x);
extern float asinf (float x);
extern float acosf (float x);
extern float atanf (float x);
extern float atan2f(float y, float x);
extern float fast_fabsf (float y);

extern double sqrt (double x);
extern double exp  (double x);
extern double log  (double x);
extern double log10(double x);
extern double pow  (double x, double y);
extern double sin  (double x);
extern double cos  (double x);
extern double tan  (double x);
extern double asin (double x);
extern double acos (double x);
extern double atan (double x);
extern double atan2(double y, double x);
extern double fast_fabs (double y);


#define FPGA_ADDR ((volatile unsigned char *)0x91000000)   // Base of FPGA addresses
#define FPGA(X) (FPGA_ADDR[(X)*4+2])
#define FPGA_ADDRW ((volatile unsigned short int *)0x91000000)   // Base of FPGA addresses
#define FPGAW(X) (FPGA_ADDRW[(X)*2+1])
   
// This structure is set to default every time the program runs UNTIL
// the program image has been FLASHED using the FLASH command
// from then on it will not be cleared, so data that was present at the
// time it was flashed will persist    

  1. define N_USER_DATA_VARS 200
                       
    typedef struct
    {
        int RunOnStartUp; // word Bits 1-7 selects which threads to execute on startup  
        unsigned int EntryPoints[N_USER_THREADS];   // each downloaded program's entry point
        int UserData[N_USER_DATA_VARS]; // General purpose way to share and or save user program data
    } PERSIST;

extern PERSIST persist;   

extern int StatusRequestCounter;  // increments each time host requests status

// data gathering variables

  1. define MAX_GATHER_VALUES 32
  1. define GATHER_NULL_TYPE 7
    #define GATHER_ADC_TYPE 6
    #define GATHER_DOUBLE_TYPE 5
    #define GATHER_FLOAT_TYPE 4
    #define GATHER_LASTPWMC_TYPE 3
    #define GATHER_LASTPWM_TYPE 2
    #define GATHER_INT_TYPE 1
    #define GATHER_END_TYPE 0

typedef struct  // define a size and address to store

    int type;    // GATHER_XXXXX_TYPE, 0=end of list
    void *addr;
} GATHER_VALUE_DEF;
 
typedef struct
{
    double *bufptr;         // data gathering buffer pointer
    double *endptr;         // done if bufptr = endptr   
   
    double Dest;             // Save where the injection will be relative to
   
    int Inject;             // if set, 1st address is to be copied from buffer to the address
   
    GATHER_VALUE_DEF list[MAX_GATHER_VALUES];   // list of addresses to gather (null after last value)
} GATHER;

extern GATHER gather;   
                    

  1. define MAX_GATHER_DATA 1000000 // Size of gather buffer (number of doubles, 8 bytes each).                  
    extern double *gather_buffer;   // Large buffer for data gathering, Bode plots, or User use
  1. define N_CPLX 2048

extern float *input;

void SetupGatherAllOnAxis(int c, int n_Samples);  // Prepares to gather info for an axis
void TriggerGather();                             // starts gathering defined items into gather buffer



#define TRAJECTORY_OFF 0          // no trajectory generation
#define TRAJECTORY_INDEPENDENT 1  // simple independent axis (3rd order funtion of time)
#define TRAJECTORY_LINEAR 2       // linear interpolated from coord system 0    (x = c*p+d)
#define TRAJECTORY_CIRCULAR 3     // circular interpolated from coord system 0  (x = c*sin(p*a+b)+d)
#define TRAJECTORY_SPECIAL 4      // Special Command to clear/set IO bit
          // do the operation
          // 0 = clearbit
          // 1 = setbit
          // 2 = wait for bit low
          // 3 = wait for bit high
          // 4 = beginning of Rapid
          // 5 = end of Rapid
         
          //    param 0 = bit number



#define TRAJECTORY_EXPONENTIAL 5  // independent axis (exponentially approach Dest a=Ratio per tick, b=Dest)

  1. define LAST_MOTION_JOG 0    // type of last independent motion was a jog
    #define LAST_MOTION_MOVE 1    // type of last independent motion was a move
    #define LAST_MOTION_MULTI 2    // type of last independent motion was a multi axis move (G0 type)
    #define LAST_MOTION_EXP 3    // type of last independent motion was an exponential


typedef struct  // linear (only c and d are used),or sine equation

    double a;   
    double b;   
    double c;   
    double d;   // always t^0 constant coefficient (starting position)
} TRIP_CIRCLE_LINEAR;

typedef struct  // linear (only c and d are used)

    double c;   
    double d;   // always t^0 constant coefficient (starting position)
} TRIP_LINEAR;

//
// Motion structure for a coordinate system
//
// 3rd order polynomial for the parametric parameter
//
// defines a parametric parameter p that varies from 0->1 over the
// segment of motion as a function of time.  All the associated axes
// derive their position from this (either circular or linear)
// using either a circular formula or linear formula

typedef struct 
{  
    char trajectory_mode;    // Off, circular, or linear
    unsigned char x_axis;    // associated x axis / or special command
    unsigned char y_axis;    // associated y axis
    unsigned char z_axis;    // associated z axis
    unsigned char a_axis;    // associated a axis
    unsigned char b_axis;    // associated b axis
    unsigned char c_axis;    // associated c axis
    unsigned char u_axis;    // associated u axis
    unsigned char v_axis;    // associated v axis
 short int special_param; // special param 0
 double t;   // time duration (in sec) of trip state
    double a;   // t^3 coefficient  (Jerk)
    double b;   // t^2 coefficient  (initial acceleration)
    double c;   // t^1 coefficient  (initial velocity)
    double d;   // t^0 constant coefficient (starting position)
    TRIP_CIRCLE_LINEAR X,Y;
    TRIP_LINEAR Z,A,B,C,U,V;
} PARAMETRIC_COEFF;



typedef struct  // 3rd order polynomial for a single trip state

    int trajectory_mode;
    double t;   // time duration (in sec) of trip state
    double a;   // t^3 coefficient  (Jerk)
    double b;   // t^2 coefficient  (initial acceleration)
    double c;   // t^1 coefficient  (initial velocity)
    double d;   // t^0 constant coefficient (starting position)
} TRIP_COEFF;
           
typedef struct  // 2nd order IIR Filter
{
    float A1;   // output coefficient Z-1
    float A2;   // output coefficient Z-2
    float B0;   // input  coefficient Z-0  
    float B1;   // input  coefficient Z-1
    float B2;   // input  coefficient Z-2
    float d0,d1; // delay values
} IIR;

// MOTION TRAJECTORY STRUCTURES
   
extern double CS0_t;    // Current Coordinated Motion Segment Times
extern double CS0_TimeExecuted;  // Sum of all previous Coordinated Motion Segments Executed
extern double CS0_TimeDownloaded; // Sum of all Coord Motion Segments downloaded from Host
extern double CS0_TimeLost;   // Sum of all Coord Motion Segments downloaded from Host that have been discarded (buffer wrap)
extern double CS0_TimeBase;       // how much coordinated motion is advanced each tick
extern double CS0_TimeBaseDelta;   // max amount coordinated motion time base is changed per tick
extern float CS0_DecelTime;   // how long to take to stop the coordinated motion (computed by StopMotion)
extern double CS0_TimeBaseDesired; // Last Desired rate-of-time (TIMEBASE = real time)

extern BOOL CS0_DoingRapid;    // Flag indicating Rapid in Progress so use normal Time Base ignoring FRO (except for FeedHold)     
extern BOOL CS0_Flushed;    // Coordinated motion Terminated so no longer necessary to worry about starvation      
extern BOOL CS0_HoldAtEnd;    // Coordinated motion to not Terminate but rather Hold when reaching end of buffer      

extern float CS0_NomDecel2TB2;   // Nominal Decel Time/(2 TIMEBASE^2) = Factor to relate buffer time to TimeBase to be able to stop

extern int CS0_StoppingState;    // emergency stop in progress, 0 = not stopping, 1=stopping coord motion, 2=stopping indep, 3=fully stopped, 4=ind stopped
extern PARAMETRIC_COEFF *CoordSystem0;  // current pointer into Coordinated Motion
extern PARAMETRIC_COEFF *LastCoordSystem0;
extern int ParametricIndex;    // Index of where to put next downloaded Coord Motion Segment or command
extern BOOL ParametricIndexWrapped;  // Indicates that Coord Motion Buffer has wrapped and additional segments will cause segments to be lost
extern PARAMETRIC_COEFF *ParametricCoeffs;  // Points to beginning of Coord Motion Buffer
extern PARAMETRIC_COEFF *ParametricCoeffsEnd;  // Points to End+1 of Allocated Coord Motion Buffer (MAX_SEGMENTS)
extern PARAMETRIC_COEFF *LastCoordSystem0;  // Pointer to last Segment executed when finished
extern PARAMETRIC_COEFF *LastValidTrajSegment; // Last Segment actually Executed

void StopCoordinatedMotion(void);   // bring any coordinated motion to a emergency stop ASAP
void ResumeCoordinatedMotion(void); // resume coordinated/Indep motion after an emergency stop
void ClearStopImmediately(void); // Clear Stop Condition without resuming
void UpdateStoppingState(void);  // Update Stopping Status (only required for indep stopping)
float GetNominalFROChangeTime(void);// computed time to change from FRO 1.0 to 0.0 for all defined CoordSystem Axes and their specified Vel, Accel, jerk
void SetFRO(float FRO); // change from current to the specified FRO (FRO=1.0=Realtime)using a nominal rate based on computed time to change from 1.0 to 0.0
void SetRapidFRO(float FRO); // change from current to the specified Rapid FRO (FRO=1.0=Realtime)using a nominal rate based on computed time to change from 1.0 to 0.0
void SetFROTemp(float FRO); // Temporarily change from current to the specified FRO using a nominal rate, override FeedHold, don't save as LastFRO
void SetFROwRate(float FRO, float DecelTime); // change from current to the specified FRO (FRO=1.0=Realtime)using a rate based on caller specified time to change from 1.0 to 0.0
void SetRapidFROwRate(float FRO, float DecelTime); // change from current to the specified Rapid FRO (FRO=1.0=Realtime)using a rate based on caller specified time to change from 1.0 to 0.0
void SetFROwRateTemp(float FRO, float DecelTime); //  Temporarily change from current to the specified FRO using a rate based on caller specified time, override FeedHold, don't save as LastFRO
extern float CS0_LastFRO;         // Last Desired FRO (used for Resume after FeedHold or for changes in FRO while in FeedHold)
extern float CS0_LastRapidFRO;      // Last Desired FRO (used for Resume after FeedHold during Rapid)

// Called after adding something to the Cood Motion Buffer.  Increments the Coord Motion Buffer pointer
// while keeping track of how much time is currently in the buffer (CS0_TimeDownloaded), also how much
// was over written due to buffer wrapping (CS0_TimeLost) to be able to determine the extent that it is
// possible to reverse, and keep the buffer terminated with TRAJECTORY_OFF
void IncParametricIndex(void);


#define MAX_TRIP 20  // max trip states for individual axis moves
extern TRIP_COEFF TripCoeffs[N_CHANNELS][MAX_TRIP];  // Trip Coeff lists for each channel

// Limit Switch Options

// Bit 0 1=Stop Motor on Neg Limit, 0=Ignore Neg limit
// Bit 1 1=Stop Motor on Pos Limit, 0=Ignore Pos limit
// Bit 2 Neg Limit Polarity 0=stop on high, 1=stop on low
// Bit 3 Pos Limit Polarity 0=stop on high, 1=stop on low
//
// Bits 4-7 Action - 0 Kill Motor Drive
//                   1 Disallow drive in direction of limit
//                   2 Stop movement
//
// Bit 8=use Extended Limit Bit Numbers (LimitNegSwitchBit,LimitPosSwitchBit)
//
// (for legacy support allow packed 8-bit numbers)
// Bits 16-23 Neg Limit I/O Bit number
// Bits 24-31 Pos Limit I/O Bit number



//  M A I N   S T R U C T U R E   T H A T   D E F I N E S   A N   A X I S

typedef struct
{  
    int ChanNumber;                 // channel number 0-3
    int Enable;                     // enables feedback
    int InputMode;                  // sets position input mode (See Axis Input Modes)
    int OutputMode;     // sets servo/motor mode    (See Axis Output Modes)
    int LimitSwitchOptions;         // see above for description
    int LimitSwitchNegBit;   // Neg Limit I/O Bit number
    int LimitSwitchPosBit;   // Pos Limit I/O Bit number
 int MasterAxis;     // -1 if none, else master axis channel to slave to
 double SlaveGain;    // Multiplicative Factor for slave motion
    double MaxFollowingError;       // Kill motor if error exceeds this value
    double LastFollowingError;      // Last Measured Following Error
    double t;                       // current time in secs within the trip state
    double Dest;                    // current dest position for servo
 double UnfilteredDest;   // unfiltered current dest position for servo (before CM smoothing)
    double DestOffset;              // Additional offset to position (used by Injection)
    float Vel;                      // max velocity for the move trajectory
    float Accel;                    // max Acceleration for the move trajectory
    float Jerk;                     // max Jerk (rate of change of Accel) for the move
    float FFAccel;                  // Acceleration feed forward
    float FFVel;                    // Velocity feed forward
    double Position;                // encoder, ADC, Resolver, reading
    double invDistPerCycle;         // for stepper distance for one complete cycle (4 full steps)
                                    // for brushless 3-4 phase encoder counts for one complete cycle
                                    // (saved as reciprical for speed)     
    float StepperAmplitude;         // Microstepper Amplitude in PWM counts to apply (moving slow, without lead comp)
    float Output;                   // Value output to PWM or DAC or CL Stepper offset
    float prev_output;              // previous Output so Slave can track Master when in CL Stepper
    float Lead;                     // Lead compensation to correct for step motor inductance
    TRIP_COEFF *pcoeff;             // pointer to coeff that interrupt routine uses, NULL if done
    double last_position;           // last measured error
    double last_dest;               // last destination from beginning of prev servo interrupt
 double prev_dest;    // prev destination from end of prev servo interrupt (will incl User changes to Dest)
 int LastNonZeroDir;    // Last direction we actually moved some amount(+1=Positive, 0=undefined, -1=negative)
 int DirectionOfMotion;   // Dest change was in this direction (+1=Positive, 0=none, -1=negative)
 float last_vel;                 // last destination velocity
    float x1last,x2last;            // used with lead compensation
    int   OutputChan0,OutputChan1;  // pwm or DAC channels to use    
    int   InputChan0,InputChan1;    // Encoder or ADC channels to use
    float InputOffset0,InputGain0;  // offsets and gains for Resolver Input 0,1 (x'=ax+b)
    float InputOffset1,InputGain1;  //   or for ADC, or (InputGain0=-1 reverses encoder)
 float OutputGain;    // Scale or Reverse Output Magnitude or Direction
 float OutputOffset;    // Offset the output
    float CommutationOffset;        // 3 or 4 phase commutation offset, PhaseA = sin((Position+CommutationOffset)*invDistPerCycle)
    float last_theta;               // last resolver theta reading
    float theta_correction;         // resolver correction offset to correct for nonlinearities
    signed char last_enc;           // last fpga encoder reading
    float P,I,D;                    // pid gain values
    float MaxI;                     // max integrator windup
    float MaxErr;                   // error saturates at this value
    float integrator;               // current integrator vlue
    float MaxOutput;                // max allowed servo output
    float DeadBandRange;            // Range about zero where gain change occurs
    float DeadBandGain;             // Additional gain within DeadBand Range
 int LastMotionType;    // Type of last move - used in Immediate Stop/Resume
 double LastMotionDest;   // Where last move was to go - used in Immediate Stop/Resume
 float ExpMotionVc;    // Velocity point on exp curve where Max Accel is obtained
 float ExpMotionXc;    // Distance point on exponential curve where Max Accel is obtained
 float SoftLimitNeg;    // Negative Soft Limit (counts)
 float SoftLimitPos;    // Positive Soft Limit (counts)
 int BacklashMode;    // Type of correction:  Currently only BACKLASH_OFF, BACKLASH_LINEAR
 float BacklashAmount;   // Amount of Backlash to be applied
 float BacklashRate;    // Rate Backlash shoule be applied, counts/sec
 int BacklashDirection;   // Last non zero direction moved
 float PrevBacklashDest;   // Prev Destination where backlash was determined to allow small hysteresis
 float Backlash;     // current amount of compensation being applied

    TRIP_COEFF *c;                // move profile polynomial coefficients list (up tp MAX_TRIP)
    IIR iir[N_IIR_FILTERS];         // several IIR filters
}CHAN;

// continuously sent by DMA to DACs
extern short int DAC_Buffer[N_DACS];   //  format    12 bits data
#define DAC(ch, v) DAC_Buffer[ch]=((v-2048)&0xfff)  // set DAC channel to value (range -2048/+2047)

extern int ADC_BufferIn[N_ADCS];     //  format   12 bits data
#define ADC(ch) (ADC_BufferIn[ch]-2048)   // return ADC reading of specified channel (range -2048/2047)extern int ADC_BufferIn[N_ADCS];     //  format   4-dummy bits 12 bits data 16 dummy

extern int ADC_BufferInSnap[2*N_ADCS_SNAP];   //  Snap Amp Current ADC format  16-bits data

  1. define FULL_RANGE_CURRENT 4.85f
    #define MeasuredAxisAmps(axis) ((ADC(axis+4)+2048)*(FULL_RANGE_CURRENT/4096.0f))  // returns measured current in an axis (Amperes)

// On board Power Amp PWM control

  1. define MAX_PWMR_VALUE 400  // Max value for PWMs in Recirculate mode
    void WritePWMR(int ch, int v);  // Write to PWM - Recirculate mode (+ or - power then shorted)
    #define MAX_PWM_VALUE 230  // Max value for PWMs in antiphase mode
    void WritePWM(int ch, int v);   // Write to PWM - locked anti-phase mode (+ power then - power)
  1. define MAX_PWMC_VALUE 1000  // Max value for PWMs in Current Mode (SnapAmps only)
    void WritePWMC(int ch, int v);  // Write to PWM - Current Loop mode - Always optimal decay

extern int SnapAmpPresent;         // 1 = SnapAmp Present 0= Not Present
extern int DisableSnapAmpDetectOnBoot;  // disables using Bits 12,13, and 15 on JP7 detect AutoDetect SnapAmps
void WriteSnapAmp(int add, int data);  // write a 16-bit word directly to SnapAmp FPGA
int ReadSnapAmp(int add);     // read a 16-bit word directly from SnapAmp FPGA


// Digital I/O bit PWM control (8 I/O bits on KFlop JP6 may be pulsed)

  1. define N_IO_PWMS 8    // Number of pwms that may be assigned to GPIO bits  
    #define IO_PWMS 0xD0     // FPGA offset to IO PWM registers (2 bytes each - value, enable(bit0))
    #define IO_PWMS_PRESCALE 0x2f   // FPGA offset to IO PWM Pre-Scale clock divider 0-255, 0 = 16.6MHz, 1=8.33MHz, ...
    #define IO_PWM_MAX_VALUE 255    // 0 = 0%, 255 = 100 % duty cycle

// addr to r/w encoder noise rejection filter value (0..255),
// Bit8 switches Encoders Ch4-7 from JP5 to JP6,
// Bit9 switches Encoders Ch0-3 from JP7 to JP4
#define ENC_NOISE_FILTER_ADD  0x05  
#define ENC_0_3_JP4 0x200
#define ENC_4_7_JP6 0x100
#define ENC_NOISE_FILTER_DEFAULT_VAL 7 // noise rejection filter default value (100MHz/3/7/2 = 2MHz)


#define ENC_NOISE_ERR_ADD 0x08  // encoder sudden change by 2 error address
#define ENC_NOISE_ERR_BIT0 4  // encoder sudden change by 2 error bit for encoder 0
#define ENC_NOISE_ERR_BIT1 5  // encoder sudden change by 2 error bit for encoder 1
#define ENC_NOISE_ERR_BIT2 6  // encoder sudden change by 2 error bit for encoder 2
#define ENC_NOISE_ERR_BIT3 7  // encoder sudden change by 2 error bit for encoder 3


// FPGA Step and Direction Frequency Generators (8) are available
//
//
#define NSTEPDIR 8

// address of 6 bit pulse length 0-63= # 16.666MHz clocks,
// bit6 muxes generators 0-3 from JP7 to JP4 and JP6,
// bit7 reverses polarity (0=pulses low & Pos Dir high, 1=pulses high & Pos Dir Low)
#define STEP_PULSE_LENGTH_ADD 0x06

  1. define STEP_PULSE_LENGTH_DEFAULT 32 // default pulse length of ~ 2us
  1. define STEP_RATE_ADD 0x3c // write a 32 bit word - Bit31=enable, Bit27=Drive, Bits24-26=chan, 0-23= signed fraction of 16.666MHz
    #define STEP_POSITION_ADD0 0x40 // read a 16 bit word - step count0 - 9 bits signed position and 7 bits of fraction
    #define STEP_POSITION_ADD1 0x42 // read a 16 bit word - step count1 - 9 bits signed position and 7 bits of fraction
    #define STEP_POSITION_ADD2 0x44 // read a 16 bit word - step count2 - 9 bits signed position and 7 bits of fraction
    #define STEP_POSITION_ADD3 0x46 // read a 16 bit word - step count3 - 9 bits signed position and 7 bits of fraction
    #define STEP_POSITION_ADD4 0x48 // read a 16 bit word - step count4 - 9 bits signed position and 7 bits of fraction
    #define STEP_POSITION_ADD5 0x4a // read a 16 bit word - step count5 - 9 bits signed position and 7 bits of fraction
    #define STEP_POSITION_ADD6 0x4c // read a 16 bit word - step count6 - 9 bits signed position and 7 bits of fraction
    #define STEP_POSITION_ADD7 0x4e // read a 16 bit word - step count7 - 9 bits signed position and 7 bits of fraction


extern int KanalogPresent;     // 1=Kanalog Present
extern int DisableKanalogDetectOnBoot;  // disables using Bits 16-20 and 23 on JP4 to detect AutoDetect Kanalog

extern int KStepPresent;       // 1=KStep Present - set this to mux inputs into virtual bits 48-63

// Kanalog FPGA Registers for internal use only
#define KAN_TRIG_REG 0xA0  // triggers a transfer to/from Kanalog, 1-enables Kanalog, 2-enables RS232, 3-both
#define KAN_DAC_REGS 0x80    // 8 - 12 bit r/w regs
#define KAN_FET_OPTO 0x88    // 1 - 16 bit 15-8 FET drivers, 7-0 Opto Outputs
#define KAN_GPOUT    0x89    // 1 - 8 bit   7-0 GP 3.3V OUTPUTS
#define KAN_ADC_REGS 0x90    // 8 - 12 bit r/w regs
#define KAN_OPTOIN_GPIN 0x98   // 1 - 16 bit 15-8 OptoInputs, 7-0 GP 3.3V inputs

// Kanalog IO Bit numbers
#define KAN_INPUTS 128   // 16 Bits 128-143 (128-135 GPIN, 136-143 Opto in)
#define KAN_NINPUTS 16   // 16 Input Bits
#define KAN_OUTPUTS 144   // 24 Bits 144-167 (144-151 Opto out, 152-159 FET/Relay Drivers, 160-167 GPOUT)
#define KAN_NOUTPUTS 24   // 24 output Bits


// 3 Phase manual control. Angle is specified in cycles.
// cycles is a double precision value an may be a very
// large number.  Only the fractional part will be used. 
#define MAXV 230.0f // Max allowed 3 phase vector (512/2/sin(60) - EOFF*4)
void Write3PH(CHAN *ch0, float v, double angle_in_cycles); // put a voltage v on a 3 Phase motor at specified commutation angle
void Write4PH(CHAN *ch0, float v, double angle_in_cycles); // put a voltage v on a 4 Phase motor at specified commutation angle


extern int LastPWM[N_PWMS+2*N_PWMS_SNAP];    // +/- 255 counts

int ReadADC(int ch);           // User Programs should use ADC() command instead
void WriteDAC(int ch, int v);  // User Programs should use DAC() command instead


//  S P I N D L E   A N D   T H R E A D I N G   S U P P O R T

// main Spindle data structure which maintains Spindle
// Position Info and threading control

typedef struct
{
 double Position;   // position in revs
 double StartPosition;  // position in revs to begin threading
 double LastUpdatePosition; // last position in revs where speed was computed
 double RevsPerCount;  // inverse of counts/rev
 double UpdateTick;   // which servo tic we should calc RPM
 double DeltaTicks;   // # Servo tics between speed measurement
 double AdjTimeFilt;   // Lead Adjusted, filtered, time
 double LastCSTime;   // Previous Coordinate System Time
 double *pEncoderPos;  // pointer to Spindle Position
 double K;     // Tau low pass filter coefficient
 float TrueSpeedRPS;   // last measured speed
 float InvBaseSpeedRPS;  // Reciprocal of Base speed of which trajectory was planned
 double InvBaseSpeedRPSK1; // InvBaseSpeedRPS * (1-K)
 float InvUpdateTime;  // Reciprocal of update time to avoid division
 float Tau;     // Time constant for spindle filtering
 int Type;     // Type=0 None, Type=1 uses encoder to measure spindle position
 int ThreadingActive;  // True when threading is in progress

} SPINDLE;

extern SPINDLE Spindle;

void ConfigureSpindle(int Type, int Axis, float UpdateTimeSecs, float Tau, float CountsPerRev);  // configures for type of Spindle feedback
void TrigThreading(float BaseSpeedRPS); // triggers threading coordinated motion, BaseSpeed is the ideal Spindle speed thatthe motion was planned for


//  T I M E   F U N C T I O N S

double Time_sec();// returns total time since power up in seconds

void WaitUntil(double time_sec);// wait until a specified time

void Delay_sec(double sec);// Delay time in seconds

// (returns current time)
double WaitNextTimeSlice(void);// wait until a thread's new time slice begins


  1. define TIMER0  (*(volatile int *)0x42000010) // 32 bit raw hardware timer counts at CLOCKFREQ (see PC_DSP.h) 

extern volatile double ServoTick;         // increments each servo interrupt
extern volatile unsigned int LastTimer0;  // Last timer value when the ServoTick was incremented


 
extern CHAN chan[N_CHANNELS];   // the axes channel related structures
extern CHAN *ch0;               // global pointer to axis 0
extern CHAN *ch1;               // global pointer to axis 1
extern CHAN *ch2;               // global pointer to axis 2
extern CHAN *ch3;               // global pointer to axis 3
extern CHAN *ch4;               // global pointer to axis 4
extern CHAN *ch5;               // global pointer to axis 5
extern CHAN *ch6;               // global pointer to axis 6
extern CHAN *ch7;               // global pointer to axis 7


// This status contains the majority of all status
// so that it can be uploaded as a bulk transfer
extern MAIN_STATUS MainStatus;


void DisableAxis(int ch); // Disable the Axis, Servo output is set to zero


void EnableAxisDest(int ch, double Dest); // enable the Axis and set the destination


void EnableAxis(int ch); // enable the Axis at the current encoder position


// do this before enabling servo or when
// filter coefficients change
void ResetFilters(int ch); // Resets Filter history to known state


void Zero(int ch);  // Zero the Encoder Position and Current Commanded Position

// Basic motion commands to move one axis
void Move(int ch, double x);   // move using absolute coordinates
void MoveAtVel(int chno, double x, float MaxVel);        // move using absolute coordinates and specify the velocity
void MoveRel(int ch, double dx);    // move relative to current destination
void MoveRelAtVel(int chno, double x, float MaxVel);        //  move relative to current destinatio and specify the velocity
void Jog(int ch, double vel);       // move continiously at specified velocity
void MoveExp(int chno, double x, double Tau);  // exponentially approach a target at time constant Tau

int CheckDone(int ch);  // returns 1 if axis is Done, 0 if not, -1 if axis is disabled


// Basic motion commands to move 3 axes
//
void MoveXYZABC(double x, double y, double z, double a, double b, double c); // Moves 6 axes (each axis moves independently)
int CheckDoneXYZABC(); // Check if all CS axis have completed , returns 1 if all complete, -1 if any is disabled, otherwise 0


int CheckDoneBuf();   // returns 1 if Done, 0 if not, -1 if any axis in CS disabled
int CheckDoneGather();
void StartMove(int ch);

void SetupForMove(double From, double To, float MaxVel, CHAN *ch, int CoeffOffset,
                                                  int NoJerkControlAtStart,
                                                  int NoJerkControlAtEnd,
                                                  int Start,
              int *Nstates);
                                                 
void SetupForMotionPause(double x,CHAN *ch,int CoeffOffset, double time);  // stay still                                                  

// coordinate systems #0 - axis definitions
extern int CS0_axis_x; // Axis channel number to use as x
extern int CS0_axis_y; // Axis channel number to use as y 
extern int CS0_axis_z; // Axis channel number to use as z 
extern int CS0_axis_a; // Axis channel number to use as a 
extern int CS0_axis_b; // Axis channel number to use as b 
extern int CS0_axis_c; // Axis channel number to use as c 
extern int CS0_axis_u; // Axis channel number to use as u 
extern int CS0_axis_v; // Axis channel number to use as v 

void DefineCoordSystem(int axisx, int axisy, int axisz, int axisa); // define axis chan numbers to use as x,y,z,a (set -1 to disable)
void DefineCoordSystem6(int axisx, int axisy, int axisz, int axisa, int axisb, int axisc); // define axis chan numbers to use as x,y,z,a,b,c (set -1 to disable)
void DefineCoordSystem8(int axisx, int axisy, int axisz, int axisa, int axisb, int axisc, int axisu, int axisv); // define axis chan numbers to use as x,y,z,a,b,c,u,v (set -1 to disable)


// A Low Pass filter can be applied to all 8 axes of coordinated motion
// by setting the KLP coefficient.  To compute an appropriate coefficient
// from a time constant Tau in seconds use KLP = exp(-TIMEBASE/Tau);
 
extern double KLP;  // coordinated motion low pass filter coefficient

// TauKLP = -TIMEBASE/log(KLP);  automatically computed by ExecBuf command
extern float TauKLP;      // "smoothing" related time constant used for End Motion

extern float SplineTauFactor;  // Final Spline motion to target will have a time duration of this number of TauKLP (defaults to 2)


// Stop profile generation
// which will stop updating (freeze) the destination
// new commands can then be placed into the queue

void StopMotion(CHAN *ch);

// put a trajectory off into the queue
 
void SetupForMotionEnd(CHAN *ch, int CoeffOffset) ;


// Digital I/O Functions
 
#define BIT_SET  0x100      // rel address in FPGA where bit set ports reside
#define BIT_CLR  0x110      // rel address in FPGA where bit clear ports reside
#define BIT_DIR  0x120      // rel address in FPGA where bit Direction ports reside
#define BIT_READ 0x130      // rel address in FPGA where bit read ports reside

// Fixed I/O bit definitions

  1. define LED0 46  // KFLOP LED #0 bit number
    #define LED1 47  // KFLOP LED #1 bit number


// Virtual I/O bits
extern int VirtualBits;     // Virtual I/O bits simulated in memory, use SetBit/ClearBit/SetStateBit(32-63 to reference)

// Virtual I/O bits Extended 1024-2047
extern int VirtualBitsEx[N_VIRTUAL_BITS_EX/32]; // 1024 Expanded Virtual Bits (1024-2047)

extern int BitDirShadow[2];   // direction of all 64 I/O bits
extern int BitDirShadowSnap0;   // direction of 14 Snap Amp, 1st board, I/O bits
extern int BitDirShadowSnap1;   // direction of 14 Snap Amp, 2nd board, I/O bits

void SetBitDirection(int bit, int dir); // define bit as input (0) or output (1)
int GetBitDirection(int bit);           // returns whether bit is defined as input (0) or output (1)
void SetBit(int bit);                   // set a bit high (bit must be defined as an output, see SetBitDirection)
void ClearBit(int bit);                 // set a bit low (bit must be defined as an output, see SetBitDirection)
void SetStateBit(int bit, int state);   // set a bit high or low (bit must be defined as an output, see SetBitDirection)
int ReadBit(int bit);                   // read the state of an I/O bit


// Non volatile Flash functions

  1. define FLASH ((volatile char *)0x90000000)  // beginning of FLASH - first 1MByte is for System Use
    #define FLASH_USER ((volatile char *)0x90100000)  // 2nd MegByte is for User use
    #define FLASH_BLOCK_SIZE (0x10000)  // FLASH erases in 64KByte Blocks
    #define IRAM  ((volatile char *)0x10000000)
    #define SDRAM ((volatile char *)0x80000000)
    int ProgramFlash(volatile char *src, int Length, volatile char *dest, char *message);  //Programs Flash source address of data, length in 16-bit words, dest add must be on 64KByte block, optional \n terminated message
    void SetFlashBank(volatile unsigned short *add);  // sets the currently addressable flash bank (address bits 14-19)


// KONNECT AUX PORT FUNCTIONS
//
// Example:
//
// Configure KFLOP to service Konnect 32 Input 16 output IO board
// Board address is 0,
// 16 Outputs are mapped to Virtual IO 48-63 (VirtualBits)
// 32 Inputs are mapped to Virtual IO 1024-1055 (VirtualBits[0])
//
//  InitAux();
//  AddKonnect(0,&VirtualBits,VirtualBitsEx);
//

void InitAux(void);  // Initialize the AUX Port KFLOP JP4 or JP6 and clear list of board to be serviced (only one Aux Port may be used at a time)

// Board address, address of 32-bit into to get the Output Bits (in low 16 bits), address of where to put 32 Inputs
void AddKonnect(int BoardAddress, int *OutputAddress, int *InputAddress);  // add a Konnect Board to list of AUX1 Port Boards to be serviced

// Board address, address of 32-bit into to get the Output Bits (in low 16 bits), address of where to put 32 Inputs
void AddKonnect_Aux0(int BoardAddress, int *OutputAddress, int *InputAddress); // add a Konnect Board to list of AUX0 Port Boards to be serviced


                               
// User Print Routines
//
// sends a string to the user console of the KMotion
// application.  Because other threads may be sending
// characters, the strings are buffered in a queue
// and sent by the primary thread as soon as there
// is no PC input to process.  The string prepends
// an escape so the PC application knows for sure
// to send this to the Console window and not to
// process it as a response to a command that may
// be in the pipeline.
//
//
// normally the routine exits to the caller quickly
// unless the queue is full, then it must wait

  1. define MAX_STRING 128                   
    #define MAX_NSTRINGS 256  // must be binary   

// Note: standard C language printf

int printf(const char *format, ...);       // Print formatted string to console
int sprintf(char *s, const char *format, ...);  // Print formatted string to string

typedef int FILE;
FILE *fopen(const char*, const char*);     // Open a text file for writing on the PC (2nd param = "rt" or "wt")
int fprintf(FILE *f, const char * format, ...);     // Print formatted string to the PC's Disk File
int fclose(FILE *f);                           // Close the disk file on the PC

int Print(char *s);                        // Print a string to the console window
int PrintFloat(char *Format, double v);    // Print a double using printf format, ex "%8.3f\n"
int PrintInt(char *Format, int v);         // Print an integer using printf format, ex "result=%4d\n"
                               
int sscanf(const char *_str, const char *_fmt, ...); //scan string and convert to values

  1. define MAX_READ_DISK_LENGTH 1024 // max allowed length of disk file line length
    extern volatile int read_disk_buffer_status; //status of read disk buffer 1=line available, 2=error, 3=eof
    extern char read_disk_buffer[MAX_READ_DISK_LENGTH+1];
    char *fgets(char *str, int n, FILE *file); //read string from PC disk file, str=buffer, n=buffer length, f=FILE pointer, returns NULL on error
    int fscanf(FILE *f, const char *format, ...); //read sting from PC Disk file, convert values, returns number of items converted
    int feof(FILE *f);   // End of file status for disk reading

/*
 * MessageBox() Flags thes can be passed to the PC to invoke MessageBoxes
 *              for some applications such as KMotionCNC which monitor upload
 *              status and present message boxes when requested.  See the pc-dsp.h
 *              header for more information
 */
#define MB_OK                       0x00000000L
#define MB_OKCANCEL                 0x00000001L
#define MB_ABORTRETRYIGNORE         0x00000002L
#define MB_YESNOCANCEL              0x00000003L
#define MB_YESNO                    0x00000004L
#define MB_RETRYCANCEL              0x00000005L
#define MB_CANCELTRYCONTINUE        0x00000006L
#define MB_ICONHAND                 0x00000010L
#define MB_ICONQUESTION             0x00000020L
#define MB_ICONEXCLAMATION          0x00000030L
#define MB_ICONASTERISK             0x00000040L
#define MB_APPLMODAL                0x00000000L
#define MB_SYSTEMMODAL              0x00001000L
#define MB_TASKMODAL                0x00002000L
#define MB_NOFOCUS                  0x00008000L
#define MB_SETFOREGROUND            0x00010000L
#define MB_DEFAULT_DESKTOP_ONLY     0x00020000L
#define MB_TOPMOST                  0x00040000L
#define MB_RIGHT                    0x00080000L

/*
 * Dialog Box Command IDs
 */
#define IDOK                1
#define IDCANCEL            2
#define IDABORT             3
#define IDRETRY             4
#define IDIGNORE            5
#define IDYES               6
#define IDNO                7


// Misc routines

void DoResolverInput2(CHAN *chx, float x, float y);  // optimized routine to handle sin/cosine resolver input

extern double ResolverFactor; // defaults to 1000.0/TWO_PI converts sine/cosine angle to reported Position


// M U L T I - T H R E A D   S U P P O R T

// user threads are numbered 1 .. n

void StartThread(int thread);  // starts a downloaded program at it's entry point
void PauseThread(int thread);  // stops a thread from executing
int ResumeThread(int thread);  // resumes a tread after a pause
void ThreadDone(void);         // call to terminate current thread
extern int CurrentThread;      // current thread that is/was executing  0 = Pri 1-7 = User Threads


// A User Program Call Back can be defined to be called every Servo Sample
// Set to Non-NULL for the the Callback to be made.  The Callback Routine
// must return with a few micro seconds or the system may become unstable
typedef void USERCALLBACK(void);
extern USERCALLBACK *UserCallBack;


// used to allow mutual exclusive access to a resource
// (waits until resource is available, then locks it)
// if the thread that locked it is no longer active,
// release the lock

void MutexLock(int *mutex);
void MutexUnlock(int *mutex);

// These routines are written in assembly such that
// they are atomic and are un-interruptible by using
// instructions in delayed branching

void AtomicSet(int *p, int mask);
//{
// *p = *p | mask;
//}

void AtomicClear(int *p, int mask);
//{
// *p = *p & mask;
//}

// test a location and if zero, set
// to value.  returns the original
// value.  routine is atomic

int TestAndSet(int *mutex, int value);
//{
// register result = *mutex;
// if (result==0) *mutex=value;
// return result;
//}


// S N A P   A M P   D E F I N I T I O N S

  1. define KM_SNAP_READ_LOW 0xc
    #define KM_SNAP_READ_HI  0xd
    #define KM_SNAP_READ_EXCEPTION 0x10
    #define KM_SNAP_CLK_ENA 0x09
    #define KM_SNAP_SHIFT_BYTE 0x0a
    #define KM_SNAP_WRITE_HIGH_TRIG 0x0b
    #define KM_SNAP_READ_ADD_TRIG 0x0c
    #define KM_SNAP_READ_ADD_BITMAP 0x28
    // FPGA Registers
  1. define SNAP0 0x40  // Base Addresse SNAP AMP #0
    #define SNAP1 0x60  // Base Addresse SNAP AMP #1 

// write addresses

  1. define SNAP_PWMS 0      // (4) 16 bit PWMs
    #define SNAP_CLR_ENC_ERRS 8   // any write clears all encoder errors
    #define SNAP_CUR_LOOP_GAINS 9  // (4) 8 bit Current Loop Gains Default=16
    #define SNAP_SET_BIT 17    // (14) GPIO bits
    #define SNAP_CLR_BIT 18    // (14) GPIO bits
    #define SNAP_DIR_BIT 19    // (14) GPIO bits
    #define SNAP_SUPPLY_CLAMP0 20  // 16 bit power supply clamp setting side A
    #define SNAP_SUPPLY_CLAMP_ENA0 21 // 1 bit power supply clamp enable side A
    #define SNAP_SUPPLY_CLAMP1 22  // 16 bit power supply clamp setting side B
    #define SNAP_SUPPLY_CLAMP_ENA1 23 // 1 bit power supply clamp enable side B
    #define SNAP_PEAK_CUR_LIMIT0 24  // 4 bits peak current limit side A
    #define SNAP_PEAK_CUR_LIMIT1 25  // 4 bits peak current limit side B

// read addresses

  1. define SNAP_PWMS 0      // (4) 16 bit PWMs
    #define SNAP_ENC 8       // (4) 16 bit Encoders (bit15=error 7-0=data)
    #define SNAP_CURRENT_A0 12   // Measured Current Side A Lead A (14bits)
    #define SNAP_CURRENT_C0 13   // Measured Current Side A Lead C
    #define SNAP_CURRENT_A1 14   // Measured Current Side B Lead A
    #define SNAP_CURRENT_C1 15   // Measured Current Side B Lead C
    #define SNAP_DIFF_IN 16     // 16 bits (15-8= Diff inputs 7-0=encoder inputs)
    #define SNAP_IN_BIT 17    // (14) GPIO bits
    #define SNAP_SUPPLY_VOLT0 22  // Measured Supply Voltage Side A
    #define SNAP_SUPPLY_VOLT1 23  // Measured Supply Voltage Side B
    #define SNAP_TEMP0 24    // Measured Temperature Side A
    #define SNAP_TEMP1 25    // Measured Temperature Side B
    #define SNAP_STATUS 30    // Status (FAN,OverTemp1,OverTemp0,OVER_CUR1,OVER_CUR0,Fault)
    #define SNAP_RESET 31    // Reset

//RS232 FPGA Register Definitions

  1. define RS232_STATUS 0xc1  // Status Reg Address
    #define RS232_DATA 0xc0   // 8 bit data read/write reg address
    #define RS232_DATA_READY 0x01 // Data ready to read status mask
    #define RS232_TRANSMIT_FULL 0x02// Transmit buffer full status mask
  1. define RS232_BAUD_REG 0xc1 // Set Baud rate 8-bit divisor Reg Address
    #define RS232_BAUD_115200  ((16666666/115200/16)-1)// 8-bit divisor value to set 115200 baud
    #define RS232_BAUD_57600  ((16666666/57600/16)-1) // 8-bit divisor value to set  57600 baud
    #define RS232_BAUD_38400  ((16666666/38400/16)-1) // 8-bit divisor value to set  38400 baud
    #define RS232_BAUD_19200  ((16666666/19200/16)-1) // 8-bit divisor value to set  19200 baud
    #define RS232_BAUD_9600  ((16666666/9600/16)-1) // 8-bit divisor value to set   9600 baud
    #define RS232_BAUD_4800  ((16666666/4800/16)-1) // 8-bit divisor value to set   4800 baud

void InitRS232(int baud);
void EnableRS232Cmds(int baud);

extern char * volatile pRS232RecIn;  // Buffered Receive Pointer Head
extern char *pRS232RecOut;           // Buffered Receive Pointer Tail
extern char *pRS232TxIn;             // Buffered Transmit Pointer Head
extern char * volatile pRS232TxOut;  // Buffered Transmit Pointer Tail
extern int DoRS232Cmds;              // Enables/disables KFLOP Command processor to/from RS232

char RS232_GetChar(void);   // Get Internally Buffered (1000 chars) RS232 received Data
void RS232_PutChar(char c); // Put Internally Buffered (1000 chars) RS232 transmit Data


  1. endif