--- tags: Robot id, software, Motion Card --- Motion Card === ## MotionCard.h ```C++= #ifndef MOTIONCARD #define MOTIONCARD #include "C:\\IMP3\\IMCDriver.h" \\ 修改Path #include "C:\\IMP3\\IMCDefine.h" \\ 修改Path #include <stdio.h> #define AXIS 6 #define PI 3.1415926 void MotionCard_OpenCard(); void MotionCard_CloseCard(); void MotionCard_DAC(int Axis, double Voltage); void MotionCard_ChangeTimer(TMRISR Timer); #endif ``` ## MotionCard.cpp ### Opencard ```C++= void MotionCard_OpenCard() { // --- 軸卡初始化 --- /* Bool IMC_OpenDevice( // true:Initial IMP 模組成功 false:Initial IMP 模組失敗 int nMode, // 0:初始化 IMP 的 PCI 模式 1:初始化 IMP 的 Standalone 模式 WORD wCardIndex) */ int nRet = IMC_OpenDevice(0, 0); if (nRet == 0) { printf("Initialization Fails !"); } else { // --- 重置 IMP 模組 --- /* IMC_GLB_ResetModule( WORD ModuleID, // RESET_ALL: All Modules WORD wCardIndex) // 欲控制的運動控制卡之編號,編號範圍 0~5 */ IMC_GLB_ResetModule(RESET_ALL, 0); // --- 遮閉 IMP 模組中斷功能 --- /* IMC_GLB_SetInterruptMode( int mode, // IMC_ALL_INT_UNMASK: All Modules WORD wCardIndex) */ IMC_GLB_SetInterruptMask(IMC_ALL_INT_UNMASK, 0); //---------------- DAC & ADC ---------------- for (int i = 0; i < AXIS; i++) { // --- 設定 DAC 命令源為軟體規劃 --- /* IMC_DAC_SelectSource( WORD channel, // DAC channel number 0 ~ 7 WORD source, // DAC_CMD_SOFT:Source from DAC output buffer WORD wCardIndex)*/ IMC_DAC_SelectSource(i, DAC_SOURCE_SOFT, 0); // --- 開啟 DAC 功能 --- /* IMC_DAC_EnableChannel( WORD channel , // DAC channel number 0 ~ 7 WORD wEnable, // 1 開啟或 0 關閉指定 DA Channel 轉換功能 WORD wCardIndex)*/ IMC_DAC_EnableChannel(i, 1, 0); } // --- 開啟 DAC 功能 --- /* IMC_DAC_StartConverter( WORD wStart, // 1 開啟或 0 關閉 DAC 轉換功能 WORD wCardIndex)*/ IMC_DAC_StartConverter(1, 0); for (int i = 0; i < AXIS; i++) { // --- DAC 電壓清空 --- /* IMC_DAC_SetOutputVoltage( WORD channel, // DAC channel number 0 ~ 7 float fVoltage, // 類比輸出電壓 (-10V ~ 10 V) WORD wCardIndex) */ IMC_DAC_SetOutputVoltage(i, 0.0, 0); } //---------------- 中斷功能 ---------------- // --- 設定計時器計時時間 1000 us (1豪秒) --- /* IMC_TMR_SetTimer( float dfPeriod, // 計時器時間(µs),可設定範圍 (0 ~ 2^32 毫秒) WORD wCardIndex) */ IMC_TMR_SetTimer(1000, 0); // --- 開啟計時器計時功能 --- /* IMC_TMR_SetTimerEnable( WORD wEnable, // 1 開啟或 0 關閉計時器功能 WORD wCardIndex) */ IMC_TMR_SetTimerEnable(1, 0); // --- 開啟計時器中斷功能 --- /* IMC_TMR_SetTimerIntEnable( WORD wEnable, // 1 開啟或 0 關閉計時器中斷功能 WORD wCardIndex) */ IMC_TMR_SetTimerIntEnable(1, 0); } } ``` ### Closecard ```C++= //==================== 關閉軸卡 =================== void MotionCard_CloseCard() { IMC_TMR_SetTimerIntEnable(0, 0); // 關閉計時器中斷功能 IMC_TMR_SetTimerEnable(0, 0); // 關閉計時器計時功能 for (int i = 0; i < AXIS; i++) { IMC_DAC_SetOutputVoltage(i, 0.0, 0); // DAC 電壓清空 } IMC_DAC_StartConverter(0, 0); // 停止 DAC 轉換 for (int i = 0; i < AXIS; i++) { IMC_DAC_EnableChannel(i, 0, 0); // 關閉DAC功能 } // --- 關閉 IMP 模組 --- /* IMC_CloseIfOpen( WORD wCardIndex) */ IMC_CloseIfOpen(0); } ``` ### DAC ```C++= //====================== DAC ====================== void MotionCard_DAC(int Axis, double Voltage) { IMC_DAC_SetOutputVoltage(Axis, Voltage, 0); // 設定輸出電壓 } ``` ### Switch Timer ```C++= //=================== 切換中斷 ===================== void MotionCard_ChangeTimer(TMRISR Timer) { // --- 串接中斷服務函式 --- /* IMC_TMR_SetISRFunction( TMRISR myTMR_ISR, // User 自己撰寫的 Timer 中斷副程式之 Function Pointer WORD wCardIndex)*/ IMC_TMR_SetISRFunction(Timer, 0); } ``` ### Servo On ```C++= //================== Servo On ====================== void MotionCard_ServoOn() { for (int i = 0; i < AXIS; i++) { // --- Servo On --- /* IMC_LIO_SetServoOn( WORD wChannel, WORD wCardIndex) */ IMC_LIO_SetServoOn(i, 0); // ServoOn } } ``` ### Servo Off ```C++= //================== Servo Off ===================== void MotionCard_Serco_Off() { for (int i = 0; i < AXIS; i++) { // --- Servo Off --- /* IMC_LIO_SetServoOff( WORD wChannel, WORD wCardIndex) */ IMC_LIO_SetServoOff(i, 0); // ServoOff } } ``` ### Read Encoder ```C++= // ================ 編碼器設定 =================== void MotionCard_Encoder(double(&JointEncRad)[AXIS]) { long MotorINCRPulse[AXIS] = { 0 }; double MotorINCRRad[AXIS] = { 0.0 }; for (int i = 0; i < AXIS; i++) { // --- "馬達端"增量型編碼器數值[Pulse] --- /* IMC_ENC_ReadCounter( WORD enc_ch_no, // encoder counter channel number (0~7) long *lCounter, // 讀取Encoder counter 數值 WORD wCardIndex) */ IMC_ENC_ReadCounter(i, &MotorINCRPulse[i], 0); MotorINCRRad[i] = ((double)MotorINCRPulse[i] / 260000.0) * CircleRad; // "馬達端"增量型編碼器數值[Rad] , 增量型編碼器設定一圈65000*4個Pulse , 驅動器參數P1-46*軸卡4倍頻 JointEncRad[i] = MotorINCRRad[i]; } } ```