凸轮等速推程C语言编程,凸轮设计_C语言编程.doc
一、編程:
(注:程序中各個符號的含義)
PI:常數 s0:理論廓線的基圓半徑 s:各個角度的推桿位移 i:轉角
e:偏心距 rr:滾子半徑 r0:基圓半徑 h:行程
ya0:許用壓力角 yah:弧度制壓力角 yaj:角度制壓力角 p:曲率半徑
st:推程段推桿位移 sy:遠休段推桿位移 sh:回程段推桿位移 sj:近休段推桿位移
dx_di:理論坐標x對轉角i的一次導 dy_di:理論坐標y對轉角i的一次導
d2x:理論坐標x對轉角i的二次導 d2y:理論坐標y對轉角i的二次導
ds_di:推桿位移s對角度i的一次導 d2s:推桿位移s對轉角i的二次導
xli:理論坐標x yli:理論坐標y x:實際坐標想 y:實際坐標y
sink:凸輪廓線法向傾斜角θ正弦 cosk:凸輪廓線法向傾斜角θ余弦
子函數1:求x、y的實際坐標
子函數2:求轉角i處的曲率半徑
子函數3:求轉角i處的壓力角
#include "stdio.h"
#include "math.h"
#define PI 3.1415926
void zuobiao (float s0, float s,float ds_di,int i, int e,int rr); ;子函數1
float qulv (float s0, float s,float ds_di,float d2s,int i, int e,int rr,int r0); ;子函數2
float yalijiao (float s,float ds_di,int e,int r0); ;子函數3
main()
{
int e,rr,r0,h,i,ya0=30;
float s0,ds_di,d2s,st,sy,sh,sj,yah,yaj,p;
scanf("%d%d%d%d",&e,&rr,&r0,&h);
printf("e=%d,rr=%d,r0=%d,h=%d\n",e,rr,r0,h);
s0=sqrt(r0*r0-e*e);
for(i=0;i<=360;i++)
{
if(i<=120) ;推程
{
for(i=0;i<=120;i++)
{
st=50*(3*i*PI/180-sin(3*i*PI/180))/(2*PI);
ds_di=50*(3-3*cos(3*i*PI/180))/(2*PI);
d2s=50*9*sin(3*i*PI/180)/(2*PI);
yaj=yalijiao(st,ds_di,e,r0); ;調用子函數3,求壓力角
if(yaj=rr) ;if~else校核推程段曲率半徑
zuobiao(s0,st,ds_di,i,e,rr); ;調用子函數1,求xy坐標
else
printf("chongxinshuru r0,rr\n");
}
else
printf("chongxinshuru e,r0\n");
printf("%f,",p); ;輸出曲率半徑
printf("%f\n",yaj); ;輸出壓力角
}
}
else if(i<=150) ;遠休
{
for(i=121;i<=150;i++)
{
sy=50;
ds_di=0;
d2s=0;
yaj=yalijiao(sy,ds_di,e,r0); ;調用子函數3,求壓力角
p=qulv(s0,sy,ds_di,d2s,i,e,rr,r0); ;調用子函數2,求曲率半徑
if(p>=rr) ;if~else校核曲率半徑
zuobiao(s0,sy,ds_di,i,e,rr); ;調用子函數1,求xy坐標
else
printf("chongxinshuru r0,rr\n");
printf("%f,",p); ;輸出曲率半徑
printf("%f\n",yaj); ;輸出壓力角
}
}
else if(i<=210) ;回程
{
for(i=151;i<=210;i++)
{
sh=50*(1+cos(3*i*PI/180-5*PI/2))/2;
ds_di=-50*3*sin(3*i*PI/180-5*PI/2)/2;
d2s=-50*9*cos(3*i*PI/180-5*PI/2)/2;
yaj=yalijiao(sh,ds_di,e,r0); ;調用子函數3,求壓力角
p=qulv(s0,sh,ds_di,d2s,i,e,rr,r0); ;調用子函數2,求曲率半徑
if(p>rr) ;if~else校核曲率半徑
zuobiao(s0,sh,ds_di,i,e,rr); ;調用子函數1,求xy坐標
else
printf("chongxinshuru r0,rr\n");
printf("%f,",p); ;輸出曲率半徑
printf("%f\n",yaj); ;輸出壓力角
}
}
else ;近休
{
for(i=211;i<=360;i++)
{
sj=0;
ds_di=0;
d2s=0;
yaj=yalijiao(sj,ds_di,e,r0); ;調用子函數3,求壓力角
p=qulv(s0,sj,ds_di,d2s,i,e,rr,r0); ;調用子函數2,求曲率半徑
if(p>rr) ;if~else校核曲率半徑
zuobiao(s0,sj,ds_di,i,e,rr); ;調用子函數1,求xy坐標
else
printf("chongxinshuru r0,rr\n");
printf("%f,",p); ;輸出曲率半徑
printf("%f\n",yaj); ;輸出壓力角
}
}
}
}
void zuobiao (float s0, float s,float ds_di,int i, int e,int rr)
{
float dx_di, dy_di,xli,yli,x,y,sink,cosk;
xli=(s0+s)*sin(i*PI/180)+e*cos(i*PI/180); ;計算理論x坐標
yli=(s0+s)*cos(i*PI/180)-e*sin(i*PI/180); ;計算理論y坐標
dx_di=(ds_di-e)*sin(i*PI/180)+(s0+s)*cos(i*PI/180);
dy_di=(ds_di-e)*cos(i*PI/180)-(s0+s)*sin(i*PI/180);
sink=dx_di/sqrt(dx_di*dx_di+dy_di*dy_di);
cosk=-dy_di/sqrt(dx_di*dx_di+dy_di*dy_di);
x=xli-rr*cosk; ;計算實際x坐標
y=yli-rr*sink; ;計算實際y坐標
printf("%d:%f,%f,",i,x,y); ;輸出角度、xy實際坐標
return;
}
float qulv (float s0, float s,float ds_di,float d2s,int i, int e,int rr,int r0)
{
float dx_di,d2x,dy_di,d2y,p,q;
dx_di=(ds_di-e)*sin(i*PI/180)+(s0+s)*cos(i*PI/180);
dy_di=(ds_di-e)*cos(i*PI/180)-(s0+s)*sin(i*PI/180);
d2x=(d2s-s0-s)*sin(i*PI/180)+(2*ds_di-e)*cos(i*PI/180);
d2y=(d2s-s0-s)*cos(i*PI/180)-(2*ds_di-e)*sin(i*PI/180);
q=dx_di*dx_di+dy_di*dy_di;
p=sqrt(q*q*q)/fabs(dx_di*d2y-dy_di*d2x); ;計算曲率半徑
return p;
}
float yalijiao (float s,float ds_di,int e,int r0)
{
float yaj,yah;
yah=fabs(atan(((ds_di)-e)/(sqrt(r0*r0-e*e)+s))); ;計算弧度制壓力角
yaj=180*yah/PI; ;計算角度制壓力角
return yaj;
}
二、運行數據結果:
e=20,rr=10,r0=50,h=50
(注:每組數據依次是轉角i、坐標x、坐標y、曲率半徑p、壓力角yaj)
總結
以上是生活随笔為你收集整理的凸轮等速推程C语言编程,凸轮设计_C语言编程.doc的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目经理之成功项目经理手册
- 下一篇: 神朔 计算机联锁,神朔铁路2019年1月