目录
一、凸轮设计函数文件
fun1:
fun2:
fun3:
fun4:
二、函数使用说明及注意事项
一、凸轮设计函数文件
fun1:
function [i,d,v,a]=fun1(x,y)
%% FUN1函数介绍
% 输入初末位置和推程/回程,用三四五次运动多项式计算这一段凸轮的各个点升距,
% 输出各点对应升/降距向量。
%-------------------------------------------------------------------------%
% 输入参数:
% x为1*2的向量,用来储存初末位置的推程(回程)角位置。
% y为1*2的向量,用来储存初末位置的总升距(降距)。
% 输出参数:
% i为分段数。
% d对应分段上的升距。
%% 参数初始化
if y(1)<y(2) %模式系数,1为推程,0为回程
m=1;
else
m=0;
end
f=abs(x(1)-x(2)); %推(回)程角
h=abs(y(1)-y(2)); %升(降)距离
derta=x(1); %x移动系数,左加右减
d=[]; %从动件位移向量
v=[]; %从动件速度向量
a=[]; %从动件加速度向量
%% 计算
for i=x(1):0.001:x(2)
if m==1 %推程的位移,速度,加速度
d=[d h*(10*((i-derta)/f).^3-15*((i-derta)/f).^4+6*((i-derta)/f).^5)+y(1)];
v=[v h/f*((30*((i-derta)/f).^2-60*((i-derta)/f).^3+30*((i-derta)/f).^4))];
a=[a h/(f.^2)*((60*((i-derta)/f)-180*((i-derta)/f).^2)+120*((i-derta)/f).^3)];
else %回程的位移,速度,加速度
d=[d h*(1-10*((i-derta)/f).^3+15*((i-derta)/f).^4-6*((i-derta)/f).^5)+y(2)];
v=[v -h/f*((30*((i-derta)/f).^2-60*((i-derta)/f).^3+30*((i-derta)/f).^4))];
a=[a -h/(f.^2)*((60*((i-derta)/f)-180*((i-derta)/f).^2)+120*((i-derta)/f).^3)];
end
end
i=x(1):0.001:x(2); %去掉最后一个点
[~ ,l]=size(i);
i(l)=[];
d(l)=[];
v(l)=[];
a(l)=[];
%% 绘图与输出
hold on; %保持命令
subplot(2,2,1);plot(i,d); %绘图
hold on;
subplot(2,2,2);plot(i,v);
hold on;
subplot(2,2,3);plot(i,a);
end
fun2:
function [i,d,v,a]=fun2(x,y)
%% FUN2函数介绍
% 输入一组x时序坐标,以及对应的y升/降距,
% 输出其对应的三四五次多项式位置坐标并绘图。
%-------------------------------------------------------------------------%
% 输入参数:
% x为输入各个分段位置的角度分界。
% y为对应各个分段的升/降距。
%% 参数初始化
[~,l]=size(x); %段位数
x=x./x(l)*2*pi; %更新x向量,化为角度型
i=[]; %储存的角度向量
d=[]; %储存的升/降距向量
v=[]; %储存的速度向量
a=[]; %储存的加速度向量
%% 分割图形区
hold on,subplot(2,2,1),axis normal,grid on,title('从动件位移曲线图'),xlabel('角度/rad'),ylabel('位移/mm');
hold on,subplot(2,2,2),axis normal,grid on,title('从动件速度曲线图(纵坐标乘以ω即得速度)'),xlabel('角度/rad'),ylabel('速度');
hold on,subplot(2,2,3),axis normal,grid on,title('从动件加速度曲线图(纵坐标乘以ω的平方即得加速度)'),xlabel('角度/rad'),ylabel('加速度');
%% 计算
for num=1:l-1
[i0,d0,v0,a0]=fun1([x(num) x(num+1)],[y(num) y(num+1)]);%计算临时向量i0,d0
i=[i i0];%储存角度向量
d=[d d0];%储存升/降距向量
v=[v v0];%储存速度向量
a=[a a0];%储存加速度向量
end
fun3:
%% FUN3函数介绍
% 输入基圆半径,偏心距,角度分界,对应分界的升/降距,
% 输出理论轮廓线坐标矩阵,基圆坐标矩阵,偏距圆坐标矩阵,并绘图。
%-------------------------------------------------------------------------%
% 输入参数:
% rb为基圆半径。
% e为偏距。
% x为输入时序分界。
% y为对应分界的升/降距。
%% 坐标导入
[i,s,~,~]=fun2(x,y);%i代表每个计算点的角度,s为各角度对应升距
%% 参数初始化
x0=[];%存储理论轮廓线的x坐标
y0=[];%存储理论轮廓线的y坐标
z0=[];%存储理论轮廓线的z坐标
x1=[];%储存基圆x坐标
y1=[];%储存基圆y坐标
x2=[];%储存偏距圆x坐标
y2=[];%储存偏距圆y坐标
z=[]; %储存基圆,偏距圆z坐标
s0=(rb^2-e^2)^0.5;%初始距离
[~,l]=size(i);%向量长度
%% 计算
%理论轮廓线坐标计算:
for k=1:l
x0=[x0 (s0+s(k))*sin(i(k))+e*cos(i(k))];
y0=[y0 (s0+s(k))*cos(i(k))-e*sin(i(k))];
z0=[z0 0];
end
%基圆坐标及偏距圆坐标计算:
for t=0:2*pi/360:2*pi
x1=[x1 rb*cos(t)];
y1=[y1 rb*sin(t)];
x2=[x2 e*cos(t)];
y2=[y2 e*sin(t)];
z=[z 0];
end
G0=[x0',y0',z0'];%理论轮廓线坐标矩阵
G1=[x1',y1',z'];%基圆坐标矩阵
G2=[x2',y2',z'];%偏距圆坐标矩阵
%% 绘图
hold on;
subplot(2,2,4),axis equal;
plot(x0,y0,'r');
hold on;
plot(x1,y1,'b');
hold on;
plot(x2,y2,'g');
title('滚子移动从动件盘型凸轮曲线图');
grid on;
legend('理论轮廓线','基圆','偏距圆');
text(0,rb,'ω↷');
fun4:
function [G0,G1]=fun4(rb,x,y)
%% 坐标导入
[i,s,v,~]=fun2(x,y);%i代表每个计算点的角度,s为各角度对应升距,v为速度
%% 参数初始化
x0=[];%存储实际轮廓线的x坐标
y0=[];%存储实际轮廓线的y坐标
z0=[];%存储实际轮廓线的z坐标
x1=[];%储存基圆的x坐标
y1=[];%储存基圆的y坐标
z1=[];%储存基圆的z坐标
[~,l]=size(i);%向量长度
%% 计算
%实际轮廓线坐标计算:
for k=1:l
x0=[x0 (rb+s(k))*sin(i(k))+v(k)*cos(i(k))];
y0=[y0 (rb+s(k))*cos(i(k))-v(k)*sin(i(k))];
z0=[z0 0];
end
%基圆坐标计算:
for t=0:2*pi/360:2*pi
x1=[x1 rb*cos(t)];
y1=[y1 rb*sin(t)];
z1=[z1 0];
end
G0=[x0',y0',z0'];%实际轮廓线坐标矩阵
G1=[x1',y1',z1'];%基圆坐标矩阵
%% 绘图
hold on;
subplot(2,2,4),axis equal;
plot(x0,y0,'r');
hold on;
plot(x1,y1,'b');
title('平底移动从动件盘型凸轮曲线图');
grid on;
legend('实际轮廓线','基圆');
text(0,110,'ω↷');
end
=========================================================================
二、函数使用说明及注意事项
2023.12.23更新:
看到很多小伙伴问我要源代码哈,其实上面这四个就是四个文件的源代码哈。大家使用的时候,把代码复制,按照函数文件的格式名命保存到一个文件夹下面,然后再matlab里面打开这个文件夹就可以进行调用啦。fun1主要使用多项式进行插值计算一段行程的升距坐标;fun2主要用来多次调用fun1,计算出整个凸轮行程的升距坐标;fun3和fun4主要是根据fun2升距坐标计算凸轮实际轮廓线的,不过fun3计算的是滚子凸轮,fun4计算的是平底凸轮。大家调用的时候要注意,计算的时候直接调用fun3或者fun4回传G0矩阵保存为txt文件就行,G0矩阵txt文件导入solidwoorks的时候注意将第一行数据复制到最后一行生成闭环曲线。设计的凸轮我默认顺时针转动,大家注意一下。
这个代码还有很多优化空间,比如说这个输出的G0矩阵太过庞大,导致SW进行插值计算的时候要很久,其实可以抽部分数据导入sw的,只是精度可能损失那么一点。不过这个代码也已经是很久前写的了,我现在太久没碰matlab,机械原理也几乎忘完了[捂脸哭]。一时半会儿也搞不太清这个逻辑,具体调用还行,但大的改动应该不能再指导哈。
但还是要强调一点:fun3,fun4调用了fun1,fun2,fun3用于设计滚子移动从动件盘形凸轮机构,fun4用于设计平底移动从动件盘型凸轮机构。
附上函数具体使用说明: