机电一体化 系统设计
实验报告
学 院 __________________ 专 业 __________________ 班 级 __________________ 学 号 __________________ 姓 名 __________________ 指导教师 _______________
.\\
2014年1月12日
实验一 机电一体化系统的组成
实验目的:以XY简易数控工作台为例,说明机电一体化系统的基本组成和各模块的特点。 实验设备:
台式PC机一台 标准XY工作台一套 运动控制卡一块 游标卡尺一把
实验内容:
XY简易数控工作台是一典型的机电一体化系统, 是许多数控加工设备和电子加工设备 的基本部件,XY数控工作台主要由运动控制卡、DC24V开关电源、步进电机及其驱动器、 XY向运动平台、光栅尺和霍尔限位开关组成,其之间的关系如图 1.1所示。
工作原理大致为: 运动控制卡接受 PC 机发出的位置和轨迹指令,进行规划处理(插 补运算),转化成步进电机驱动器可以接受的指令格式(速度脉冲和方向信号)发给驱动 器,由驱动器进行脉冲环行分配和功率放大从而驱动步进电机,步进电机经过联轴器、滚 动丝杠推动工作台按指定的速度和位移运动。
实验步骤:
(1) 在 XY 数控工作台系统中分别找到上述各个模块,并指出各模块在机电一体化系统
中实现哪一模块的功能。 ①
运动控制卡 :运动控制卡是 PCL、 CPCL、 PXL 等总线形成的板卡,通俗地讲我 们可以把它看成一个单片机,有自己的算法,可以通过 VC、 VB、 labview 、 BCB 等语言实现其功能,数控系统即通过运动控制卡来实 现对机床运动轨迹的控制。
.\\
② DC24V开关电源:对供电要求质量比较高的控制设备提供纯净、稳定、没有杂
波的直流电源
③ 步进电机及其驱动器:步进电机用于驱动数控工作台的 X、丫两个方向的移动;
步进电机通过驱动器细分,可减小步距角,从而提高步 进电机的精确率,实现脉冲分配和功率驱动放大,此外 还可以消除电机的低频振荡、提高电机的输出转矩。
④ XY向运动平台:分别传输X、丫两个方向的运动。
⑤ 光栅尺:光栅尺是一种位移传感器,是利用光栅的光学原理工作的测量反馈装
置。经常应用于数控机床的闭环伺服系统中,可用作直线位移或者角 位移的检测。
⑥ 霍尔限位开关:用于限制工作台的运动超出导轨的有效长度。
(2)
使用卡尺测量,计算其平均导程P= 10 ;观察其循环器,可知其循环方式为 内 循环 ;预紧方式是 (3)
螺纹调隙式
。
观察导轨截面,并查阅《机电一体化技术手册》,可知其属于GGA, GGB,GGC, GGF中哪类?
GGB 。其适用场合 机械加工中心、NC车床、搬运装置、 电火花加工机、木工机械、激光加工机、精密测试仪器、包装机械、食品机械、医 疗器械、工具磨床、平面磨床等 (4)
件手册》可知系统中的运动控制卡可实现
有 ___ 16_个数字量输入和 (5)
16 个数字量输出控制。
。
查阅《DMC3000硬四 轴的联动,并具
记录步进电机型号,网上查阅其详细技术参数,可知其属于(反应式,永磁式,混 合式) 混合 式步进电机,整步步距角为 1.8° ,额定工作电压 测量电机机座的长宽尺寸属于 输出扭距越
大。
57 2.6V
。
尺寸系列机型。一般来说尺寸系列越大,其
.\\
XY数控工作台系统的草图可见附录 1:
实验二XY简易数控工作台的电气连接
实验目的: 以数控系统中基本的电机运动控制和限位开关控制为例,了解基于运动控制卡 的
XY 简易数控工作台的电气连接。
实验设备:
台式 PC 机一台
标准 XY 工作台一套 运动控制卡一块
实验内容: 运动控制卡能够实现多轴联动最重要的原因是利用了控制卡上专用运动控制芯片提 供的硬件插补功能,这类专用运动控制芯片能够根据 PC 机给出的插补终点和插补速度等 参数,利用某些插补算法计算出各个轴的进给脉冲和进给方向,并将这两类信号输出到接 口板的某些固定端子上。
步进电机要想能够实现一个脉冲对应电机转过一个步距角,除了需要步进电机以外, 还需要一个步进电机驱动器为步进电机实现脉冲分配和功率驱动放大的功能。 实验步骤:
( 1) 参考电气主电路图,在控制箱内找到与 DC24V 电源相连的模块以及连接所用的端
子。
( 2) 依据控制电路图和《 DMC3000 硬件手册》,找到接口板与步进电机驱动器的控制信
号接线,并思考接口板和驱动器之间的电气接口原理。
( 3) 依据控制电路图和《 DMC3000 硬件手册》,找到限位开关和光栅尺电路。
.\\
实验结果:
通过实验,可得出平台控制电路图(见附录 2)
实验三 运动控制卡软件接口与简单的点位控制程序
实验目的:初步了解DMC300运动控制卡的软件接口形式
实验设备: 台式 PC 机一台 标准 XY 工作台一套 运动控制卡一块
实验内容: 运动控制卡接口板步进电机驱动器等模块间的电气连接保证了运动控制卡输出的运 动和控制信号的传输。但要实现工作台按照某些规律运动,除了上边所述的正确电气连接 外,还需要运动控制卡提供相应的软件接口 (Inteface)来接受PC机发出的运动控制命令。
DMC3000运动控制卡的软件接口是以动态连结库 (DLL )的形式提供的。所谓动态连接库, 在编程实现上可以理解成一个函数的集合,在这个库里包含有许多函数。 DMC3000 控制 卡的用户通过在软件程序中调用动态连接库中的某些函数,从而达到操作运动控制卡的目 的。
实现 DMC3000 卡控制工作台做某些直线插补运动。 (1) 运行Motion3000,在其界面下了解DMC3000支持的各种运动控制功能。利用其界面
操作完成绝对坐标和相对坐标下T形和S形的直线和圆弧插补运动。 (2) 在VB/VC开发环境下实现一条直线简单插补运动控制。 实验步骤及结果: 1 、步骤:
⑴ 打开 Visual C++ 6.0 ⑵ 新建一个工程
⑶ 选择 MFC APPWizard(exe) ⑷ 选择工程保存路径如 E:\\ ⑸ 输入工程名 , 如 test
⑹ 按确定键在应用程序类型中选择基本对话按确定键建立工程
⑺ 对对话框进行简单的修改增加按钮启动命名为 IDC_BUTTON_Start 和停止 ( 命名为 IDC_BUTTON_Stop。)
⑻ 在Motion3000安装目录下找到dmc3000.h和dmc3000.lib 文件拷贝到E:\est 目录 下 ⑼ 选择工程 -> 添加工程 -> 文件选中 dmc3000.lib 文件加入到工程中 ⑽ 开 test.cpp 文件在头部添加语句 #include dmc3000.h (11) 在CTestDlg::OnlnitDialog() 函数中添加代码 d3000_board_init();
(12)
在CtestDlg 中添加一个成员函数OnCancel,在OnCancel函数中添加代码
.\\
d3000_board_close(); CDialog::OnCancel();
双击启动按钮在按钮点击事件中输入代码 d3000_start_t_move(0,1000,400,1000,0.1,0.1);
(13)
双击停止按钮在按钮点击事件中输入代码 d3000_decel_stop(0,0.1);
编译运行按下启动按钮第0轴就会输出长度为1000的脉冲运动中可以按下 停止按钮便会减速停止脉冲输出。 2、完整程序结果:
#include \"stdafx.h\" #include \"hr.h\" #include \"hrDlg.h\" #include \"dmc3000.h\" #ifdef _DEBUG
#define new DEBUG_NEW #undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
(14)
///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog public:
{
CAboutDlg();
// Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA
// ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL
// Implementation protected: //{{AFX_MSG(CAboutDlg)
//}}AFX_MSG DECLARE_MESSAGE_MAP() };
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP
}
.\\
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CHrDlg dialog
CHrDlg::CHrDlg(CWnd* pParent /*=NULL*/) : CDialog(CHrDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CHrDlg)
// NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CHrDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CHrDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CHrDlg, CDialog) //{{AFX_MSG_MAP(CHrDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1_start, OnBUTTON1start)
ON_BN_CLICKED(IDC_BUTTON2_stop, OnBUTTON2stop) //}}AFX_MSG_MAP END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////// // CHrDlg message handlers BOOL CHrDlg::OnInitDialog() { d3000_board_init(); CDialog::OnInitDialog();
// Add \"About...\" menu item to system menu.
.\\
// IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
pSysMenu->AppendMenu(MF_SEPARATOR);
{
{
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CHrDlg::OnSysCommand(UINT nID, LPARAM lParam) if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
{
}
CAboutDlg dlgAbout; dlgAbout.DoModal(); else
{
CDialog::OnSysCommand(nID, lParam);
} }
// If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CHrDlg::OnPaint() if (IsIconic())
{
.\\
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon);
}
else
CDialog::OnPaint();
{ } }
// The system calls this to obtain the cursor to display while the user drags // the minimized window.
HCURSOR CHrDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CHrDlg::OnCancel() d
{
3000_board_close();
CDialog::OnCancel();
}
void CHrDlg::OnBUTTON1start()
{
short AxisArray[2]; AxisArray[0]=0; AxisArray[1]=1;
d3000_start_t_line2 (AxisArray, 1000, 0, 400, 1000, 0.1, 0); while (d3000_check_conti_buffer==0)
{} d3000_start_arc (AxisArray, 0, 500, 0, 1000, 1, 1000);
}
.\\
void CHrDlg::OnBUTTON2stop()
{
d3000_decel_stop(0,0.1); }
实验四连续插补运动控制的程序实现
实验目的:利用VB编写程序,控制DMC300卡完成两段连续插补轨迹运动。 实验设备:
台式PC机一台 标准XY工作台一套 运动控制卡一块
实验内容:
DMC300(动态连接库中给出的插补函数都是简单的直线或圆弧插补运动。但实际生产 中要求工作台能够完成连续轨迹运动,即完成了一段插补运动后能够平滑的进入下一段插 补运动。DMC300提供的运动状态函数和连续运动函数能够实现这一功能。
在VB开发环境下编写程序,实现如图4-1所示轨迹的连续运动。
实验步骤及结果: 1、步骤:
⑴打开 Visuai C++6.0 ⑵新建一个工程
⑶选择 MFC APPWizard(exe) ⑷选择工程保存路径,如E盘
⑸输入工程名,如sb
⑹按“确定”键,在应用程序类型中选择“基本对话”,按“确定”键,建立工程 ⑺双击窗口控件,在Ford_Load事件中添加代码
d3000_bord_i nit
选择Un Load事件,在Form_U nLoad事件中添加代码 d3000_bord_close
双击“启动”按钮,在CB_Start_Click事件中添加代码 short AxisArray[2]; AxisArray[0]=0; AxisArray[1]=1;
d3000_start_t_l ine2 (AxisArray,-1000, 0, 400, 1000, 0.1,0); while (d3000_check_co nti_buffer==0) { ---
}
d3000_start_arc (AxisArray, 0, 1000, 0, 2000, 0, 1000); while (d3000_check_co nti_buffer==1) { ---
.\\
} d3000_start_t_line2 (AxisArray, 0, 1000, 400, 1000, 0.1, 0.1);
双击“停止”按钮,在 CB_Stop_Click 事件中添加代码 d3000_decel_stop 0, 0.1
⑻运行,按下“启动”按钮,开始脉冲,按下“停止”按钮便会减速停止脉冲。 2、完整程序结果:
#include \"stdafx.h\" #include \"test01.h\" #include \"test01Dlg.h\" #ifdef _DEBUG
#define new DEBUG_NEW #undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
#include \"dmc3000.h\" ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog public:
} {
CAboutDlg();
// Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL
// Implementation protected:
//{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT
{ }
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////// // CTest01Dlg dialog CTest01Dlg::CTest01Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CTest01Dlg::IDD, pParent)
{ } {
//{{AFX_DATA_INIT(CTest01Dlg)
// NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTest01Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTest01Dlg)
// NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTest01Dlg, CDialog) //{{AFX_MSG_MAP(CTest01Dlg)
ON_WM_SYSCOMMAND() ON_WM_PAINT()
.\\
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_Start, OnBUTTONStart)
ON_BN_CLICKED(IDC_BUTTON_Stop, OnBUTTONStop) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTest01Dlg message handlers BOOL CTest01Dlg::OnInitDialog() { d3000_board_init();
CDialog::OnInitDialog();
// Add \"About...\" menu item to system menu.
// IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty())
pSysMenu->AppendMenu(MF_SEPARATOR);
{
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control
}
void CTest01Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout; dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CTest01Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect;
GetClientRect(&rect);
.\\
int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon
dc.DrawIcon(x, y, m_hIcon);
.\\
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags // the minimized window.
HCURSOR CTest01Dlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CTest01Dlg::OnCancel()
{
d3000_board_close(); CDialog::OnCancel();
}
void CTest01Dlg::OnBUTTONStart()
{
short AxisArray[2]; AxisArray[0]=0; AxisArray[1]=1;
d3000_start_t_line2 (AxisArray,-1000, 0, 400, 1000, 0.1, 0); while (d3000_check_conti_buffer==0)
{ }
d3000_start_arc (AxisArray, 0, 1000, 0, 2000, 0, 1000); while (d3000_check_conti_buffer==1)
{
}
d3000_start_t_line2 (AxisArray, 0, 1000, 400, 1000, 0.1, 0.1);
}
void CTest01Dlg::OnBUTTONStop()
{
d3000_decel_stop(0,0.1);
}
因篇幅问题不能全部显示,请点此查看更多更全内容