直动从动件盘型凸轮机构VC设计.docx
- 文档编号:6071749
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:22
- 大小:442.35KB
直动从动件盘型凸轮机构VC设计.docx
《直动从动件盘型凸轮机构VC设计.docx》由会员分享,可在线阅读,更多相关《直动从动件盘型凸轮机构VC设计.docx(22页珍藏版)》请在冰豆网上搜索。
直动从动件盘型凸轮机构VC设计
直动从动件盘型凸轮机
凸轮设计简介:
凸轮是一个具有曲线轮廓或凹槽的构件,一般为主动件,作等速回转运动或往复直线运动。
与凸轮轮廓接触,并传递动力和实现预定的运动规律的构件,一般做往复直线运动或摆动,称为从动件。
凸轮机构在应用中的基本特点在于能使从动件获得较复杂的运动规律。
因为从动件的运动规律取决于凸轮轮廓曲线,所以在应用时,只要根据从动件的运动规律来设计凸轮的轮廓曲线就可以了。
由凸轮的回转运动或往复运动推动从动件作规定往复移动或摆动的机构。
凸轮具有曲线轮廓或凹槽,有盘形凸轮、圆柱凸轮和移动凸轮等,其中圆柱凸轮的凹槽曲线是空间曲线,因而属于空间凸轮。
从动件与凸轮作点接触或线接触,有滚子从动件、平底从动件和尖端从动件等。
尖端从动件能与任意复杂的凸轮轮廓保持接触,可实现任意运动,但尖端容易磨损,适用于传力较小的低速机构中。
在带滚子的直动从动件盘形凸轮机构中,凸轮回转一周从动件依次作升-停-降-停4个动作。
从动件位移s(或行程高度h)与凸轮转角Φ(或时间t)的关系称为位移曲线。
从动件的行程h有推程和回程。
凸轮轮廓曲线决定于位移曲线的形状。
在某些机械中,位移曲线由工艺过程决定,但一般情况下只有行程和对应的凸轮转角根据工作需要决定,而曲线的形状则由设计者选定,可以有多种运动规律。
传统的凸轮运动规律有等速、等加速-等减速、余弦加速度和正弦加速度等。
等速运动规律因有速度突变,会产生强烈的刚性冲击,只适用于低速。
等加速-等减速和余弦加速度也有加速度突变,会引起柔性冲击,只适用于中、低速。
正弦加速度运动规律的加速度曲线是连续的,没有任何冲击,可用于高速。
曲线是凸轮机构设计的关键,常用的设计方法有解析法和图解法
以带滚子的对心直动从动件为例,用图解法时,在确定位移曲线sΦ、滚子中心初始位置和凸轮基圆半径r0后,凸轮廓线可由反转法得到,即使凸不动,找出滚子相对于凸轮的一系列位置,用光滑曲线连接各滚子中心B1、B2、B3……等点即得凸轮的理论廓线,再作这些滚子的包络线即得到凸轮的实际廓线。
选择滚子半径rr,应小于理论廓线的最小曲率半径,以免产生干涉。
用解析法时,同样先要确定从动件的位移变化规律s=s(Φ)、基圆半径r0和滚子半径rr,从而得到凸轮理论廓线的参数方程x=-rsiΦ,y=rcosΦ,式中r=r0+s。
凸轮实际廓线是一系列滚子圆组成的曲线族的包络线,曲线族的方程为f(x1,y1Φ)=(x1-x)2+(y1-y)2-r婄=0,所以联解f(x1,y1,Φ)=0可得曲线族的包络线,即实际廓线(见共轭曲线)。
基圆半径选得越小,压力角越大,设计所得的凸轮尺寸虽小,但对受力情况不利,严重的还会发生自锁现象,因此在空间允许的条件下应选取较大的基圆半径以改善凸轮的受力情况。
用计算机进行凸轮廓线设计能提高效率,并能从多方面综合考虑进行优化设计。
这样可用以求得各种运动规律下的从动件的位移、速度、加速度等值和凸轮廓线坐标值,算出凸轮廓线上任意点的曲率半径、压力角和应力,满足接触强度和抗磨的角度,以获得最小尺寸的凸轮,而且还可画出凸轮的空间图形。
解析法设计凸轮简介:
解析法设计凸轮用图解法设计凸轮的轮廓曲线,简便易行,但误差较大,所以对于精度要求较高的凸轮(如高速凸轮、靠模凸轮等),往往不能满足要求,这时就需用解析法进行设计。
用解析法设计凸轮轮廓线的实质是建立凸轮轮廓线的数学方程式。
已知偏距e,基圆半径r,从动件的运动规律s=s(δ),升-停-降-停4个动作角度分别为j1、j2、j3、j4,凸轮以等角速度沿逆时针方向回转,要求设计此凸轮的轮廓曲线。
设取凸轮回转中心O为极点,以起始向径OB0为极轴,则凸轮理论廓线上任一点B的向径ρ和极角θ可分别表示为
(1)
(2)
其中
为初始角度
为固定倾斜角
为反转转过的角度
式
(1)、
(2)即为该凸轮的理论廓线方程。
由此就可以得到凸轮轮廓线坐标值(VC6不支持极坐标画圆弧):
以及从动件顶端坐标值:
由从动件顶端坐标可以画出从动件的轮廓。
速度曲线和加速度曲线可以对s分别求一阶导和二阶导,得到曲线的y值,x值则均匀变化即可。
从而得到曲线坐标:
程序设计简介:
程序选用VC6.0实现,选则CDC来绘图。
程序中需要画凸轮的轮廓图,位置、速度、加速度曲线;还要出现凸轮的动画展示。
因此设计程序使用了MFC单文档程序,相应的文档用以绘制轮廓图,位置、速度、加速度曲线,而动画展示则在其中插入一个窗口来实现。
因为需要向程序输入一定的数据,因而建立一个输入窗口来实现输入。
单文档窗口如下:
输入窗口如下:
动画窗口如下:
程序代码实现简介(调试环境VC6.0):
核心代码如下:
CDrawingSetDialog类(输入数据类):
#include"stdafx.h"
#include"machine.h"
#include"DrawingSetDialog.h"
#include"Dynamic_pictureDialog.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
//CDrawingSetDialogdialog
CDrawingSetDialog:
:
CDrawingSetDialog(CWnd*pParent/*=NULL*/)
:
CDialog(CDrawingSetDialog:
:
IDD,pParent)
{
m_e=10.0f;//初始化
m_h=50.0f;
m_r=40.0f;
m_j1=90;
m_j2=90;
m_j3=90;
m_j4=90;
m_flag=0;
}
CDrawingSetDialog:
:
CDrawingSetDialog(intwho,CWnd*pParent/*=NULL*/)
:
CDialog(CDrawingSetDialog:
:
IDD,pParent)
{
whoflag=who;
m_e=10.0f;
m_h=50.0f;
m_r=40.0f;
m_j1=90;
m_j2=90;
m_j3=90;
m_j4=90;
m_flag=0;
}
voidCDrawingSetDialog:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDrawingSetDialog)
DDX_Text(pDX,IDC_E,m_e);
DDX_Text(pDX,IDC_H,m_h);
DDV_MinMaxFloat(pDX,m_h,0.f,1.e+023f);
DDX_Text(pDX,IDC_R,m_r);
DDV_MinMaxFloat(pDX,m_r,0.f,1.e+018f);
DDX_Text(pDX,IDC_J1,m_j1);
DDV_MinMaxInt(pDX,m_j1,0,360);
DDX_Text(pDX,IDC_J2,m_j2);
DDV_MinMaxInt(pDX,m_j2,0,360);
DDX_Text(pDX,IDC_J3,m_j3);
DDV_MinMaxInt(pDX,m_j3,0,360);
DDX_Text(pDX,IDC_J4,m_j4);
DDV_MinMaxInt(pDX,m_j4,0,360);
DDX_Radio(pDX,IDC_FLAG0,m_flag);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDrawingSetDialog,CDialog)
//{{AFX_MSG_MAP(CDrawingSetDialog)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//CDrawingSetDialogmessagehandlers
voidCDrawingSetDialog:
:
OnOK()
{
UpdateData(TRUE);
if(m_e>m_r)
AfxMessageBox("错误!
E>R");//错误提示
if(360!
=m_j1+m_j2+m_j3+m_j4)
AfxMessageBox("错误!
m_j1+m_j2+m_j3+m_j4!
=360");
if(1==whoflag)
{
CDynamic_pictureDialogdlg(m_r,m_e,m_h,m_j1,m_j2,m_j3,m_j4,m_flag);
dlg.DoModal();
}
CDialog:
:
OnOK();
}
CDynamic_pictureDialog类(实现动画):
#include"stdafx.h"
#include"machine.h"
#include"Dynamic_pictureDialog.h"
#include"math.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
//CDynamic_pictureDialogdialog
CDynamic_pictureDialog:
:
CDynamic_pictureDialog(CWnd*pParent/*=NULL*/)
:
CDialog(CDynamic_pictureDialog:
:
IDD,pParent)
{
m_r=100;//初始化
m_e=10;
m_h=50;
m_j1=90;
m_j2=90;
m_j3=90;
m_j4=90;
m=400;
n=250;
m_flag=0;
e0=0;
wflag=1;
}
CDynamic_pictureDialog:
:
CDynamic_pictureDialog(floatr,floate,floath,intj1,intj2,intj3,intj4,intflag,CWnd*pParent)
:
CDialog(CDynamic_pictureDialog:
:
IDD,pParent)
{
m_r=r;
m_e=e;
m_h=h;
m_j1=j1;
m_j2=j2;
m_j3=j3;
m_j4=j4;
m=350;
n=270;
m_flag=flag;
e0=0;
wflag=1;
}
voidCDynamic_pictureDialog:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDynamic_pictureDialog)
//NOTE:
theClassWizardwilladdDDXandDDVcallshere
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDynamic_pictureDialog,CDialog)
//{{AFX_MSG_MAP(CDynamic_pictureDialog)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_START,OnStart)
ON_BN_CLICKED(IDC_STOP,OnStop)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//CDynamic_pictureDialogmessagehandlers
voidCDynamic_pictureDialog:
:
panduan()
{
CDC*pDC=GetDC();//取得设备环境
CPenpen,*poldpen;
if(0==wflag)
{
pen.CreatePen(0,3,RGB(255,10,0));
poldpen=pDC->SelectObject(&pen);
huatu(pDC);//调用绘图
}
else
{
pen.CreatePen(0,3,RGB(192,192,192));
poldpen=pDC->SelectObject(&pen);
e0--;
huatu(pDC);//调用绘图
e0++;
}
pDC->SelectObject(poldpen);
pen.DeleteObject();
ReleaseDC(pDC);
}
voidCDynamic_pictureDialog:
:
huatu(CDC*pDC)
{
doublepi=3.141592653;//辅助变量
doubles,s0,s11,s12,s2,r;
doublex,y,e,y0=m_r*sin(e);
e=e0*pi/180+acos(m_e/m_r);
pDC->MoveTo(m+(int)m_r*cos(e),n-m_r*sin(e));//画凸轮轮廓线
for(intj=0;j<=360;j++)
{
if(j>=360-m_j4)
s0=s11=s12=s2=0;
elseif(j>=360-m_j4-m_j3)
{
s0=m_h-m_h*(j-180)/m_j3;
s11=m_h-m_h*(j-180)*(j-180)/(m_j3*m_j3);
s12=m_h*(j-m_j3-180)*(j-m_j3-180)/(m_j3*m_j3);
s2=m_h-0.5*m_h*(1-cos((double)pi*(j-180)/m_j3));
}
elseif(j>=360-m_j4-m_j3-m_j2)
s0=s11=s12=s2=m_h;
else
{
s0=m_h*j/m_j1;
s11=m_h*j*j/(m_j1*m_j1);
s12=m_h-m_h*(j-m_j1)*(j-m_j1)/(m_j1*m_j1);
s2=0.5*m_h*(1-cos((double)pi*j/m_j1));
}
if(0==m_flag)s=s0;
elseif(1==m_flag)s=s11;
elseif(2==m_flag)s=s12;
elses=s2;
r=sqrt(m_e*m_e+(sqrt(m_r*m_r-m_e*m_e)+s)*(sqrt(m_r*m_r-m_e*m_e)+s));
e=e0*pi/180+acos(m_e/m_r)+j*pi/180;
if(j==360-e0)
y0=s+sqrt(m_r*m_r-m_e*m_e);
x=m+r*cos(e);
y=n-r*sin(e);
pDC->LineTo((int)x,(int)y);
}
pDC->MoveTo(m+(int)m_e,n-(int)y0);//画从动件轮廓线
pDC->LineTo(m+(int)m_e-10,n-(int)y0-40);
pDC->LineTo(m+(int)m_e-10,n-(int)y0-100);
pDC->LineTo(m+(int)m_e+10,n-(int)y0-100);
pDC->LineTo(m+(int)m_e+10,n-(int)y0-40);
pDC->LineTo(m+(int)m_e,n-(int)y0);
}
voidCDynamic_pictureDialog:
:
OnTimer(UINTnIDEvent)
{
e0=e0+1;//旋转角度加一
if(360==e0)
e0=0;
wflag=1-wflag;//调整画笔
if(1==startstop)
panduan();
CDialog:
:
OnTimer(nIDEvent);
}
voidCDynamic_pictureDialog:
:
OnStart()
{
SetTimer(0,10,NULL);//建立计时器对应函数OnTimer
startstop=1;//开始与结束之间切换
}
voidCDynamic_pictureDialog:
:
OnStop()
{
startstop=0;
wflag=1;
e0=e0+1;
panduan();
}
CMachineView类(绘制轮廓线和各曲线):
#include"stdafx.h"
#include"stdafx.h"
#include"machine.h"
#include"machineDoc.h"
#include"machineView.h"
#include"math.h"
#include"DrawingSetDialog.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
//CMachineView
IMPLEMENT_DYNCREATE(CMachineView,CView)
BEGIN_MESSAGE_MAP(CMachineView,CView)
//{{AFX_MSG_MAP(CMachineView)
ON_COMMAND(IDM_DRAWIN_SET,OnDrawinSet)
ON_COMMAND(IDM_DYNAMIC_PICTURE,OnDynamicPicture)
//}}AFX_MSG_MAP
//Standardprintingcommands
ON_COMMAND(ID_FILE_PRINT,CView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,CView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView:
:
OnFilePrintPreview)
END_MESSAGE_MAP()
//CMachineViewconstruction/destruction
CMachineView:
:
CMachineView()
{
m_r=40;//初始化
m_e=10;
m_h=50;
m_j1=90;
m_j2=90;
m_j3=90;
m_j4=90;
m=200;
n=120;
flag=3;
}
CMachineView:
:
~CMachineView()
{
}
BOOLCMachineView:
:
PreCreateWindow(CREATESTRUCT&cs)
{
//TODO:
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
returnCView:
:
PreCreateWindow(cs);
}
//CMachineViewdrawing
voidCMachineView:
:
OnDraw(CDC*pDC)
{
CMachineDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//CMachineViewprinting
BOOLCMachineView:
:
OnPreparePrinting(CPrintInfo*pInfo)
{
//defaultpreparation
returnDoPreparePrinting(pInfo);
}
voidCMachineView:
:
OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
addextrainitializationbeforeprinting
}
voidCMachineView:
:
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
addcleanupafterprinting
}
//CMachineViewdiagnostics
#ifdef_DEBUG
voidCMachineView:
:
AssertValid()const
{
CView:
:
AssertValid();
}
voidCMachineView:
:
Dump(CDumpContext&dc)const
{
CView:
:
Dump(dc);
}
CMachineDoc*CMachineView:
:
GetDocument()//non-debugversionisinline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMachineDoc)));
return(CMachineDoc*)m_pDocument;
}
#endif//_DEBUG
//CMachineViewmessagehandlers
voidCMachineView:
:
OnDrawinSet()
{
CDrawingSetDialogdlg;//新建窗口并打开,方便输入数据
dlg.DoModal();
m_r=dlg.m_r;//读取输入的数据
m_e=dlg.m_e;
m_h=dlg.m_h;
m_j1=dlg.m_j1;
m_j2=dlg.m_j2;
m_j3=dlg.m_j3;
m_j4=dlg.m_j4;
flag=dlg.m_flag;
CDC*pDC=GetDC();//取得设备环境
CPenpen,*poldpen;
pen.CreatePen(0,1,240);
poldpen=pDC->SelectObject(&pen);
pDC->TextOut(m-(int)m_r*3,n+(int)m_r*1.5,"轮廓线");//画轮廓线坐标
pDC->MoveTo(m,n-(int)m_r*3);
pDC->LineTo(m,n+(int)m_r*3);
pDC->MoveTo(m-(int)m_r*3,n);
pDC->LineTo(m+(int)m_r*3,n);
intm0,n0,m1,n1,m2,n2,ss,vv,aa;
m0=m+(int)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 从动 件盘型 凸轮 机构 VC 设计