⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 servoboard.h

📁 机器人超声波避障系统
💻 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 + -