📄 motorctrol.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 + -