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

📄 motorctrol.cpp

📁 一个用于无刷直流电动机的驱动与控制程序.里面所用的采集卡的型号为MC08.
💻 CPP
字号:
// MotorCtrol.cpp : implementation file
//

#include "stdafx.h"
#include "TestForm.h"
#include "MotorCtrol.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// MotorCtrol

MotorCtrol::MotorCtrol()
{
	////--------------初始化各变量--------------------------////
	m_bMotorRunflag = FALSE;	//电机停止
	m_bMotorDebugflag =FALSE;	//电机调试标志变量

	m_bMotorVmove= TRUE;		//电机连续运动
	m_bMotorRtype= TRUE;		//电机速度类型,真为快速运动方式
	m_bMotorStype= TRUE;		//电机制动方式,真为光滑制动方式
	
	m_nMotorDirectTem = 0;		//电机转向暂存,正转
	m_nMotorDirect = 1;			//电机转向,正转

	m_lMotorPlus = 0;			//电机转动脉冲数
	m_dMotorPps = 0.0;			//电机转动脉冲速率

	m_dMotorSpeed = 0.0;		//电机转速
	m_dMotorTangle = 0.0;		//电机转角
	m_dMotorAcc = 0.0;			//电机转速升速加速度
	m_dMotorDec = 0.0;			//电机转速降速加速度

	m_lMotorInitRealtangle = 0; //电机反馈脉冲计数初值
	m_lMotorRealtangle = 0;		//电机反馈脉冲数
	m_lMotorRealtanglenext = 0; //电机反馈脉冲数
	m_dMotorRealtangle = 0.0;	//电机反馈脉冲数
	////--------------初始化各变量--------------------------////
}

MotorCtrol::~MotorCtrol()
{
}

BEGIN_MESSAGE_MAP(MotorCtrol, CStatic)
	//{{AFX_MSG_MAP(MotorCtrol)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// MotorCtrol message handlers

//////////////////////////////////
//初始化运动控制卡
int MotorCtrol::initBoard()
{
	int Rtn;
	//////////////////
	//初始化板卡
	Rtn=auto_set();			//自动设置
	if(Rtn<=0 )
	{
		return MessageBox("检测不到卡!");
	}

	Rtn=init_board();		//初始化
	if(Rtn<0)
	{
		return MessageBox("初始化错误!");
	}
	return 0;
	//////////////////

}

//电机运动控制
void MotorCtrol::MotorRun()
{
	//获取减速器输出转速
	double rate;//转速比率
	if(m_dMotorSpeed>500)
		rate=190.66;
	else
		rate=190.40;
	m_dMotorPps = m_dMotorSpeed*rate;

	if (m_bMotorDebugflag)
	{
	}
	else
		m_dMotorAcc = 1.0/8;			//电机升速加速度
	//m_dMotorPps = m_dMotorSpeed*190.40;

	//获取减速器输出转角
	m_lMotorPlus = (long)(m_dMotorTangle*32.0*160);

	if (m_nMotorDirectTem == 0)
	{
		m_nMotorDirect = 1; //正转
	}
	else if(m_nMotorDirectTem == 1)
	{
		m_nMotorDirect = -1;	//反转
	}

	//获取电机反馈脉冲计数初值
	get_encoder(1,&m_lMotorInitRealtangle);

	//获取电机运动类型
	if (m_bMotorVmove == TRUE)	//连续运动
	{
		if (m_bMotorRtype)
		{
			//快速
			set_profile(1,0.0,m_dMotorPps,m_dMotorPps*m_dMotorAcc);
			fast_vmove(1,m_nMotorDirect);
		}
		else
		{
			//常速
			set_conspeed(1,m_dMotorPps);
			con_vmove(1,m_nMotorDirect);
		}		
	}
	else if(m_bMotorVmove == FALSE)	//点位运动
	{
		set_dir(1,m_nMotorDirect);
		if (m_bMotorRtype)
		{
			//快速
			set_profile(1,0.0,m_dMotorPps,m_dMotorPps*m_dMotorAcc);
			fast_pmove(1,m_lMotorPlus);
		}
		else
		{
			//常速
			set_conspeed(1,m_dMotorPps);
			con_pmove(1,m_nMotorDirect);
		}
	}	
		//电机运行标志为真
		m_bMotorRunflag = TRUE;
}

//电机停止运行
void MotorCtrol::MotorStop()
{
	m_dMotorDec = m_dMotorPps/8;			//电机转速降速加速度
	if (m_bMotorStype)
	{
		//缓停
		set_profile(1,0.0,m_dMotorPps,m_dMotorPps*m_dMotorDec);
		decel_stop(1);
	}
	else
	{
		//急停
		sudden_stop(1);
	}	
	//电机运行标志为假
	m_bMotorRunflag = FALSE;
}

//编码器反馈数值置零
void MotorCtrol::MotorReset()
{
	//编码器反馈数值置零
	m_dMotorRealtangle = 0.0;

}

//获取电机实际转角
double MotorCtrol::MotorRealtangle()
{
	//读取编码器数值	
	get_encoder(1,&m_lMotorRealtangle);				//第一次读	
	get_encoder(1,&m_lMotorRealtanglenext);			//第二次读
	//两次读数相差较大
	if (abs(m_lMotorRealtanglenext - m_lMotorRealtangle)>5)
	{
		m_dMotorRealtangle =(m_lMotorRealtanglenext-m_lMotorInitRealtangle)/7200.0;
	}

	return m_dMotorRealtangle;//反馈获取的角度值

}

//获取电机编码器数据
long MotorCtrol::MotorGetencoder()
{
	long encoderdata;
	get_encoder(1,&encoderdata);
	return encoderdata;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -