📄 servoboard.h
字号:
/*
*Copyright (c) 2004 中国民用航空学院机器人研究所
*All rights reserved.
*
*文件名称: ServoBoard.h
*摘 要: 实现电机板对电机的基本操作
*
*当前版本: 1.0
*作 者: 牛国臣
*完成日期: 2004年3月15日
*修订
* 2004-7-25 SetPosMode函数里最终位置计算式修改为现有位置加上期望走的距离
* 2004-9-27 删掉了类中的脉冲转换系数,函数中有关参数都是以脉冲为单位
* 2004-12-8 修改了漏洞,使得返回速度和距离函数有效
*/
#ifndef _SERVO_BOARD_ITL_NGC
#define _SERVO_BOARD_ITL_NGC
#include "p9054_lib.h"
#include "pci_diag_lib.h"
class AFX_EXT_CLASS ServoBoard
{
public:
//构造函数,析构函数
ServoBoard();
ServoBoard( P9054_HANDLE hBoard); //hBoard为电机控制板的句柄
ServoBoard(const ServoBoard &other);
~ServoBoard( );
//复位函数
/*chSel格式:若bit0为1则选择第1路电机,否则没选择
若bit1为1则选择第2路电机,否则没选择
若bit2为1则选择第3路电机,否则没选择
若bit3为1则选择第4路电机,否则没选择
bit4~bit7没有用到
下面Start,Stop函数的chSel也是如法炮制*/
void Reset(BYTE chSel);
void DefineHome(BYTE chSel);
//中断控制函数
void ResetInt(UINT chIndex,BYTE resetByte);
void SetPoseErrorThreshold(UINT chIndex, short thresHold, BYTE flag);
void SetAbsBreakPoint(UINT chIndex, int abp );
void SetRelBreakPoint(UINT chIndex, int rbp);
void MaskInt(UINT chIndex, BYTE maskByte);
//控制器控制函数
void SetFilter(UINT chIndex, short kp, short ki, short kd, short il, BYTE samint);
//轨迹控制函数
void SetAcceleration(UINT chIndex, double acceleration);
/*
设置速度模式轨迹,chIndex为通道号;direct为速度模式的方向:1前,0后;
vel为速度,范围从0x0到0x3fffffff
*/
void SetVelModeTraj(UINT chIndex, BYTE direct, double velocity);
void SetPosModeTraj(UINT chIndex, double velocity, double position);
/*chSel格式:若bit0为1则选择第1路电机,否则没选择
若bit1为1则选择第2路电机,否则没选择
若bit2为1则选择第3路电机,否则没选择
若bit3为1则选择第4路电机,否则没选择
bit4~bit7没有用到*/
void Start(BYTE chSel);
void Stop(BYTE chSel, int stopmode);
void WaitMotorEnd(UINT chIndex);
//状态反馈函数
UINT GetTrajMode(UINT chIndex);
UINT GetTrajComplete(UINT chIndex);
UINT GetDirection(UINT chIndex);
//返回位置函数 单位--脉冲 有正负
//chIndex--电机板通道
DOUBLE GetRealPos(UINT chIndex);
DOUBLE GetDesirePos(UINT chIndex);
//返回速度函数 单位--脉冲/秒 有正负
//chIndex--电机板通道
DOUBLE GetRealVel(UINT chIndex);
DOUBLE GetDesireVel(UINT chIndex);
UINT GetChCount();
private:
BYTE GetStatusByte(UINT chIndex);
BYTE GetOneChannel(UINT chIndex);
BYTE GetMulChannel();
void CheckBusy(UINT chIndex);
void CheckBusyMul();
WORD GetSignalWord(UINT chIndex);
DWORD ComposeCommandMul(BYTE cmdIn);
UINT Shift(UINT chIndex);
BYTE GetDataByte(UINT chIndex);
//对电机板的底层操作
P9054_HANDLE FindAndOpenPciCard();//查找并打开PCI卡,P9054_HANDLE为打开的PCI卡的指针类型
void ClosePCICard(P9054_HANDLE hPlx);//关闭
void ResetPciCard(P9054_HANDLE hPlx);//复位PCI卡
void DisableInterrupt(P9054_HANDLE hPlx);//关中断
//connect and enable中断,第二个参数为中断处理函数指针
BOOL ConnectAndEnableInterrupt(P9054_HANDLE hPlx,void (WINAPI *IntHandlerRoutine)(P9054_HANDLE hPlx, P9054_INT_RESULT *intResult));//connect and enable中断
//enable interrupt
void EnableInterrupt(P9054_HANDLE hPlx);//开中断
//写命令,channel为通道号,command为命令,第一字节(最高高字节)为通道4,第二字节为通道3,第三字节为通道2,第四字(最低字节)节为通道1。
void WriteCommand(P9054_HANDLE hPlx,unsigned char channel,DWORD command);
//读状态,channel为通道号,返回值第一字节(最高高字节)为通道4,第二字节为通道3,第三字节为通道2,第四字(最低字节)节为通道1。
DWORD ReadStatus(P9054_HANDLE hPlx,unsigned char channel);
//写数据,channel为通道号,data为数据,第一字节(最高高字节)为通道4,第二字节为通道3,第三字节为通道2,第四字(最低字节)节为通道1。
void WriteData(P9054_HANDLE hPlx,unsigned char channel,DWORD data);
//读数据,channel为通道号,返回值第一字节(最高高字节)为通道4,第二字节为通道3,第三字节为通道2,第四字(最低字节)节为通道1。
DWORD ReadData(P9054_HANDLE hPlx,unsigned char channel);
// 数据成员
private:
enum
{
CHANNELNUM=4
};
//电机卡句柄
P9054_HANDLE m_hBoard;
const double SAMPLEPERIOD; //系统采样周期
const double ENCODERRATIO; //编码器每个周期的分频数
//多通道操作专用
BOOL m_ch1;
BOOL m_ch2;
BOOL m_ch3;
BOOL m_ch4;
};
#endif //_SERVO_BOARD_ITL_NGC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -